Code pour télécharger la vidéo de Youtube sur Java, Android
J'ai créé un code pour télécharger la vidéo à partir de Youtube, mais ce code ne fonctionne pas avec connexion Wi-fi et de travailler avec connexion mobile. Où avais-je erreur?
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;
import android.app.Activity;
import android.app.ProgressDialog;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.MediaController;
import android.widget.VideoView;
public class MyActivity extends Activity {
private class ReceivingDataFromYoutube extends AsyncTask<String, Void, Void> {
private ProgressDialog dialog = new ProgressDialog(MyActivity.this);
private String result;
protected void onPreExecute() {
dialog.setMessage("Downloading...");
dialog.show();
}
@Override
protected Void doInBackground(String... arg0) {
int begin, end;
String tmpstr = null;
try {
URL url=new URL("http://www.youtube.com/watch?v=y12-1miZHLs&nomobile=1");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
InputStream stream=con.getInputStream();
InputStreamReader reader=new InputStreamReader(stream);
StringBuffer buffer=new StringBuffer();
char[] buf=new char[262144];
int chars_read;
while ((chars_read = reader.read(buf, 0, 262144)) != -1) {
buffer.append(buf, 0, chars_read);
}
tmpstr=buffer.toString();
begin = tmpstr.indexOf("url_encoded_fmt_stream_map=");
end = tmpstr.indexOf("&", begin + 27);
if (end == -1) {
end = tmpstr.indexOf("\"", begin + 27);
}
tmpstr = UtilClass.URLDecode(tmpstr.substring(begin + 27, end));
} catch (MalformedURLException e) {
throw new RuntimeException();
} catch (IOException e) {
throw new RuntimeException();
}
Vector url_encoded_fmt_stream_map = new Vector();
begin = 0;
end = tmpstr.indexOf(",");
while (end != -1) {
url_encoded_fmt_stream_map.addElement(tmpstr.substring(begin, end));
begin = end + 1;
end = tmpstr.indexOf(",", begin);
}
url_encoded_fmt_stream_map.addElement(tmpstr.substring(begin, tmpstr.length()));
String result = "";
Enumeration url_encoded_fmt_stream_map_enum = url_encoded_fmt_stream_map.elements();
while (url_encoded_fmt_stream_map_enum.hasMoreElements()) {
tmpstr = (String)url_encoded_fmt_stream_map_enum.nextElement();
begin = tmpstr.indexOf("itag=");
if (begin != -1) {
end = tmpstr.indexOf("&", begin + 5);
if (end == -1) {
end = tmpstr.length();
}
int fmt = Integer.parseInt(tmpstr.substring(begin + 5, end));
if (fmt == 35) {
begin = tmpstr.indexOf("url=");
if (begin != -1) {
end = tmpstr.indexOf("&", begin + 4);
if (end == -1) {
end = tmpstr.length();
}
result = UtilClass.URLDecode(tmpstr.substring(begin + 4, end));
this.result=result;
break;
}
}
}
}
try {
URL u = new URL(result);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
/* c.setRequestProperty("Youtubedl-no-compression", "True");
c.setRequestProperty("User-Agent", "YouTube");*/
c.setDoOutput(true);
c.connect();
FileOutputStream f=new FileOutputStream(new File("/sdcard/3.flv"));
InputStream in=c.getInputStream();
byte[] buffer=new byte[1024];
int sz = 0;
while ( (sz = in.read(buffer)) > 0 ) {
f.write(buffer,0, sz);
}
f.close();
} catch (MalformedURLException e) {
new RuntimeException();
} catch (IOException e) {
new RuntimeException();
}
return null;
}
protected void onPostExecute(Void unused) {
dialog.dismiss();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new ReceivingDataFromYoutube().execute();
}
}
- Hii pouvez-vous nous expliquer comment vous résoudre ce problème ? Comment faire pour télécharger des vidéos youtube ?
- hey u peut pls dire comment cela fonctionne, car je veux maintenant comment il fonctionne..j'ai juste copier votre code, mais il donne l'erreur sur "UtilClass".
- quel est ce UtilClass.URLDecode()est au ur de la fonction u peut expliquer.. je force l'obtenir
- Mec, vous avez écrit UtilClass. aimeriez-vous partager cette classe?
- pouvez-vous répondre à ma question stackoverflow.com/questions/26398325/...
Vous devez vous connecter pour publier un commentaire.
3 étapes:
Vérifier la sorce code (HTML) de YouTube, vous obtiendrez le lien comme ceci (http%253A%252F%252Fo-o.préféré.telemar-cnf1.v18.lscache6.c.youtube.com%252Fvideoplayback ...);
Décoder l'url (supprimer les codes %2B%25 etc), créer un décodeur avec les codes: http://www.w3schools.com/tags/ref_urlencode.asp et utiliser la fonction Uri.décoder(url) pour remplacer invalide échappé octets;
Utiliser le code de téléchargement de torrent:
C'est tout, la plupart des trucs que vous trouverez sur le web!!!
MÉTHODE 1 ( Recommandé )
Bibliothèque YouTubeExtractor
Ajouter dans votre gradle fichier
Et dépendances
Ajouter ce petit code et vous avez fait. Démo ICI
Vous pouvez obtenir le lien de téléchargement dans bindVideoResult() méthode.
MÉTHODE 2
L'utilisation de cette bibliothèque android-youtubeExtractor
Ajouter dans gradle fichier
Voici le code pour obtenir l'url de téléchargement.
com.commit451.youtubeextractor.YouTubeExtractionException: Status: fail Reason: Invalid parameters. Error code: 2
. Aucune idée Pourquoi ?Ref : Vidéo Youtube De Téléchargement (Android/Java)
initTypeMap(); appel de la première
Edit 2:
De même origine politique
https://en.wikipedia.org/wiki/Same-origin_policy
https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
Ref : https://superuser.com/questions/773719/how-do-all-of-these-save-video-from-youtube-services-work/773998#773998
Chacun de ces éléments, séparés par des virgules tableau de ce que j'appellerais "les objets de flux". Chaque "objet de flux de données" contient des valeurs de ce type
Chaque URL sera codé de sorte que vous aurez besoin de les décoder. Maintenant, la partie la plus délicate.
YouTube a au moins 3 niveaux de sécurité pour leurs vidéos
La RTMPE vidéos sont généralement utilisés sur officiel des films de pleine longueur, et sont protégés avec SWF Vérification de Type 2. Cela a été autour depuis 2011 et n'a pas encore de rétro-ingénierie.
Le type "s" vidéos sont les plus difficiles qui peuvent être téléchargés. Vous typcially voir ces sur VEVO vidéos et autres. Ils commencent avec une signature comme
AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5
Alors la signature est brouillé avec une fonction comme ceci
Cette fonction est dynamique, il change tous les jours. Pour le rendre plus difficile la fonction est hébergé dans une URL telle que
http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js
cela introduit le problème de l'origine de la politique. Essentiellement, vous ne pouvez pas télécharger ce fichier à partir de http://www.youtube.com parce qu'ils sont différents domaines. Une solution de contournement de ce problème est de la SCRO. Avec de la SCRO, s.ytimg.com ajoutez cet en-tête
et que cela permettrait le JavaScript pour le téléchargement à partir de http://www.youtube.com. Bien sûr, ils ne font pas cela. Une solution de contournement pour cette solution de contournement est d'utiliser un SCRO proxy. C'est un proxy qui réagit avec l'en-tête suivant à toutes les demandes
Donc, maintenant que vous avez mandaté votre fichier JS, et utilisé la fonction pour brouiller la signature, vous pouvez l'utiliser dans la chaîne de requête pour télécharger une vidéo.