2016-12-24 5 views
2

YouTubeのビデオURLから最初にx秒トリミングしたmp3をダウンロードしたいと思います。
youtube-dlがYouTubeからローカルマシンに動画をダウンロードできることがわかりました。しかし、youtube-dlのmanページを見ると、トリムオプションが見つかりませんでした。Bash:YouTube URLからトリムされたmp3をダウンロードするbashスクリプト

ダウンロードしたmp3ファイルをトリミングするためにffmpegを使用しようとしました。
これを行う代わりに2つのステップがあります。私は同じことをする1つのbashスクリプトを書くのが好きです。
私の試みは以下の通りです。

しかし、私は1つの場所で立ち往生しました:
"出力ファイルの可変名をYOUTUBE-DLから取得する方法は?"
は、スクリプトは以下のとおりである:

# trim initial x seconds of mp3 file 
# e.g. mytrim https://www.youtube.com/watch?v=dD5RgCf1hrI 30 
function mytrim() { 
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1 
    ffmpeg -ss $2 -i $OUTPUT_MP3 -acodec copy -y temp.mp3 
    mv temp.mp3 $OUTPUT_MP3 
    } 

変数値$ OUTPUT_MP3を取得する方法は?
echo "%(タイトル)s。%(ext)s"は逐語的な出力を与え、出力ファイル名は与えません。

スクリプトを動作させるにはどうすればよいですか?

ヘルプは高く評価されます。

+1

1.テキストファイルから曲をダウンロードするにはyoutube-dlの出力ファイルですが、その名前を '-i'値として' ffmpeg'に渡すことはできませんか? 2. 'ffmpeg -i file 2> 1 |の出力を解析することができます。 grep -i title'を実行して、ファイルに埋め込まれているタイトル名を抽出します。または、 'ffmpeg -i file'の出力を見て、必要なデータを与える別のキー値があるかどうか確認してください。いくつか小さなサンプルを期待してファイル名などをあなたのQ.に追加すると助けになるかもしれません。 – shellter

+0

私はあなたの問題に答えるのに役立つ方向をあなたに指摘しようとしています。最初に 'ffmpeg -i file 2>&1 | grep -i title'は何か役に立つものを作り出しています。それがあなたが使用したいと思う正確な値を示しているなら、あなたは 'OUTPUT_MP3 = $(ffmpeg -i file 2>&1 | grep -i title')を意味すると思います。そうでなければ、サンプルデータを使用してQを改善する必要があります。幸運です。 – shellter

+0

@shellter私はyoutube-dlから作成された出力ファイル名、例えばhello.mp3を取得しますが、スクリプトにはわかりません。 –

答えて

4

youtube-dlは、実際に何もダウンロードしないが、stdoutに計算されたファイル名を与えるオプションをサポートしています。

mytrim() { 
    local downloaded_file 
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1 
    downloaded_file=$(youtube-dl --get-filename --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1) 
    ffmpeg -ss $2 -i "${downloaded_file}" -acodec copy -y temp.mp3 
    mv temp.mp3 "${downloaded_file}" 
} 
+0

しかし、mytrim https://www.youtube.com/watch?v=dD5RgCf1hrI 30を試してみたところ、Bashチュートリアル1 - Hello World.webm:そのようなファイルやディレクトリは見つかりませんでした。 ITは失敗します。 –

+0

@BhishanPoudel:「mytrim」youtube.com/watch ... "を実行するとどうなりますか? (ファイル名の前後にdbl-quotesを付けて)。がんばろう。 – shellter

+0

@BhishanPoudelこれはcopy-n-pasteエラーのようです(または古い 'youtube-dl'スクリプトを使用しています - 私のバージョンは' 2016.12.01'です) –

1

おかげでたくさんの@umlaute、
は、私は私のbash_profileに以下の機能を追加しました:

# download best video quality using youtube-dl 
# usage: myvid https://youtu.be/450p7goxZqg?t=4 
function myvid() { 
    youtube-dl -f bestvideo+bestaudio "$1" 
    rm -r youtube_video_time.txt 
} 

# usage: mymp3 youtube_video_url 
mymp3() { 
    local downloaded_file 
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1 
    downloaded_file=$(youtube-dl --get-filename --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1) 
} 

# initial x seconds trimmed mp3 song 
# mytrim 5 https://www.youtube.com/watch?v=iLQxbEkN85o 
mytrim() { 
    local downloaded_file 
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $2 
    downloaded_file=$(youtube-dl --get-filename --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $2) 
    ffmpeg -ss $1 -i "${downloaded_file}" -acodec copy -y temp.mp3 
    mv temp.mp3 "${downloaded_file}" 
    clear 
    echo "${downloaded_file}" 
    # Now replace whitespace by underscore 
    find . -type f -name "* *.mp3" -exec bash -c 'mv "$0" "${0// /_}"' {} \; 
    # Lowercase the file name 
    for i in $(find . -name '*[A-Z]*.mp3' -type f); do mv "$i" "$(echo $i|tr A-Z a-z)"; done 
} 

あなたはANを作成

IN_URL="/Volumes/Media/Music/download_youtube_mp3/songs.txt" 
ODIR="downloaded_songs/%(title)s.%(ext)s" 
youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 --audio-quality=320k --output $ODIR --batch-file=$IN_URL 
関連する問題