SoundCloud Api 重定向混乱和音频 Api 流

SoundCloud Api redirect confusion and Audio Api Streams

我正在尝试向 SoundCloud API 发出请求。然后,当我收到响应时,我将 stream_url 设置为 < audio > 元素的来源。

这个有效:

http://matthiasdv.org/beta/

但并非总是如此...例如,当您搜索 'Bonobo' 时,您可以毫无问题地播放前几首曲目。但是当您尝试播放 'London Grammar - Hey Now (Bonobo remix)' - 第 7 个结果时 - 它不会播放。它不会抛出任何错误。

我一直在修改 Chrome 的 webdev-tools,在网络选项卡下我看到了正在发出的请求。我发现确实播放的曲目有一个简短的请求 Url,如下所示:

https://ec-media.sndcdn.com/vR5ukuOzyLbw.128.mp3?f10880d39085a94a0418a7ef69b03d522cd6dfee9399eeb9a522029f6bfab939b9ae57af14bba24e44e1542924c205ad28a52352010cd0e7dd461e9243ab54dc0f0bba897d

那些看起来不是这样的:

https://cf-media.sndcdn.com/8PCswwlkswOd.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLW1lZGlhLnNuZGNkbi5jb20vOFBDc3d3bGtzd09kLjEyOC5tcDMiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MzM0Mjc2MDN9fX1dfQ__&Signature=cD-XVhnvQnIATkfrBDDVy0Q7996C8DymwxRLwBBduab0~L0MynF1ftcMky~21T8Q-gCZ2~dMK8dz7uVxvJTIJgXPxEZvhNtbvescMK6iFMg-xSAty-4OhJYjrIZJ2j8NE4uNA4Ml7MWbWcQw4KtUtpZitOQuguS3DPFDII3VF-dvzb2L~xG-G8Uu3uOnI1WhnAAfhf1QWMO7swwB89HtcCiuVBmfluG28ELrJEq-au8mqIMB3sLTno6nUuTtpHXR2ayXBsYcYLLJVXa3Ul8p1rhLS5XWHKWXY8xug4jwey27~C5PVAomK6Z5lJx-mz-0zYs4riUYtl0zACbZ1OfwTQ__&Key-Pair-Id=APKAJAGZ7VMH2PFPW6UQ

现在乍一看我认为这是一个编码问题,但是在 ajax url 周围包装一个快速的 encodeURI() 并没有奏效。

而且我不明白这些url是从哪里来的。在我的代码中,我将 ajax 请求指向,例如:

https://api.soundcloud.com/tracks/140326936/stream?client_id=5c6ceaa17461a1c79d503b345a26a54e

因此,GET 请求中的请求 url(在 Chrome 的 webdev 工具中的 'network' 下找到)对我来说毫无意义。 SoundCloud 是否将获取请求重定向到 CDN 主机?我注意到的另一件事是每次触发两个请求而不是一个。第一个始终被取消并包含 'Provisional headers are shown' 警告。我相信这是因为我设置了 crossOrigin = "anonymous",否则某些浏览器将不会加载内容。

我猜可能会导致问题的是,当 url 被设置为元素的 src 属性时,在 dancer.js 库中触发 evenListener,它处理音频 Api 和回放 (https://github.com/jsantell/dancer.js/)。可能是库中某处需要 encodeURI()。

我决定无论如何都要问这个问题,因为我不明白上面的请求 Url 是如何形成的,为什么会触发两个而不是一个请求,以及为什么总是取消第一个请求。

我解决播放问题的任何提示也非常受欢迎...

当您运行请求

 https://api.soundcloud.com/tracks/140326936/stream?client_id=5c6ceaa17461a1c79d503b345a26a54e

您从服务器收到 HTTP 302 Found 响应,这是一个 URL 重定向 (http://en.wikipedia.org/wiki/HTTP_302)。这将导致您的浏览器从服务器 returns 的新 URL 加载,因此您会看到两个请求。服务器基本上说 "yeah, I know where to find that file, ask that guy over there"。

我认为一个有效而另一个无效的原因是 https://ec-media.sndcdn.com has the Access-Control headers set while https://cf-media.sndcdn.com 无效。这是服务器配置的问题,不幸的是,您无法从客户端控制任何内容。不知道这是否是 soundcloud 的故意举动,或者您是否可以向他们询问。