2012-01-19 16 views
16

Próbuję napisać skrypt bash, który pobierze wszystkie filmy z youtube z listy odtwarzania i zapisze je w określonej nazwie pliku na podstawie tytułu samego filmu youtube. Jak dotąd mam dwa oddzielne fragmenty kodu, które robią to, co chcę, ale nie wiem, jak połączyć je w jedną całość.Skrypt powłoki do pobierania plików youtube z listy odtwarzania

Ten fragment kodu wyszukuje tytuły wszystkich filmów z YouTube na danej stronie:

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

I ten kawałek kodu pobiera pliki do pliku podanego przez id wideo youtube (np nazwy pliku podane przez youtube.com/watch?v= CsBVaJelurE & feature = relmfu byłoby CsBVaJelurE.flv)

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

Chcę skrypt, który będzie wyjściowego pliku YouTube FLV do pliku podanego przez t w tym filmie wideo (w tym przypadku lekcja BASH 2.flv) zamiast zwykłej nazwy wideo. Z góry dziękuję za wszelką pomoc.

+0

+1 ur pytanie –

+0

To jest z łatwością najlepszych Youtube skrypt pobierania tam: https://bitbucket.org/rg3/youtube-dl/wiki/Home Ponieważ wszystkie te skrypty przekazują na skrobiących stronach, musi on być na bieżąco ze strukturą witryny. Może zawierać tytuł wideo w nazwie pliku. –

+0

Dobra rozmowa Niklasa o rozdawaniu linku dl dla skryptu; Oto dedykowany link z większą ilością informacji, dokumentacją i danymi deweloperów: http://rg3.github.com/youtube-dl/. Ludzie powinni zdecydowanie ściągnąć, to świetny skrypt – wvandaal

Odpowiedz

21

OK, więc po dalszych badaniach i aktualizacji mojej wersji youtube-dl, okazuje się, że ta funkcjonalność jest teraz wbudowana bezpośrednio w program, negując potrzebę skryptu powłoki do rozwiązania problemu pobierania listy odtwarzania na youtube. Pełna dokumentacja znajduje się tutaj: (http://rg3.github.com/youtube-dl/documentation.html), ale proste rozwiązanie mojego pierwotnego pytania brzmi następująco:

1) youtube-dl automatycznie przetworzy link do playlisty, nie ma potrzeby indywidualnego podawania adresów URL filmy, które są w nim zawarte (to neguje potrzebę użycia grep do wyszukania "obejrzenia", aby znaleźć unikalny identyfikator wideo) 2) istnieje teraz opcja dołączona do sformatowania nazwy pliku za pomocą różnych opcji, w tym:

  • id: Sekwencja zostanie zastąpiona identyfikatorem wideo.
  • url: sekwencja zostanie zastąpiona przez URL filmu.
  • Uploader: sekwencja zostanie zastąpiona przez pseudonim osoby, która przesłała wideo.
  • data_przesyłki: Sekwencja zostanie zastąpiona datą przesłania w formacie RRRRMMDD.
  • tytuł: sekwencja zostanie zastąpiona literalnym tytułem wideo.
  • stitle: Sekwencja zostanie zastąpiona przez uproszczony tytuł wideo, , ograniczony do znaków alfanumerycznych i myślników.
  • ext: Sekwencja zostanie zastąpiona przez odpowiednie rozszerzenie (np. flv lub mp4).
  • epoka: Sekwencja zostanie zastąpiona przez epokę Uniksa podczas tworzenia pliku .
  • AutoNumber: Sekwencja zostanie zastąpiony przez szereg pięciocyfrowym że będzie zwiększona z każdego pobrania, zaczynając od zera.

składnia tej opcji wyjścia jest następujący (gdzie nazwa jest jedną z opcji przedstawionych powyżej):

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

Jako przykład, aby odpowiedzieć na moje pierwotne pytanie, składnia jest następująca:

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

Jeszcze raz dziękuję tym, którzy odpowiedzieli na moje pytanie, twoja pomoc jest bardzo doceniana.

1

Jeśli chcesz użyć tytułu ze strony youtube jako nazwy pliku, możesz użyć opcji -t z youtube-dl. Jeśli chcesz użyć tytułu ze strony „video lista” i jesteś pewien, że istnieje dokładnie jeden watch? URL dla każdego <span class="title video-title" tytułu, a następnie można użyć mniej więcej tak:

#!/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 

nie testowałem to ponieważ Nie mam przykładowej strony z "listą wideo".

+0

Dzięki za odpowiedź preaorian, opcja -t działa na czas. ale skrypt, który podałeś, zawiera błędy, które muszę sprawdzić. Obecnie pliki same się nie pobierają, ale nie mam jeszcze czasu, aby przetestować twój skrypt i zobaczyć, dlaczego. Uaktualnię ten wątek, jeśli coś znajdę. – wvandaal

+0

Cóż, jak już powiedziałem, nie mam próbki danych wejściowych do testowania skryptu ... –

-2
#!/bin/bash 
# Coded by Biki Teron 
# String replace command in linux 

echo "Enter youtube url:" 
read url1 

wget -c -O index.html $url1 
################################### Linux string replace ################################################## 
sed -e 's/%3A%2F%2F/:\/\//g' index.html > youtube.txt 
sed -i 's/%2F/\//g' youtube.txt 
sed -i 's/%3F/?/g' youtube.txt 
sed -i 's/%3D/=/g' youtube.txt 
sed -i 's/%26/\&/g' youtube.txt 
sed -i 's/%252/%2/g' youtube.txt 
sed -i 's/sig/&signature/g' youtube.txt 
## command to get filename 
nawk '/<title>/,/<\/title>/' youtube.txt > filename.txt ## Print the line between containing <title> and <\/title> . 
sed -i 's/.*content="//g' filename.txt 
sed -i 's/">.*//g' filename.txt 
sed -i 's/.*<title>//g' filename.txt 
sed -i 's/<.*//g' filename.txt 
######################################## Coding to get all itag list ######################################## 

nawk '/"fmt_list":/,//' youtube.txt > fmt.html ## Print the line containing "fmt_list": . 
sed -i 's/.*"fmt_list"://g' fmt.html 
sed -i 's/, "platform":.*//g' fmt.html 
sed -i 's/, "title":.*//g' fmt.html 

# String replace command in linux to get correct itag format 
sed -i 's/\\\/1920x1080\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/1920x1080\/99\/0\/0 by blank . 
sed -i 's/\\\/1920x1080\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/1920x1080\/9\/0\/115 by blank. 
sed -i 's/\\\/1280x720\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/1280x720\/99\/0\/0 by blank. 
sed -i 's/\\\/1280x720\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/1280x720\/9\/0\/115 by blank. 
sed -i 's/\\\/854x480\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/854x480\/99\/0\/0 by blank. 
sed -i 's/\\\/854x480\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/854x480\/9\/0\/115 by blank. 
sed -i 's/\\\/640x360\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/640x360\/99\/0\/0 by blank. 
sed -i 's/\\\/640x360\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/640x360\/9\/0\/115 by blank. 
sed -i 's/\\\/640x360\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/640x360\/9\/0\/115 by blank. 
sed -i 's/\\\/320x240\\\/7\\\/0\\\/0//g'  fmt.html ## Replace \/320x240\/7\/0\/0 by blank. 
sed -i 's/\\\/320x240\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/320x240\/99\/0\/0 by blank. 
sed -i 's/\\\/176x144\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/176x144\/99\/0\/0 by blank. 

# Command to cut a part of a file between any two strings 
nawk '/"url_encoded_fmt_stream_map":/,//' youtube.txt > url.txt 
sed -i 's/.*url_encoded_fmt_stream_map"://g' url.txt 

#Display video resolution information 
echo "" 
echo "Video resolution:" 
echo "[46=1080(.webm)]--[37=1080(.mp4)]--[35=480(.flv)]--[36=180(.3gpp)]" 
echo "[45=720 (.webm)]--[22=720 (.mp4)]--[34=360(.flv)]--[17=144(.3gpp)]" 
echo "[44=480 (.webm)]--[18=360 (.mp4)]--[5=240 (.flv)]" 
echo "[43=360 (.webm)]" 
echo "" 
echo "itag list= "`cat fmt.html` 
echo "Enter itag number: " 
read fmt 

####################################### Coding to get required resolution ################################################# 
## cut itag=? 

sed -e "s/.*,itag=$fmt//g" url.txt > "$fmt"_1.txt 
sed -e 's/\u0026quality.*//g' "$fmt"_1.txt > "$fmt".txt 
sed -i 's/.*u0026url=//g' "$fmt".txt ## Ignore all lines before \u0026url= but print all lines after \u0026url=. 
sed -e 's/\u0026type.*//g' "$fmt".txt > "$fmt"url.txt ## Ignore all lines after \u0026type but print all lines before \u0026type. 
sed -i 's/\\/\&/g' "$fmt"url.txt ## replace \ by & 
sed -e 's/.*\u0026sig//g' "$fmt".txt > "$fmt"sig.txt ## Ignore all lines before \u0026sig but print all lines after \u0026sig. 
sed -i 's/\\/\&ptk=machinima/g' "$fmt"sig.txt ## replace \ by & 
echo `cat "$fmt"url.txt``cat "$fmt"sig.txt` > "$fmt"url.txt ## Add string at the end of a line 
echo `cat "$fmt"url.txt` > link.txt ## url and signature content to 44url.txt 
rm "$fmt"sig.txt 
rm "$fmt"_1.txt 
rm "$fmt".txt 
rm "$fmt"url.txt 
rm youtube.txt 
########################################### Coding for filename with correct extension ##################################### 
if [ $fmt -eq 46 ] 
then 
    echo `cat filename.txt`.webm > filename.txt 

elif [ $fmt -eq 45 ] 
    then 
    echo `cat filename.txt`.webm > filename.txt 

elif [ $fmt -eq 44 ] 
    then 
    echo `cat filename.txt`.webm > filename.txt 

elif [ $fmt -eq 43 ] 
    then 
    echo `cat filename.txt`.webm > filename.txt 

elif [ $fmt -eq 37 ] 
    then 
    echo `cat filename.txt`.mp4 > filename.txt 

elif [ $fmt -eq 22 ] 
    then 
    echo `cat filename.txt`.mp4 > filename.txt 

elif [ $fmt -eq 18 ] 
    then 
    echo `cat filename.txt`.mp4 > filename.txt 

elif [ $fmt -eq 35 ] 
    then 
    echo `cat filename.txt`.flv > filename.txt 

elif [ $fmt -eq 34 ] 
    then 
    echo `cat filename.txt`.flv > filename.txt 

elif [ $fmt -eq 5 ] 
    then 
    echo `cat filename.txt`.flv > filename.txt 

elif [ $fmt -eq 36 ] 
    then 
    echo `cat filename.txt`.3gpp > filename.txt 

else 
    echo `cat filename.txt`.3gpp > filename.txt 

fi 
rm fmt.html 
rm url.txt 
filename=`cat filename.txt` 
linkdownload=`cat link.txt` 
wget -c -O "$filename" $linkdownload 
echo "Download Finished!" 
read 
+1

Uczę się skryptu bash w pobieraniu filmów youtube jest to oparte na najnowszym algorytmie youtube. Wyświetli całą dostępną rozdzielczość wideo. Możesz pobrać formaty plików .webm, .mp4, .flv, .3gpp. – Teron

+0

Przepraszam, ale to nie ma nic wspólnego z pierwotnym pytaniem, -1. – etuardu

0

ten sposób następujące prace i grać ci Titanica z 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}" 

wykorzystuje dekodować i bash, które może być zainstalowane.

0

używam tego skryptu bash ściągnąć dany zbiór utworów z danej listy odtwarzania 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 

Uwaga: „Hasło i” to tytuł (w całości lub części, jeżeli część powinna być unikalna do tej listy odtwarzania) danego filmu z tej listy odtwarzania.

Edit: Można zainstalować youtube-DL przez pip zainstalować youtube-DL

Powiązane problemy