conversia youtube în mp3 folosind site-ul web (Programare, Java, Youtube)

user1610362 a intrebat.
a intrebat.

Încerc să fac un program care poate descărca videoclipuri youtube ca fișiere mp3. Am folosit acest site youtube-mp3.org pentru a realiza acest lucru. Deci, am descărcat conținutul de www.youtube-mp3.org/?c#v=sTbd2e2EyTk unde sTbd2e2EyTk este id-ul video, acum trebuie să obțin link-ul către fișierul mp3 (în acest caz http://www.youtube-mp3.org/get?video_id…..), dar nu există niciun link în conținutul descărcat. Am observat că instrumentele dezvoltatorilor din Chrome (ctrl+shift+j, tab Elements) arată acel link și opțiunea de vizualizare a sursei (ctrl+u) din Chrome îmi oferă același rezultat pe care îl obțin prin descărcarea paginii folosind java. Cum pot obține acel link? Am încercat să obțin date folosind JSoap, dar acele date de care am nevoie nu sunt încărcate imediat pe pagină, așa că nu le pot obține.

Următorul cod este pentru a descărca conținutul paginii web…

 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());

Am folosit această metodă pentru a obține un fișier, dar am nevoie de un 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();
}

Comentarii

2 răspunsuri
MrToast

Am găsit asta

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 + "
");
                        }
                        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;
    }
}

Sistemul cardinal

Un răspuns la o întrebare similară:


În ceea ce privește Termenii de utilizare a API-ului YouTube

https://developers.google.com/youtube/terms/developer-policies

NU SE POATE :

să separați, să izolați sau să modificați componentele audio sau video ale oricărui conținut audiovizualYouTube pus la dispoziție prin intermediul YouTube API;

promovați separat componentele audio sau video ale oricărui conținut audiovizual YouTube pus la dispoziție prin intermediul YouTube API;

(Sursa: https://stackoverflow.com/a/26552805/5645656)


Răspunsul meu:


Este este posibil folosind un alt serviciu. Luați în considerare codul de mai jos, care utilizează www.320youtube.com. Metoda youtubeToMP3 va returna un fișier MP3 cu sunetul videoclipului sub forma unui array de octeți:

private static final Pattern VID_ID_PATTERN = Pattern.compile("(?<=v\=|youtu\.be\/)\w+"),
        MP3_URL_PATTERN = Pattern.compile("https\:\/\/\w+\.ytapivmp3\.com\/download.+?(?=\
)"),
        FILENAME_PATTERN = Pattern.compile("(?<=filename\=\
).+?(?=\
)");

public static void main(String[] args) throws IOException {
    String youtubeUrl = "https://www.youtube.com/watch?v=M2iuVCIMi1s";
    File mp3 = youtubeToMP3(youtubeUrl);
    Desktop.getDesktop().open(mp3);
}

public static File youtubeToMP3(String youtubeUrl) throws IOException {
    String id = getID(youtubeUrl);
    String converter = loadConverter(id);
    String mp3url = getMP3URL(converter);

    StringBuilder builder = new StringBuilder();
    byte[] mp3 = load(mp3url, builder);

    File output = new File(builder.toString());
    FileOutputStream stream = new FileOutputStream(output);
    stream.write(mp3);
    stream.flush();
    stream.close();

    return output;
}

private static byte[] load(String url, StringBuilder filename) throws IOException {
    URL url2 = new URL(url);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    HttpURLConnection connection = (HttpURLConnection) url2.openConnection();
    connection.setRequestProperty("user-agent",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36");
    connection.connect();

    if (filename != null) {
        String s = toUTF8(connection.getHeaderField("content-disposition"));
        if (s != null && !s.isEmpty()) {
            Matcher m = FILENAME_PATTERN.matcher(s);
            if (m.find()) {
                filename.append(m.group());
            } else {
                filename.append(s);
            }
        }
    }

    InputStream is = connection.getInputStream();
    byte[] byteChunk = new byte[2500];
    int n;

    while ((n = is.read(byteChunk)) > 0) {
        baos.write(byteChunk, 0, n);
    }
    connection.disconnect();
    baos.flush();
    baos.close();

    return baos.toByteArray();
}

private static String toUTF8(String s) {
    try {
        return new String(s.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8.name());
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return null;
    }
}

private static String loadConverter(String id) throws IOException {
    String url = "https://www.320youtube.com/v14/watch?v=" + id;
    byte[] bytes = load(url, null);
    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();
}

private static String getMP3URL(String converter) {
    Matcher m = MP3_URL_PATTERN.matcher(converter);
    if (m.find())
        return m.group();

    throw new IllegalArgumentException("Invalid converter");
}