如何在流式传输轨道时处理SoundCloud的JavaScript API 404错误

时间:2014-02-14 14:46:00

标签: javascript soundcloud

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

我发现了一些关于该主题的其他问题(请参阅“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/

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

3 个答案:

答案 0 :(得分:3)

遇到类似的事情。不确定它是否已连接但是看起来有些曲目只能使用闪存进行流式传输,因此GET方法声明它们是可流式的,但如果闪存不可用,则流可能会失败。

解决这个问题的一种方法是使用onload&amp ;;检查SoundManager何时加载了音轨。 readyState,(来自文档: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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

基于roj的答案,我使用了一些这样的代码来首先处理SC轨道流上的404s:

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

            },