2014-04-02 91 views
1

我寫一個小程序,應該從SoundCloud .. 我的碼流的歌曲從SoundCloud一首歌:流使用Python API

import soundcloud 

cid="===" 
cs="===" 

un="===" 
pw="===" 

client = soundcloud.Client(
    client_id=cid, 
    client_secret=cs, 
    username=un, 
    password=pw 
) 
print "Your username is " + client.get('/me').username 

# fetch track to stream 
track = client.get('/tracks/293') 

# get the tracks streaming URL 
stream_url = client.get(track.stream_url, allow_redirects=False) 

# print the tracks stream URL 
print stream_url.location 

它只是打印usernsame,和軌道URL 它打印這樣的東西:

Your username is '===' 
https://ec-media.soundcloud.com/cWHNerOLlkUq.128.mp3?f8f78g6njdj..... 

然後,我想從URL播放MP3。我可以使用urllib下載它,但如果它是一個大文件,它會花費很多時間。

什麼是流的MP3的最佳方式是什麼? 謝謝!

回答

1

使用該解決方案,我建議在此之前,你應該知道的事實,你必須在用戶將看到它的SoundCloud通過提供音頻播放器的地方在你的應用和可能的SoundCloud信用。做相反將是不公平的,可能違反了他們的使用條款。

track.stream_url不與MP3文件相關聯的終點URL。 所有相關的音頻僅「按需」服務,當您發送與track.stream_url http請求。在發送HTTP請求,你將被重定向到實際的mp3流(這是隻爲你創建的,並會在接下來的15分鐘過期)。

所以,如果你想點聲源,你應該先得到REDIRECT_URL的流:

下面是C#代碼,做什麼我說的,它會給你的主要的想法 - 只是轉換它以Python代碼;

public void Run() 
     { 
      if (!string.IsNullOrEmpty(track.stream_url)) 
      { 
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(track.stream_url + ".json?client_id=YOUR_CLIENT_ID"); 
       request.Method = "HEAD"; 
       request.AllowReadStreamBuffering = true; 
       request.AllowAutoRedirect = true; 
       request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request); 
      } 
     } 

     private void ReadWebRequestCallback(IAsyncResult callbackResult) 
     { 
      HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState; 
      HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult); 


      using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream())) 
      { 
       this.AudioStreamEndPointUrl = myResponse.ResponseUri.AbsoluteUri; 
       this.SearchCompleted(this); 
      } 
      myResponse.Close(); 

     }