web-dev-qa-db-fra.com

Obtenir l'URL d'une vidéo YouTube avec `youtube-dl` est lent, sans téléchargement de vidéo

Je souhaite obtenir l'URL en utilisant youtube-dl et l'option "simuler" -g qui ne télécharge pas la vidéo.

Alors j'ai donné la commande suivante:

youtube-dl -g https://www.youtube.com/watch?v=k4JGSAmu4lg

Il a donné la sortie suivante après 7 à 8 secondes

https://r20---sn-cvh7zn7d.googlevideo.com/videoplayback?initcwndbps=1113000&mt=1408702970&requiressl=yes&ipbits=0&sver=3&fexp=901454%2C902408%2C919145%2C924626%2C927622%2C927904%2C931330%2C931983%2C934024%2C934030%2C934804%2C945118%2C945308%2C946023%2C951914&ratebypass=yes&signature=38F111D46D72FFC50B47D50B3C9A631099BF5F83.FA134C91F407989B95ACADC1F1F6946B8F18C158&upn=tU0u5t7A2Uw&sparams=id%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Cmm%2Cms%2Cmv%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mm=31&expire=1408724634&id=o-AJNPuDp9TKMKiwzUwvSk76W7JdA0cx0bRSum9mPJJ7Vo&mv=u&source=youtube&ms=au&key=yt5&ip=115.113.1.50&itag=18

Mais le problème est qu’il faut environ 7 à 8 secondes pour interroger l’URL.
Y a-t-il un moyen pour que ce soit plus rapide?

Le temps est passé à faire du travail

La commande ne bloque pas ni n'attend quelque chose qui fait perdre du temps,
il s’agit d’un travail qui prend du temps; Cela prend probablement du temps en additionnant plusieurs petits retards de réseau. Mais il se pourrait aussi que les retards du côté YouTube s’additionnent.

Le temps nécessaire au téléchargement du code HTML nécessaire;
La commande doit faire au moins deux requêtes HTTP, l'une après l'autre, et probablement plus.

Donc, si quelque chose est lent, il est déjà multiplié par le nombre de demandes.

Pour moi, cela prend 1,5 seconde sur une ligne très rapide - ce n’est pas très loin de 8 secondes.


Comment savoir

Je vais montrer les commandes que j'avais l'habitude de découvrir:

Pour rendre les exemples plus ordonnés, nous utilisons une variable pour l'URL:

$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"

Nous voulons mesurer la durée des commandes; L'utilisation de la commande time doit veiller à ne pas mélanger la commande et l'environnement intégré du shell. Nous utilisons une petite fonction pour raccourcir les lignes:

$ t(){/usr/bin/time -f 'Time: %es' "$@";}

Votre commande écrit l'URL du fichier vidéo (tronqué à 80 colonnes):

$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823

Mesurons le temps qu'il faut pour fonctionner sur mon ordinateur:

$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s

Ok, une seconde et demi. Plus rapide que dans la question, mais pas beaucoup plus rapidement. Mais comment passe-t-il le temps? Peut-être qu'il télécharge la vidéo de manière cachée et la jette? La vidéo dure 11 minutes en 360p. Le télécharger sans aucune option prend environ 13 secondes, dix fois plus longtemps.
Besoin d’examiner de plus près, avec l’option verbeuse -v:

$ t youtube-dl -v -g "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-g', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?sparams=id%2Cinitcwn
Time: 1.40s

Oh, il y a un certain délai avant que les lignes '[debug]' soient imprimées. On dirait que youtube-dl consacre du temps à sa propre configuration. C'est environ un quart de seconde, pas le retard que nous recherchons. Mais ce que nous pouvons en apprendre, c’est que l’implémentation de youtube-dl peut être lente.
Après les messages, rien ne se passe jusqu'à ce que l'URL de résultat soit imprimée. Donc, nous ne voyons toujours pas la partie intéressante.
L’option -g consiste à "simuler" le téléchargement de la vidéo dans le sens où il effectue la partie compliquée de la recherche de cette URL semi-secrète, l’imprime, mais ignore le téléchargement à la fin. Il existe une option similaire -s qui ne renvoie pas l'URL et semble similaire sinon. Supposons que c'est assez similaire si cela prend à peu près le même temps; Nous devons vérifier cela.

$ t youtube-dl -v -s "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-s', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
[youtube] Setting language
[youtube] k4JGSAmu4lg: Downloading webpage
[youtube] k4JGSAmu4lg: Downloading video info webpage
[youtube] k4JGSAmu4lg: Extracting video information
Time: 1.45s

Ok, -s prend le même temps que -g, il est donc correct de les remplacer pour les tests.
Plus intéressant, c’est que nous avons maintenant plus de sorties. Et elle est imprimée avec un timing intéressant: les lignes sont imprimées avec un délai similaire les unes aux autres, il semble donc qu’elles concernent les actions qui prennent réellement le temps que nous recherchons.
À partir des messages, au moins deux pages Web sont téléchargées. Mais nous pouvons supposer que le mot "page" ne signifie pas une seule requête HTTP et un seul document HTML.

Qu'avons-nous appris?

Le point essentiel est que le travail du programme prend du temps, qu'il n'attend pas quelque chose ou qu'il est suspendu.
De plus, nous observons plusieurs étapes prenant le même temps. Il n'y a pas grand chose à calculer, ce sont donc des allers-retours sur le réseau qui s'additionnent.
Cela signifie que la latence de notre connexion n’est importante qu’ici. Le débit de la connexion est tout simplement hors de propos.

Si vous souhaitez rendre votre connexion Internet plus rapide afin de pouvoir transférer des données à une vitesse double, cela ne vous aidera pas du tout. Mais si vous pouvez obtenir de meilleurs ping fois, cela le rendra beaucoup plus rapide.
Cependant, il ne s’agit pas de "ping" pour votre fournisseur de service Internet; Le temps imparti à Ping pour aller sur YouTube est ce qui compte - et il est parfois impossible de le modifier.

Il est intéressant de noter que pour l'étape suivante, le téléchargement d'une vidéo, les exigences relatives à une ligne rapide sont exactement l'inverse: la latence n'est pas du tout pertinente et le débit importe vraiment.


Pas encore fatigué?

Vous voulez encore plus de détails pour comprendre à quoi sert vraiment le temps?
La prochaine étape consisterait à retracer la connexion HTTP. Je soupçonne que cela peut montrer beaucoup plus d'allers-retours que deux, pour les redirections par exemple. Vous pouvez utiliser wireshark, ou un proxy HTTP de journalisation, ou strace pour compter uniquement les appels système destinés à la connexion ou à l'écriture.

Pour aujourd'hui, nous avons tous les deux examiné assez profondément le gouffre des réseaux.

9
Volker Siegel

Il suffit de faire un:

youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=k4JGSAmu4lg' | jq -r '.id' | sed 's_^_https://youtube.com/v/_'

Source

6
tictac

Il pourrait y avoir une autre raison. youtube-dl est distribué en tant qu'application Python zippée. Chaque fois que vous l'exécutez, il est extrait puis exécuté.

Vous pouvez l'extraire manuellement à l'aide de la commande unzip. Exécutez ensuite __main__.py comme vous le feriez avec youtube-dl. Sur un ordinateur peu alimenté, comme le Pi, cela augmentera sensiblement vos performances.

1
nmrugg