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.
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:
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.
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".
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é.
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