2014-02-14 17 views
2

我讀到試圖流即使「流化」屬性設置爲true的軌道返回404錯誤此的SoundCloud的API錯誤處理的SoundCloud的的JavaScript API 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/

我讀到有人找到了一個解決辦法,但沒有解釋。有沒有人有任何想法如何解決它?

+0

是否仍然返回404如果你使用這個JS API? 'http:// connect.soundcloud.com/sdk-2.0.0.js' – Marco

+0

我想我必須重寫我的代碼才能使它工作,如果我只是替換腳本(現在我加載'http:// connect。 soundcloud.com/sdk.js')應用程序凍結,沒有任何錯誤。我會嘗試,謝謝。 – simonelippolis

回答

3

碰到類似的東西。不知道是否已連接,但它似乎有些軌道只用閃光燈流式傳輸,因此GET方法規定他們可流,但如果無法使用閃光燈流可能會失敗。繞過它

一種方式是檢查時SoundManager類加載使用onload & 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爲失敗的曲目我來跨越嘗試一些注意事項。

+0

謝謝,我會盡力讓你知道! S. – simonelippolis

+0

它的工作原理,謝謝! – simonelippolis

0

對於很多歌曲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鍵值對存在

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

,那麼該軌道具有可訪問的HTTP資源並且可以流式傳輸。

更多資訊 - https://github.com/francismakes/i1-soundcloud

+0

謝謝,這真的很有幫助,我會看看它。 – simonelippolis

0

大廈關閉ROJ的回答,我用了一個有點像這樣的代碼,以先進入的SC軌道流處理404:

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

      },