youtube to mp3 conversion using web site

心已入冬 提交于 2020-04-29 09:38:10

问题


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.

  1. Submit my Youtube URL to Youtube-mp-3.org
  2. Inspect the response from the webservice
  3. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!