web-dev-qa-db-fra.com

Shell Script pour télécharger des fichiers youtube à partir de la playlist

J'essaie d'écrire un script bash qui téléchargera toutes les vidéos youtube à partir d'une liste de lecture et les enregistrera sous un nom de fichier spécifique en fonction du titre de la vidéo youtube elle-même. Jusqu'à présent, j'ai deux codes distincts qui font ce que je veux mais je ne sais pas comment les combiner pour fonctionner comme une unité.

Ce morceau de code trouve les titres de toutes les vidéos youtube sur une page donnée:

curl -s "$1" | grep '<span class="title video-title "' | cut -d\> -f2 | cut -d\< -f1

Et ce morceau de code télécharge les fichiers dans un nom de fichier donné par l'id de la vidéo youtube (par exemple, le nom de fichier indiqué par youtube.com/watch?v= CsBVaJelurE & feature = relmfu serait CsBVaJelurE.flv).

curl -s "$1" | grep "watch?" | cut -d\" -f4| while read video; 
do youtube-dl "http://www.youtube.com$video";
done

Je veux un script qui générera le fichier youtube .flv sous un nom de fichier donné par le titre de la vidéo (dans ce cas, BASH lesson 2.flv) plutôt que simplement par son nom. Merci d'avance pour toute l'aide.

18
wvandaal

OK, après de nouvelles recherches et la mise à jour de ma version de youtube-dl, il s’avère que cette fonctionnalité est désormais directement intégrée au programme, ce qui évite à un script Shell de résoudre le problème de téléchargement de la liste de lecture sur youtube. La documentation complète peut être trouvée ici: ( http://rg3.github.com/youtube-dl/documentation.html ) mais la solution simple à ma question initiale est la suivante:

1) youtube-dl traitera automatiquement un lien de liste de lecture, il n’est pas nécessaire de l’alimenter individuellement avec les URL des vidéos qui y sont contenues (cela élimine la nécessité d’utiliser grep pour rechercher "regarder?" Afin de trouver l’identifiant vidéo unique

2) une option est maintenant incluse pour formater le nom de fichier avec diverses options, notamment:

  • id: la séquence sera remplacée par l'identifiant vidéo.
  • url: la séquence sera remplacée par l'URL de la vidéo.
  • uploader: la séquence sera remplacée par le pseudo de la personne qui a téléchargé la vidéo.
  • upload_date: la séquence sera remplacée par la date de téléchargement au format AAAAMMJJ.
  • titre: la séquence sera remplacée par le titre vidéo littéral.
  • ext: la séquence sera remplacée par l'extension appropriée (comme flv ou mp4).
  • Epoch: La séquence sera remplacée par l’époque Unix lors de la création du fichier .
  • numérotation auto: la séquence sera remplacée par un nombre à cinq chiffres que sera augmenté à chaque téléchargement, en commençant à zéro.

la syntaxe de cette option de sortie est la suivante (NOM étant l’une des options présentées ci-dessus):

youtube-dl -o '%(NAME)s' http://www.youtube.com/your_video_or_playlist_url

Par exemple, pour répondre à ma question initiale, la syntaxe est la suivante:

youtube-dl -o '%(title)s.%(ext)s' http://www.youtube.com/playlist?list=PL2284887FAE36E6D8&feature=plcp

Merci encore à ceux qui ont répondu à ma question, votre aide est grandement appréciée.

23
wvandaal

Si vous souhaitez utiliser le titre de la page youtube comme nom de fichier, vous pouvez utiliser l'option -t de youtube-dl. Si vous souhaitez utiliser le titre de votre page "Liste de vidéos" et que vous êtes sûr qu'il existe exactement une URL watch? pour chaque titre <span class="title video-title", vous pouvez utiliser quelque chose comme ceci:

#!/bin/bash

TMPFILE=/tmp/downloader-$$

onexit() {
  rm -f $TMPFILE
}

trap onexit EXIT

curl -s "$1" -o $TMPFILE

i=0
grep '<span class="title video-title "' $TMPFILE | cut -d\> -f2 | cut -d\< -f1 | while read title; do
  titles[$i]=$title
  ((i++))
done

i=0
grep "watch?" $TMPFILE | cut -d\" -f4 | while read url; do
  urls[$i]="http://www.youtube.com$url"
  ((i++))
done

i=0; while (( i < ${#urls[@]} )); do
  youtube-dl -o "${titles[$i]}.%(ext)" "${urls[$i]}"
  ((i++))
done

Je ne l'ai pas testé car je n'ai pas d'exemple de page "liste de vidéos".

1
praetorian droid

cette méthode suivante fonctionne et vous joue titanic de youtube

youtube-downloader.sh youtube-video-url.sh

#!/bin/bash
decode() {
    to_decode='s:%([0-9A-Fa-f][0-9A-Fa-f]):\\x\1:g'
    printf "%b" `echo $1 | sed 's:&:\n:g' | grep "^$2" | cut -f2 -d'=' | sed -r $to_decode`
}
data=`wget http://www.youtube.com/get_video_info?video_id=$1\&hl=pt_BR -q -O-`
url_encoded_fmt_stream_map=`decode $data 'url_encoded_fmt_stream_map' | cut -f1 -d','`
signature=`decode $url_encoded_fmt_stream_map 'sig'`
url=`decode $url_encoded_fmt_stream_map 'url'`
test $2 && name=$2 || name=`decode $data 'title' | sed 's:+: :g;s:/:-:g'`
test "$name" = "-" && name=/dev/stdout || name="$name.vid"
wget "${url}&signature=${signature}" -O "$name"






#!/usr/bin/env /bin/bash
function youtube-video-url {
    local field=
    local data=
    local split="s:&:\n:g"
    local decode_str='s:%([0-9A-Fa-f][0-9A-Fa-f]):\\x\1:g'
    local yt_url="http://www.youtube.com/get_video_info?video_id=$1"
    local grabber=`command -v curl`
    local args="-sL"
    if [ ! "$grabber" ]; then
        grabber=`command -v wget`
        args="-qO-"
    fi
    if [ ! "$grabber" ]; then
        echo 'No downloader available.' >&2
        test x"${BASH_SOURCE[0]}" = x"$0" && exit 1 || return 1
    fi
    function decode {
        data="`echo $1`"
        field="$2"
        if [ ! "$field" ]; then
            field="$1"
            data="`cat /dev/stdin`"
        fi
        data=`echo $data | sed $split | grep "^$field" | cut -f2 -d'=' | sed -r $decode_str`
        printf "%b" $data
    }
    local map=`$grabber $args $yt_url | decode 'url_encoded_fmt_stream_map' | cut -f1 -d','`
    echo `decode $map 'url'`\&signature=`decode $map 'sig'`
}
[ $SHLVL != 1 ] && export -f youtube-video-url

bash youtube-player.sh saalGKY7ifU

#!/bin/bash
decode() {
    to_decode='s:%([0-9A-Fa-f][0-9A-Fa-f]):\\x\1:g'
    printf "%b" `echo $1 | sed 's:&:\n:g' | grep "^$2" | cut -f2 -d'=' | sed -r $to_decode`
}


data=`wget http://www.youtube.com/get_video_info?video_id=$1\&hl=pt_BR -q -O-`


url_encoded_fmt_stream_map=` decode $data 'url_encoded_fmt_stream_map' | cut -f1 -d','`

signature=` decode $url_encoded_fmt_stream_map 'sig'`

url=`decode $url_encoded_fmt_stream_map 'url'`
test $2 && name=$2 || name=`decode $data 'title' | sed 's:+: :g;s:/:-:g'`


test "$name" = "-" && name=/dev/stdout || name="$name.mp4"

# // wget "${url}&signature=${signature}" -O "$name"

mplayer -zoom -fs "${url}&signature=${signature}"

Il utilise decode et bash, que vous avez peut-être installé.

0
term89

J'utilise ce script bash pour télécharger un ensemble donné de chansons à partir de la playlist de youtube

#!/bin/bash
downloadDirectory = <directory where you want your videos to be saved>
playlistURL = <URL of the playlist>
for i in {<keyword 1>,<keyword 2>,...,<keyword n>}; do
    youtube-dl -o ${downloadDirectory}"/youtube-dl/%(title)s.%(ext)s" ${playlistURL} --match-title $i
done

Remarque: "mot-clé i" est le titre (en totalité ou en partie; s'il s'agit d'une partie, il devrait être unique à cette playlist) d'une vidéo donnée dans cette playlist. 

Edit: Vous pouvez installer youtube-dl par pip install youtube-dl

0
Nikhil Sharma