【问题标题】:How to handle SoundCloud's JavaScript API 404 error while streaming a track如何在流式传输轨道时处理 SoundCloud 的 JavaScript API 404 错误
【发布时间】:2015-12-14 14:25:52
【问题描述】:

我读到了这个 SoundCloud 的 API 错误,它在尝试流式传输曲目时返回 404 错误,即使“streamable”属性设置为 true。

我发现了有关该主题的其他一些问题(请参阅“Tracks for “The Hives” are not streaming via the api”或“Soundcloud API SC.stream (track not loading)”),但我想知道如何检测错误以及如何解决它。我尝试了一些try {} catch() {},但似乎无法检测到问题。

以下是一些背景信息:

我有一个 php 返回一个 JSON 数组,其中包含要播放的曲目列表。我的脚本一个接一个地读取数组,然后尝试播放当前的数组。一切正常,但是当返回 404 error 时,脚本结束,不会跳转到下一个曲目。好像我无法检测到这种问题。

这是管理流的 JavaScript 方法:

playTrack = function() {
        // console.log('playTrack');
        SC.get(
            "/tracks/" + playlist[ now_playing ].sndc_id,
            function(track, error) {
                if (error) { 
                    sendErrorReport(playlist[ now_playing ].id);
                    loadNext();
                } else {
                    try {
                        SC.stream(
                            "/tracks/" + playlist[ now_playing ].sndc_id,
                            function(sound, error) {
                                sound_object = sound;
                                if (error || !sound_object) {
                                    sendErrorReport(playlist[ now_playing ].id);
                                    loadNext();
                                } else {
                                    sound_object.play(
                                        {
                                            'from': parseInt(current_position),
                                            'onfinish': function() {
                                                current_position = 0;
                                                updateCounter();
                                                $('#radio-waveform-position').css( { 'opacity': '0', 'width' : '0%' } );
                                                loadNext();
                                            },
                                            'onplay': function() {
                                                $('#radio-like').removeClass('liked');
                                                playing = true;
                                                updateInfo();
                                            },
                                            'whileplaying': function() {
                                                current_position = this.position;
                                                $('#radio-waveform-position').css( { 'opacity': '1', 'width' : (100 * current_position / this.duration).toFixed(3) + '%'  } );
                                            },
                                            'ondataerror': function() {
                                                sendErrorReport(playlist[ now_playing ].id);
                                                loadNext();
                                            }
                                        }
                                    );
                                    if ($('html').hasClass('touch') || !autoplay) $('#radio-play-pause').click();
                                }
                            }
                        );
                    } catch (err) {
                        sendErrorReport(playlist[ now_playing ].id);
                        loadNext();
                    }
                }
            }
        );
    }

对于这种“故障”轨道,SC.getSC.stream“错误”返回参数似乎始终为空。如您所见,我尝试将所有内容包装在 try() {} catch() {} 中,但没有成功。另外,sound_object.play()ondataerror 方法被完全忽略。

可以在此处看到正在运行的脚本:http://foggetabout.it/

我读到有人找到了解决方法,但没有解释。有人知道如何解决吗?

【问题讨论】:

  • 如果你使用这个 JS api,它仍然返回 404 吗? http://connect.soundcloud.com/sdk-2.0.0.js
  • 我想我必须重写我的代码才能让它工作,如果我只是替换脚本(现在我加载http://connect.soundcloud.com/sdk.js)应用程序会冻结而没有任何错误。我试试,谢谢。

标签: javascript soundcloud


【解决方案1】:

遇到类似的事情。不确定它是否已连接,但似乎某些曲目只能通过 flash 进行流式传输,因此 GET 方法声明它们是可流式传输的,但如果 flash 不可用,则流式传输可能会失败。

解决它的一种方法是检查 SoundManager 何时使用 onloadreadyState 加载轨道,其中(来自文档:http://www.schillmania.com/projects/soundmanager2/doc/)有 4 种状态:

  • 0 = 未初始化
  • 1 = 正在加载
  • 2 = 失败/错误
  • 3 = 加载/成功

所以:

sound_object.play({
    // Exisiting…
    onload: function() {
      if (this.readyState == 2) {
        // Handle error
      }
    });

当状态改变时有一些警告,所以如果这成为一个问题,你也可以尝试使用durationEstimate,因为它会为我遇到的失败轨道返回null

【讨论】:

  • 谢谢,我会尽力告诉你的! S.
【解决方案2】:

对于很多歌曲,streamable 设置为 true,并且定义了其 stream_url,但资源本身并不存在。

使用curl,使用所需的track_id 和注册的API_KEY 访问i1 端点是检查SoundCloud 托管轨道上实际资源的第一步。 (警告:i1 端点未在 SoundCloud 的 HTTP API 参考中正式记录)

curl https://api.soundcloud.com/i1/tracks/{{track_id}}/streams?client_id={{API_KEY}}

这将返回一个类似于以下内容的 JSON 对象:

{
    "http_mp3_128_url": "{some_url}",
    "preview_mp3_128_url": "{some_url}"
}

如果存在 http_mp3_128_url 键值对,则该轨道具有可访问的 HTTP 资源并且可以流式传输。

更多信息在这里 - https://github.com/francismakes/i1-soundcloud

【讨论】:

  • 谢谢,这真的很有帮助,我去看看。
【解决方案3】:

根据 roj 的回答,我使用了一些类似这样的代码来首先处理 SC 轨道流上的 404:

sound.play({
            onload: function () {
              if (this.readyState === 2){
                alert('error');
              }

            },

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多