2015-12-28 88 views
1

我試圖用他們的網站上提供的youtubeinmp3 api下載YouTube視頻,但問題是當我試圖轉換一首不在其庫中的歌曲時(意味着它之前未被轉換),該網站將開始將該歌曲轉換爲.mp3格式。Java - HttpUrlConnection等待下載完成

現在我的HTTPUrlConnection正在發生的事情是,如果下載鏈接已經在網站上,因爲它已經被緩存,所以它運行完美,但如果網站必須執行轉換,它不會等待轉換 - 意味着我只是得到一個錯誤。

這是目前我有:

 URL link = new URL("http://YouTubeInMP3.com/fetch/?video=http://www.youtube.com/watch?v=JbjtL7P9eI0&autostart=1"); 

     InputStream in = new BufferedInputStream(link.openStream()); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     byte[] buf = new byte[1024]; 
     int n = 0; 
     HttpURLConnection httpConnection = (HttpURLConnection) (new URL("http://YouTubeInMP3.com/fetch/?video=http://www.youtube.com/watch?v=JbjtL7P9eI0&autostart=1").openConnection()); 
     System.out.println(HttpURLConnection.HTTP_OK); 
     long completeFileSize = httpConnection.getContentLength(); 
     long downloadedFileSize = 0; 
     //int currentProgress = 0; 
     while (-1!=(n=in.read(buf))) 
     { 
      out.write(buf, 0, n); 
      downloadedFileSize += n; 
      final int currentProgress= (int) (downloadedFileSize * 100/completeFileSize); 
      System.out.println("current progress: "+currentProgress); 

     } 
     System.out.println("Finished"); 
     out.close(); 
     in.close(); 
     byte[] response = out.toByteArray(); 

     FileOutputStream fos = new FileOutputStream("/Users/stephen/Desktop/test.mp3"); 
     fos.write(response); 
     fos.close(); 

我當時的想法是找到一種方法來阻止我的程序的執行或使其在一個while循環運行,只要該網站還沒有完成加載。有沒有辦法做到這一點?

+0

分享錯誤請 – Jan

+0

好輸出文件將是空白的,如果我檢查'completeFileSize',它返回'-1'如果文件必須是轉換 – QQPrinti

回答

0

您打開連接兩次 - 一次爲獲取流,一次爲內容長度。如果你必須做到這一點,你應該接受-1作爲正確的價值含義:還不知道。

在這種情況下,只跳過shpwing進度百分比,直到完成下載。

我建議只使用1 HttpURLConnection的 - 而不是兩個

+0

這應該不是太大的問題來解決,但我的問題主要是因爲該網站沒有下載鏈接時,我打開連接讀取,我的程序無法獲得視頻 – QQPrinti

+0

噢好吧。因此,循環20次,同時-1 == getContebtLength並在循環中休眠5秒? – Jan