问题
I'm trying to make program that can download youtube videos as mp3 files. I used this site youtube-mp3.org in order to achive that. So, i downloaded content of www.youtube-mp3.org/?c#v=sTbd2e2EyTk where sTbd2e2EyTk is video id, now i have to get link to mp3 file(in this case http://www.youtube-mp3.org/get?video_id.....) but there is no link in downloaded content. I noticed that chrome developers tools(ctrl+shift+j, tab Elements) show that link and view source(ctrl+u) option in chrome gives me the same result which i get by downloading page using java. How can i get that link? I tried to fetch data using JSoap but those data that i need are not loaded on page immediately so i cannot get them.
Next code is for downloading content of web page...
URL tU = new URL("http://www.youtube-mp3.org/?c#v=sTbd2e2EyTk");
HttpURLConnection conn = (HttpURLConnection) tU.openConnection();
InputStream ins = conn.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(ins));
String line;
StringBuffer content = new StringBuffer();
while ((line = rd.readLine()) != null) {
content.append(line);
}
System.out.println(content.toString());
I used this method for getting file but i need link..
private static void downloadStreamData(String url, String fileName) throws Exception {
URL tU = new URL(url);
HttpURLConnection conn = (HttpURLConnection) tU.openConnection();
String type = conn.getContentType();
InputStream ins = conn.getInputStream();
FileOutputStream fout = new FileOutputStream(new File(fileName));
byte[] outputByte = new byte[4096];
int bytesRead;
int length = conn.getContentLength();
int read = 0;
while ((bytesRead = ins.read(outputByte, 0, 4096)) != -1) {
read += bytesRead;
System.out.println(read + " out of " + length);
fout.write(outputByte, 0, bytesRead);
}
fout.flush();
fout.close();
}
回答1:
Found this
package main.java.com.thezujev.theyoutubepld.logic;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.params.SyncBasicHttpParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @author azujev
*
*/
public class YouTubeMP3 {
public static String[] getLink(String url) throws ClientProtocolException, IOException {
boolean passCode = false;
String h = "";
String title = "";
String result = "";
String[] returnVal = {"",""};
Map<String, String> jsonTable;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpInitialGet = new HttpGet("http://www.youtube-mp3.org/api/pushItem/?item=http%3A//www.youtube.com/watch%3Fv%3D" + url + "&xy=_");
httpInitialGet.addHeader("Accept-Location", "*");
httpInitialGet.addHeader("Referrer", "http://www.youtube-mp3.org");
HttpParams params = new SyncBasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setUserAgent(params, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1");
httpInitialGet.setParams(params);
HttpResponse firstResponse = httpClient.execute(httpInitialGet);
try {
if (firstResponse.getStatusLine().toString().contains("200")) {
passCode = true;
}
} finally {
httpInitialGet.releaseConnection();
}
if (passCode) {
while (true) {
HttpGet httpStatusGet = new HttpGet("http://www.youtube-mp3.org/api/itemInfo/?video_id=" + url + "&adloc=");
httpStatusGet.addHeader("Accept-Location", "*");
httpStatusGet.addHeader("Referrer", "http://www.youtube-mp3.org");
httpStatusGet.setParams(params);
HttpResponse secondResponse = httpClient.execute(httpStatusGet);
HttpEntity secondEntity = secondResponse.getEntity();
InputStream is = secondEntity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
httpStatusGet.releaseConnection();
result = result.replaceAll("\\}.*", "}");
result = result.replaceAll(".*?\\{", "{");
try {
JSONObject jsonData = new JSONObject(result);
JSONArray jsonArray = jsonData.names();
JSONArray valArray = jsonData.toJSONArray(jsonArray);
jsonTable = new HashMap<String, String>(jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++) {
jsonTable.put(jsonArray.get(i).toString(), valArray.get(i).toString());
}
if (jsonTable.get("status").equals("serving")) {
h = jsonTable.get("h");
title = jsonTable.get("title");
break;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
returnVal[0] = "http://www.youtube-mp3.org/get?video_id=" + url + "&h=" + h;
returnVal[1] = title;
return returnVal;
} else {
//TODO: Error, vid not downloadable
}
return null;
}
}
回答2:
An answer on a similar question:
Regarding the Terms of Service of the YouTube API
https://developers.google.com/youtube/terms/developer-policies
YOU CAN'T :
separate, isolate, or modify the audio or video components of any YouTube audiovisual content made available through the YouTube API;
promote separately the audio or video components of any YouTube audiovisual content made available through the YouTube API;
(Source: https://stackoverflow.com/a/26552805/5645656)
My answer:
It is possible using a different service. Consider the code below, which uses www.320youtube.com. The method youtubeToMP3
will return an MP3 file of the video's sound as a byte array:
private static final Pattern VID_ID_PATTERN = Pattern.compile("(?<=v\\=|youtu\\.be\\/)\\w+"),
MP3_URL_PATTERN = Pattern
.compile("(?<=href=\\\")https{0,1}\\:\\/\\/(\\w|\\d){3}\\.ytapivmp3\\.com.+\\.mp3(?=\\\")");
public static byte[] youtubeToMP3(String youtubeUrl) throws IOException {
String id = getID(youtubeUrl);
String converter = loadConverter(id);
String mp3url = getMP3URL(converter);
byte[] mp3 = load(mp3url);
return mp3;
}
private static byte[] load(String url) throws IOException {
URL url2 = new URL(url);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = url2.openStream();
byte[] byteChunk = new byte[2500];
int n;
while ((n = is.read(byteChunk)) > 0) {
baos.write(byteChunk, 0, n);
}
is.close();
baos.flush();
baos.close();
return baos.toByteArray();
}
private static String getMP3URL(String html) {
Matcher m = MP3_URL_PATTERN.matcher(html);
m.find();
return m.group();
}
private static String loadConverter(String id) throws IOException {
String url = "https://www.320youtube.com/watch?v=" + id;
byte[] bytes = load(url);
return new String(bytes);
}
private static String getID(String youtubeUrl) {
Matcher m = VID_ID_PATTERN.matcher(youtubeUrl);
if (!m.find()) {
throw new IllegalArgumentException("Invalid YouTube URL.");
}
return m.group();
}
回答3:
I've done this using youtube-mp3.org. You can take a look of my code here : YoutubeMp3
All you have to do is the following :
DownloadManager d = new DownloadManager();
d.download(YoutubeMp3.builder("http://www.youtube.com/watch?v=ebcrEqm5FFg"), "C:\\Users\\loikkk\\Music\\testDownload");
d.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(long totalFileSize) {
// TODO Auto-generated method stub
}
@Override
public void onDownloadProcess(long currentFileSize, long totalFileSize) {
// TODO Auto-generated method stub
}
@Override
public void onDownloadFinished() {
// TODO Auto-generated method stub
}
@Override
public void onDownloadError(int arg0) {
// TODO Auto-generated method stub
}
});
Hope it helps,
@hanry and Josh M :
I've deleted my account on Github. However if you are using Google Chrome you can use the developer console in network perspective. So You can reverse engineered the download link it's how I've done that.
- Submit my Youtube URL to Youtube-mp-3.org
- Inspect the response from the webservice
- Build the donwload link myself following the pattern They are using.
Example :
Youtube url : http://www.youtube.com/watch?v=KMU0tzLwhbE ;
Request to webservice in the content body: KMU0tzLwhbE
Response from webservice : info = { "title" : "Developers", "image" : "http://i.ytimg.com/vi/KMU0tzLwhbE/default.jpg", "length" : "3", "status" : "serving", "progress_speed" : "", "progress" : "", "ads" : "", "pf" : "http://ping.aclst.com/ping.php/10754233/KMU0tzLwhbE?h=401301", "h" : "e8e446dbd937a0d8f636fdc8d8bb9874" };
Download link : http://www.youtube-mp3.org/get?ab=128&video_id=KMU0tzLwhbE&h=e8e446dbd937a0d8f636fdc8d8bb9874&r=1388680822878.1534658195
Hope it helps,
来源:https://stackoverflow.com/questions/12436584/youtube-to-mp3-conversion-using-web-site