Comment fonctionnent tous ces services «Sauvegarder la vidéo de YouTube»?

62

Je veux dire, comment fonctionnent-ils, en général? Comment reçoivent-ils le lien vers un flux vidéo lui-même (pas seulement la page contenant un lecteur Flash)?

J'ai effectué une recherche sur le Web, mais je n'ai rien trouvé d'utile (tous les liens pointent vers de tels services, mais aucun d'entre eux n'indique comment ils sont réellement mis en œuvre).

PaulD
la source

Réponses:

51

Il existe un téléchargeur de ligne de commande open source très populaire appelé youtube-dl, qui fait exactement cela. Il récupère les liens de fichiers audio et vidéo d’un lien YouTube donné - ou de tout autre site Web populaire comme Vimeo, Yahoo! Vidéo, uStream, etc.

Pour voir comment cela fonctionne, consultez l’ extracteur YouTube . C'est trop pour montrer ici. D'autres extracteurs existent pour des sites plus simples . Steven Penny a également un téléchargeur JavaScript simple pour YouTube, qui est un peu plus simple.

Mais fondamentalement, pour un lecteur vidéo Flash, il doit être initialisé et configuré via du JavaScript. En termes simples, le lecteur de l'objet Flash recevra l'URL d'un flux vidéo à charger.

Pour trouver le flux vidéo, vous devez analyser le code HTML et le code JS de la page vidéo pour trouver le code d'initialisation approprié, puis à partir de là, essayer de trouver le lien vers le fichier MP4 lui-même. Il est peut-être en texte clair, mais il peut également être généré à la volée avec des jetons de téléchargement spécifiques. Souvent, le code JavaScript est obscurci pour rendre plus difficile sa reconfiguration. Les informations vidéo peuvent également être contenues dans un fichier XML chargé de manière asynchrone par JS.

Pour la vidéo à téléchargement progressif HTML5, le fichier source réel est généralement mentionné directement dans l’ sourceenfant de la videobalise, donc si vous effectuez une recherche sur la page mp4ou similaire. Par exemple, dans l'émission de télévision allemande Tagesschau 100 , vous trouverez:

<source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4">

Pour les technologies de lecture plus avancées telles que MPEG DASH ou HTTP Live Streaming (HLS) d'Apple, vous devez analyser un fichier de méta-informations pour obtenir le flux vidéo réel. Le méta-fichier ( .mpdpar exemple, dans DASH et .m3u8pour HLS) contiendra des liens vers des segments de vidéo et d’audio, que vous devrez ensuite combiner pour obtenir un fichier lisible.

Il n'y a pas de solution générale pour cela. Cela nécessite une inspection minutieuse et un débogage du site cible.

slhck
la source
3
Une question, quelle est la politique de Youtube / Google à ce sujet? Sont-ils d'accord avec ça, ou pas tellement?
JMK
31
Les conditions de service de YouTube au §5.1.L interdisent la consommation de leur contenu par tout autre moyen que le streaming, ce qui est théoriquement interdit. En pratique, ils ne seront pas capables de faire respecter cela. N'importe quel téléchargeur peut plus ou moins simuler qu'il ne s'agit que de la diffusion en continu.
Slhck
2
@StevenPenny avez-vous une version non détaillée de cela?
TankorSmash
5
@slhck Flash peut également faire des requêtes HTTP par lui-même. Au lieu de cela, il utilise le moteur HTTP du navigateur. Si Flash lui-même faisait les demandes, elles ne seraient pas "visibles" pour le navigateur. Ce serait formidable pour les annonceurs. ;)
Daniel B
3
@slhck, ils ne peuvent pas l'appliquer par programme , mais s'ils avaient leur équipe d'avocats, pourraient-ils l'appliquer légalement ?
Cruncher
35

Bookmarklet YouTube

Voici comment je l'ai fait avec JavaScript

Commencez avec ytplayer.config.argsobjet. Ceci contient toutes les URL de la vidéo. Il est divisé en

url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts              // DASH: contains video or audio stream

Chacun de ceux-ci est un tableau séparé par des virgules de ce que j'appellerais des "objets de flux". Chaque "objet de flux" contiendra des valeurs comme celle-ci

url  // direct HTTP link to a video
itag // code specifying the quality
s    // signature, security measure to counter downloading

Chaque URL sera codée , vous devrez donc les décoder. Maintenant la partie la plus délicate.

YouTube a au moins 3 niveaux de sécurité pour leurs vidéos

unsecured // as expected, you can download these with just the unencoded URL
s         // see below
RTMPE     // uses "rtmpe://" protocol, no known method for these

Les vidéos RTMPE sont généralement utilisées dans les longs métrages officiels et sont protégées par SWF Verification Type 2. Cela existe depuis 2011 et n’a pas encore été désossé.

Les vidéos de type "s" sont les plus difficiles à télécharger. Vous les verrez typiquement sur les vidéos VEVO et similaires. Ils commencent par une signature telle que

AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5

Ensuite, la signature est brouillée avec une fonction comme celle-ci

function mo(a) {
  a = a.split("");
  a = lo.rw(a, 1);
  a = lo.rw(a, 32);
  a = lo.IC(a, 1);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 44);
  return a.join("")
}

Cette fonction est dynamique, elle change tous les jours. Pour rendre la tâche plus difficile, la fonction est hébergée sur une URL telle que

http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js

cela introduit le problème de la politique de même origine . Essentiellement, vous ne pouvez pas télécharger ce fichier www.youtube.comcar il s’agit de domaines différents. Une solution de ce problème est CORS . Avec CORS, s.ytimg.compourrait ajouter cet en-tête

Access-Control-Allow-Origin: http://www.youtube.com

et cela permettrait au JavaScript de télécharger depuis www.youtube.com. Bien sûr, ils ne le font pas. Une solution de contournement pour cette solution consiste à utiliser un proxy CORS. C'est un proxy qui répond avec toutes les requêtes avec l'en-tête suivant

Access-Control-Allow-Origin: *

Donc, maintenant que vous avez envoyé votre fichier JS par proxy et que vous avez 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.

Steven Penny
la source
1
Savez-vous (pour la lecture DASH) comment le lecteur YouTube détermine les plages d'octets à demander à la représentation multimédia? Le fichier MPD ne répertorie que les segments.
slhck
2
Pas exactement. Il existe un seul fichier pour la vidéo et l'audio, mais YouTube les demande par plage d'octets, en plusieurs morceaux. Si vous passez à une autre qualité, la plage d'octets sera également modifiée. Je me demande simplement comment le joueur sait quelle seconde correspond à quel décalage d'octet.
Slhck
1
Pouvez-vous donner un exemple de stype vidéo et RTMPEtype vidéo?
Chloé
@SurajJain, voici une nouvelle page - Je vais réécrire cette réponse car j'utilise une méthode différente maintenant. Github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Steven Penny
Le lien me donne un 404. Avez-vous retiré le repo?
darksoulsong
1

Ma réponse: à partir du 22 janvier 2019, l'utilisation de ces méthodes peut être bloquée si vous essayez de contourner sans lier également vos informations d'utilisateur.

Pourquoi? étant donné que je suis un nouvel utilisateur de cette plate-forme, je ne peux pas commenter pour la règle spécifiée par @ Daniel-B . Selon le nouveau ToS (en allemand car je suis en Allemagne; veuillez traduire) pour YouTube inférieur à 6,1 G $:

Vous acceptez que tout système automatisé (y compris, sans toutefois s'y limiter, tout robot, araignée ou lecteur hors ligne), utilise ce système sur les accès au site Web de manière à ce que davantage de demandes adressées au serveur dans un délai spécifié puissent être raisonnablement produites par YouTube. un humain au cours de la même période à l’aide d’un navigateur Web standard non modifié et mis à la disposition du public;

Ils peuvent maintenant connaître la durée de chaque demande et savoir si vous violez. Comment est-il possible maintenant, étant donné ce scénario et votre adresse IP externe seront connues même si vous utilisez un VPN pour vous protéger sans lier les détails de l'utilisateur à un service quelconque.

utilisateur103720
la source
1
Bienvenue voyageur du futur ... Il n'est pas clair comment cela répond à la question de l'auteur
Ramhound
Si vous souhaitez avertir l'auteur, en ce qui concerne une réponse spécifique, vous auriez dû soumettre un commentaire et exclure toute réponse qui, à votre avis, ne serait pas utile en raison des éventuels problèmes juridiques qui pourraient en découler. Cette réponse ressemble davantage à ce que vous trouverez sur un message de forum de discussion, et Super User n’est pas un forum de discussion
Ramhound