Je télécharge et convertis plusieurs vidéos YouTube en fichiers audio uniquement sur mon RPi Zero. Bien que l'initialisation et le premier téléchargement prennent un certain temps, les téléchargements suivants sont beaucoup plus rapides. Existe-t-il un moyen de "réchauffer" yt-dl pour être plus rapide même pour le premier téléchargement? Cela ne me dérange pas de temps d'initialisation supplémentaire. (La modification de l'ordre des URL n'a aucun effet.)
5.889932870864868 [youtube] xxxxxxxxxxx: Downloading webpage [download] 100% of 4.09MiB in 00:01 15.685529470443726 [youtube] yyyyyyyyyyy: Downloading webpage [download] 100% of 3.58MiB in 00:00 2.526634693145752 [youtube] zzzzzzzzzzz: Downloading webpage [download] 100% of 3.88MiB in 00:01 2.4716105461120605
Production:
import time
t1 = time.time()
from youtube_dl import YoutubeDL
ydl = YoutubeDL({'format': 'bestaudio/best'})
t2 = time.time()
print(t2 - t1, flush=True)
ydl.download(['https://www.youtube.com/watch?v=xxxxxxxxxxx'])
t3 = time.time()
print(t3 - t2, flush=True)
ydl.download(['https://www.youtube.com/watch?v=yyyyyyyyyyy'])
t4 = time.time()
print(t4 - t3, flush=True)
ydl.download(['https://www.youtube.com/watch?v=zzzzzzzzzzz',])
t5 = time.time()
print(t5 - t4, flush=True)
3 Réponses :
Je ne pense pas que vous puissiez accélérer cela sans obtenir un service Internet plus rapide. C'est le temps du réseau, la négociation de sockets sécurisés avec YouTube.
Vous pouvez peut-être en accélérer un peu en testant la vitesse de votre DNS actuel et voir s'il existe un DNS plus rapide disponible.
https://www.serverwatch.com/guides/two-tools-for-testing-dns-server-speeds
Merci pour votre réponse. Le moment de la négociation de socket ne me dérangerait pas si cela se produisait avant d'essayer de télécharger des médias. Y a-t-il un moyen de faire en sorte que yt-dl fasse cela à l'avance? EDIT: quelque chose comme ydl.init_socket(...) serait très utile ...
Je viens de découvrir que le réseau n'est pas le goulot d'étranglement ici, voir ma réponse. Merci quand même pour votre contribution!
Très bien, cela devrait faire l'affaire. Les informations de D / L de chaque vidéo, puis récupère ces vidéos.
#! /usr/bin/env python3
import time
from youtube_dl import YoutubeDL
## opts = { 'format': 'best[height<=720,ext=mp4]/best[height<=720]' }
opts = { 'format': 'bestaudio[ext=m4a]/bestaudio/best' }
ydl = YoutubeDL( opts )
videos = [ 'https://www.youtube.com/watch?v=cVsQLlk-T0s',
'https://www.youtube.com/watch?v=3l2oi-X8P38',
'https://www.youtube.com/watch?v=bPpcfH_HHH8' ]
items = []
for video in videos:
timer = time .time()
info = ydl .extract_info( video, download = False )
items .append( info )
print( 'info:', info['title'], '--', time .time() -timer, flush = True )
for item in items:
timer = time .time()
ydl .process_video_result( item )
print( 'vid:', item['title'], '--', time .time() -timer, flush = True )
Merci! Cela aide dans le sens où je sais maintenant comment récupérer des informations sur les médias sans télécharger le contenu réel. Donc, pour mes besoins, je devrais obtenir les informations pour une vidéo aléatoire et ensuite les téléchargements sont tous assez rapides. Pas exactement ce que je cherchais, mais je peux probablement travailler avec ça.
Après avoir parcouru le code youtube-dl, j'ai constaté que la plupart du temps est InfoExtractor pour trouver le bon InfoExtractor pour les URL InfoExtractor . Lors du téléchargement du premier élément multimédia, le framework passe par des centaines d'extracteurs possibles (avec exécution d'expressions régulières sur chacun) et s'installe finalement sur le bon extracteur YT qui est sur la position 1122 dans mon cas!
C'est mon hack rapide qui supprime complètement 12 secondes du processus sur mon RPi Zero:
5.961918592453003 [youtube] xxxxxxxxxxx: Downloading webpage [download] 100% of 4.09MiB in 00:01 3.7426917552948 <-- way faster!
Production:
import time
timer = time.time()
from youtube_dl import YoutubeDL
ydl = YoutubeDL({'format': 'bestaudio/best'})
# Get correct info extractor and replace the long existing list
ydl._ies = [ydl.get_info_extractor('Youtube')]
print(time.time() - timer)
timer = time.time()
# Super fast first download, yay!
ydl.download(['https://www.youtube.com/watch?v=xxxxxxxxxxx'])
print(time.time() - timer)
Peut-être y a-t-il un moyen plus régulier pour cela sans écraser les variables semi-privées.