Question En bash script comment puis-je assurer youtube-dl télécharge tous les fichiers dans une playlist


J'essaie d'automatiser le téléchargement d'une playlist en utilisant youtube-dl en utilisant un script bash. J'ai réussi quand il n'y a pas d'erreurs lancées par youtube-dl.

Disons qu'il y a une erreur de contenu trop courte, puis j'essaie de boucler pour compléter les fichiers dans la liste de lecture après avoir dormi pendant 90 secondes afin de ne pas bombarder le site.

Cependant, ce que je ressens que pour une raison quelconque, le sommeil ne fonctionne pas comme prévu et le site est bombardé avec une demande ultérieure menant à un http 429.

Que puis-je faire pour améliorer mon script ... script partiel affiché ici

until youtube-dl --verbose --ignore-errors url-to-playlist; do 
        sleep 90; 
    done

Est-ce que j'utilise la mauvaise boucle? Y a-t-il une meilleure façon?

Merci pour votre temps


1
2017-08-20 05:53


origine




Réponses:


Vous passez une playlist à YouTube-dl, avec l'option de ligne de commande --ignore-errors. Cela signifie que YouTube-dl tentera de télécharger la liste complète des vidéos avant de quitter; quel que soit le nombre de pannes auxquelles il sera confronté en cours de route. Donc, si la vidéo n ° 2 échouait, la demande de vidéo n ° 3 suivrait immédiatement après. Je ne sais pas à quel point Google est vigilant, mais cela pourrait déjà sonner.

Et même après que la dernière vidéo de votre liste de lecture ait été touchée, êtes-vous certain que YouTube-dl renvoie un code de sortie différent de zéro? Il n'y a aucune mention de cela dans le readme, donc je ne serais pas surpris si votre sleep 90 ne serait jamais exécuté.

D'ailleurs, à quoi sert cette boucle de toute façon? Le redémarrage de youtube-dl avec la même liste de lecture permettra de tout télécharger à nouveau; y compris toutes les vidéos qui ont été téléchargées avec succès la première fois. Bien que les options --no-overwrites et --continue peut aider ici.

Pour éviter que Google bloque votre adresse IP (HTTP 429), je suggère d'utiliser l'option --sleep-interval. Exemple:

youtube-dl --verbose --ignore-errors --sleep-interval 10 url-to-playlist

Je ne suis pas sûr que l'intention de votre boucle était de continuer à réessayer une vidéo en échec jusqu'à ce qu'elle réussisse. J'espère que non; ce n'est pas très simple puisque:

  • Vous ne pouvez pas utiliser le code de sortie de youtube-dl pour détecter un échec. Vous devrez soit recouper le dossier de sortie avec votre liste de lecture, soit analyser la sortie de youtube-dl.
  • Vous devez implémenter un compteur pour limiter le nombre de tentatives. certains problèmes ne disparaissent pas d'eux-mêmes.

2
2017-08-20 12:54



Je vis en Chine et utilise le VPN pour télécharger des vidéos éducatives sur Youtube. La connexion est très mauvaise ici, si souvent youtube-dl ne finira pas. Donc, j'utilise la même boucle exacte pour télécharger des vidéos, sauf que je supprime --ignore-errors et la commande de sommeil est exécutée et tout fonctionne bien. - Fazzolini
@ Fazzolini On dirait que vous ne commentez pas tellement ma réponse, mais plutôt la question de OP. Si vous estimez que vos expériences peuvent être utiles à OP (ou à d’autres personnes recherchant une solution), veuillez les poster en tant que réponse séparée à la question. - Ruud Helderman
Je pensais cependant que vous ne seriez pas surpris si sleep 90 ne serait jamais exécuté. Je voulais ajouter que cela est exécuté. Une autre partie de mon commentaire concernait votre question what good is this loop anyway. Et ma réponse à cela serait que c'est bien, parce que cela permet d'atteindre l'objectif déclaré - télécharger la playlist. - Fazzolini
@Fazzolini Dans le script de OP, le sommeil est jamais atteint parce que youtube-dl --ignore-errors renvoie toujours le code de sortie 0. Je l'ai fait délibérément ne pas recommander d'enlever --ignore-errors En raison de son inconvénient, une défaillance permanente sur une seule vidéo (ou pire, des hausses régulières sur une connexion Internet instable) peut entraîner des tentatives infinies. Votre script (en plus de gaspiller de la bande passante pour relancer les téléchargements réussis des premières vidéos) n'est pas garanti pour atteindre la fin d'une longue liste de lecture. Mais votre kilométrage peut varier. - Ruud Helderman