web-dev-qa-db-ja.com

再生リストからYouTubeファイルをダウンロードするためのシェルスクリプト

プレイリストからすべてのYouTube動画をダウンロードし、YouTube動画自体のタイトルに基づいて特定のファイル名で保存するbashスクリプトを記述しようとしています。これまでのところ、私がやりたいことを行う2つの別々のコードがありますが、それらを組み合わせて1つのユニットとして機能させる方法がわかりません。

次のコードは、特定のページのすべてのYouTube動画のタイトルを検索します。

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

そして、このコードはファイルをyoutubeビデオIDで指定されたファイル名にダウンロードします(例:youtube.com/watch?v=CsBVaJelurE)で指定されたファイル名&feature = relmfuはCsBVaJelurE.flv)

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

単にビデオID名ではなく、ビデオのタイトル(この場合はBASHレッスン2.flv)で指定されたファイル名にyoutube .flvファイルを出力するスクリプトが必要です。すべての助けを事前に感謝します。

19
wvandaal

わかりましたので、私のバージョンのyoutube-dlをさらに調査して更新すると、この機能がプログラムに直接組み込まれ、YouTubeでのプレイリストのダウンロードの問題を解決するためのシェルスクリプトが不要になったことがわかります。完全なドキュメントはここにあります:( http://rg3.github.com/youtube-dl/documentation.html )しかし、私の元の質問に対する簡単な解決策は次のとおりです:

1)youtube-dlはプレイリストリンクを自動的に処理します。そこに含まれている動画のURLを個別にフィードする必要はありません(これにより、grepを使用して「watch?」を検索して一意の動画IDを見つける必要がなくなります

2)以下を含むさまざまなオプションでファイル名をフォーマットするためのオプションが含まれています。

  • id:シーケンスは動画IDに置き換えられます。
  • url:シーケンスは動画のURLに置き換えられます。
  • アップローダー:シーケンスは、動画をアップロードした人のニックネームに置き換えられます。
  • upload_date:シーケンスはYYYYMMDD形式のアップロード日で置き換えられます。
  • title:シーケンスは文字通りのビデオタイトルに置き換えられます。
  • ext:シーケンスは適切な拡張子(flvやmp4など)に置き換えられます。
  • エポック:ファイルの作成時にシーケンスはUnixエポックに置き換えられます。
  • autonumber:シーケンスは5桁の数字に置き換えられ、0から始まり、ダウンロードごとに増加します。

この出力オプションの構文は次のとおりです(NAMEは上記のオプションのいずれかです)。

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

例として、私の元の質問に答えるために、構文は次のとおりです。

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

私の質問に回答してくれた方々に改めて感謝します。

24
wvandaal

YouTubeページのタイトルをファイル名として使用する場合は、-tyoutube-dlオプションを使用できます。 「ビデオリスト」ページのタイトルを使用する場合、watch?のタイトルごとに<span class="title video-title"のURLが1つだけあることが確実であれば、次のように使用できます。

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

「ビデオリスト」ページの例がないため、テストしませんでした。

1

この次のメソッドは、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}"

あなたがインストールしたかもしれない、それはデコードとbashを使用します。

0
term89

このbashスクリプトを使用して、特定の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

注:「キーワードi」は、その再生リスト内の特定の動画のタイトル(全体または一部。一部の場合は、その再生リストに固有である必要があります)です。

編集:pip install youtube-dlでyoutube-dlをインストールできます

0
Nikhil Sharma