2013-10-14 33 views
-1

我試圖做一個應用程序,可以通過youtube url下載mp3文件。404與youtube-mp3.org api

我做的youtube-mp3.org API的一些研究,這是我的思維方式,應該做到:

  1. 獲取http://www.youtube-mp3.org/api/pushItem/?item=http://www.youtube.com/watch?v=xo9EV3A4oaA&xy=yx
  2. 第1步返回的ID,您必須使用在以下請求:"http://www.youtube-mp3.org/api/itemInfo/?video_id=" + ID
  3. 步驟2返回另一個代碼,你必須在該請求中的使用方法:"http://www.youtube-mp3.org/get?video_id=xo9EV3A4oaA&h=" + <code from step 2>
  4. 步驟3 retruns的MP3。

不幸的是,我的代碼已經失敗,在步驟1:我得到一個404,頁面未找到。

這裏是我的代碼(僅適用於第1步):

private DefaultHttpClient createHttpClient() { 
    HttpParams my_httpParams = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000); 
    HttpConnectionParams.setSoTimeout(my_httpParams, 15000); 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry); 
    DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams); 
    return httpclient; 
} 

private class DownloadVid extends AsyncTask<Void, Void, Void> { 

    int mStatusCode = 0; 
    String content = ""; 

    @Override 
    protected Void doInBackground(Void... args) { 

     String url = "http://www.youtube-mp3.org/api/pushItem/?item=http://www.youtube.com/watch?v=xo9EV3A4oaA&xy=yx"; 

     DefaultHttpClient httpclient = createHttpClient(); 
     HttpGet httpget = new HttpGet(url); 
     httpget.addHeader("Accept-Location", "*"); 

     try { 
      HttpResponse response = httpclient.execute(httpget); 
      StatusLine statusLine = response.getStatusLine(); 
      mStatusCode = statusLine.getStatusCode(); 

      if (mStatusCode == 200){ 
       content = EntityUtils.toString(response.getEntity()); 
      } 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
      mStatusCode = 0; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      mStatusCode = 0; 
     } catch (IllegalStateException e){ 
      e.printStackTrace(); 
      mStatusCode = 0; 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void arg) { 

     mProgressDialog.dismiss(); 

     Toast.makeText(MainActivity.this, "Result=" + content + " StatusCode=" + mStatusCode, Toast.LENGTH_LONG).show(); 
    } 
} 

我不知道爲什麼它不工作。有任何想法嗎?

+0

你有沒有嘗試過手動這些步驟,以'curl'或'wget'或類似的? –

+0

@MarkkuK。我不知道那是什麼。你能解釋一下嗎? – Xander

+0

您必須對item =參數進行網址編碼。 –

回答

1

編碼項參數,就像這樣:

String item = URLEncoder.encode("http://www.youtube.com/watch?v=xo9EV3A4oaA", "utf-8"); 
String url = "http://www.youtube-mp3.org/a/pushItem/?item="+item+"&xy=yx"; 

或者這樣:

Uri uri = new Uri.Builder() 
    .scheme("http") 
    .authority("www.youtube-mp3.org") 
    .path("https://stackoverflow.com/a/pushItem/") 
    .appendQueryParameter("item", "http://www.youtube.com/watch?v=xo9EV3A4oaA") 
    .appendQueryParameter("xy", "yx") 
    .build(); 
+0

我嘗試了你的第一個解決方案,但也遇到了同樣的問題。 – Xander

+0

現在我試着你的第二個解決方案,但'新的HttpGet(uri)',給了我'HttpGet(Uri)是未定義的' – Xander

+0

我試過這個URL:'http://www.youtube-mp3.org/api/pushItem /?item = http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dxo9EV3A4oaA&xy = yx' and this url:'http://www.youtube-mp3.org/api/pushItem/?item= HTTP://www.youtube.com/watch v = xo9EV3A4oaA與XY = yx'。兩者都不起作用,不在android上,也不在我的桌面瀏覽器中。 – Xander