AhFei

AhFei

简洁的写作需要勇气

yt-dlp を使用して YouTube 動画をダウンロード - 簡単なコマンドラインツール

yt-dlp は youtube-dl のフォーク版で、GitHub: yt-dlp/yt-dlp: A youtube-dl fork with additional features and fixes (github.com) です。多くのウェブサイトの動画ダウンロードをサポートしており、YouTube の他に Twitter、Twitch、Bilibili なども対応しています。

特に説明がない限り、記事のコードブロック内のコマンドの順番に従って、一つずつ実行することで目標を達成できます。
対応システム:Debian 系のディストリビューション、Ubuntu や Armbian を含む。他のディストリビューションでも手順に従ってコマンドを少し変更すれば一般的に可能です。

所要時間の見込み:12 分

私は何か間違えたかもしれませんので、何か間違っていたら教えてください!

YouTube-dl は Google の制限により、ダウンロード速度が非常に遅く、最後に使用した時には YouTube のダウンロードができなくなっていました。youtube-dl の GitHub: ytdl-org/youtube-dl: Command-line program to download videos from YouTube.com and other video sites (github.com)

以下は、ネットノートと組み合わせて日常的に使用するためのデモです。

image


全体像(/home/vfly2 をホームディレクトリとして)

yt-dlp は単一ファイルプログラムで、yt-dlp.conf という設定ファイルと、音声と動画を結合するための FFmpeg が必要です。

この記事では、スクリプトファイル、動画リンクファイル、nfo 変換ファイルも含まれています。最終的なファイルの配置は以下の通りです:

/usr/local/bin/
├── ffmpeg
├── ffprobe
├── nfo.sh
├── yt-dlp
└── yt-dlp.conf

/home/vfly2
├── yt-dlp.sh
└── ytdlplist

この 7 つのファイルだけで、一目でわかります。


インストールと設定#

前提ツールのインストール

sudo apt install -y wget curl

Python 3.7+ のバージョンを確認

python --version

yt-dlp のインストール#

ワンクリックでコピーして実行するだけでインストールできます

sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp && sudo chmod a+rx /usr/local/bin/yt-dlp

更新

sudo yt-dlp -U

依存関係の FFmpeg と ffprobe のインストール#

オリジナルの FFmpeg は yt-dlp 用にバグがあるため、yt-dlp はこの GitHub を作成しました: yt-dlp/FFmpeg-Builds: FFmpeg Builds for yt-dlp (github.com)

ワンクリックでコピーして実行するだけでインストールできます

wget https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz && \
tar -Jxv -f ffmpeg-master-latest-linux64-gpl.tar.xz && \
sudo mv ./ffmpeg-master-latest-linux64-gpl/bin/* /usr/local/bin/

# クリーンアップ
rm -r ffmpeg-master-latest-linux64-gpl
rm ffmpeg-master-latest-linux64-gpl.tar.xz

ffmpeg のバージョンを確認し、インストールが成功したことを確認します

ffmpeg -version

これも BBDown に使用できます

設定#

詳細な設定はプロジェクトのホームページを参照してください: https://github.com/yt-dlp/yt-dlp#configuration

sudo vim /usr/local/bin/yt-dlp.conf

設定ファイル内に中国語の文字が含まれてはいけません。そうでないとエラーが発生します。

# ファイル名
-o '%(title)s.%(ext)s'

# サムネイルを jpg に変換
--write-thumbnail
--convert-thumbnails jpg

# プロキシ
#--proxy 127.0.0.1:7890

# その他
--write-description
--write-subs
--compat-options no-live-chat
#--remux-video mkv

# コマンドを実行
# %(filepath,_filename|)q はコマンドの最後に追加されます。
# --exec 'bash /usr/local/bin/nfo.sh'

ここではダウンロードディレクトリを設定せず、スクリプト内で設定します

--paths /home/vfly2/youtube

nfo 変換スクリプト#

Emby と組み合わせて使用する場合は、以下の部分を確認してください。そうでない場合はスキップしてください。

設定ファイルには --write-description オプションがあり、これは動画の説明(description ファイル)も保存しますが、純粋なテキストであるため、Emby では認識できません。以下は、ダウンロード後に --exec オプションを利用して、description ファイルを Emby が認識できる nfo ファイルに変換するスクリプトを実行するものです。


まず、設定ファイル内の --exec 'bash /usr/local/bin/nfo.sh' のコメントを外します。 --exec は動画のパスと名前をスクリプトに渡します。

次に変換スクリプトを作成します

sudo touch /usr/local/bin/nfo.sh && sudo chmod a+x /usr/local/bin/nfo.sh

編集します

sudo vim /usr/local/bin/nfo.sh
#!/bin/bash

# 一時ファイルを生成
tee nfo1.temp <<-'EOF'
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<movie>
  <plot><![CDATA[
EOF

tee nfo2.temp <<-'EOF'

]]></plot>
</movie>
EOF


# Emby が認識できる nfo ファイルを生成し、改行符を追加
file=$1
filename=${file%.*}
nfo=${filename}.nfo
description=${filename}.description

touch "${nfo}";
cat nfo1.temp > "${nfo}";
# `sed` コマンドを使用して、読み込んだ `${description}` ファイルの各行の末尾に `<br/>` 改行マークを追加します。
sed 's#$#&<br/>#g' "${description}" >> "${nfo}";
cat nfo2.temp >> "${nfo}";

# 一時ファイルを削除
rm nfo1.temp nfo2.temp

これでダウンロード後にスクリプトが呼び出され、変換が実行されます。

使用#

YouTube に関しては、デフォルトで WebM 形式でダウンロードされ、Emby が認識できます。

yt-dlp https://www.youtube.com/watch?v=gIbfYsQfNWs

プロキシを使用する場合

yt-dlp --proxy http://127.0.0.1:10809 https://www.youtube.com/watch?v=gIbfYsQfNWs

yt-dlp --proxy socks5://127.0.0.1:10808/ https://www.youtube.com/watch?v=gIbfYsQfNWs

バッチダウンロード#

前の内容ではわかりにくいですが、コマンドラインツールはユーザーインターフェースツールに比べて、迅速で簡便な自動化の利点があります。以下の小さなスクリプトを使ってその利点を発揮します。

バッチダウンロードスクリプト#

まず、スクリプトファイルを作成します:

filename="yt-dlp.sh"
touch $filename && chmod +x $filename && vim $filename

内容を編集します:

vim yt-dlp.sh

URLLIST 変数の値を変更する必要があります。これは後で保存する動画の URL のファイルの絶対パスです。

#!/bin/bash
# URL を含むファイルに従って、複数のプラットフォーム(YouTube など)の動画をダウンロードします 

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# プロキシが必要な場合
# export http_proxy="http://127.0.0.1:1080"
# export https_proxy="http://127.0.0.1:1080"
# export no_proxy=127.0.0.1,localhost


# 動画 URL を含むファイルのパス
URLLIST="/home/vfly2/ytdlplist"

# ファイルの指定行の内容を取得する関数、変数1はファイルパス、変数2は行番号
function grepline(){
    url=$(cat ${1} | head -n ${2} | tail -n 1)
    echo ${url}
}


LINE=1
URL=$(grepline ${URLLIST} ${LINE})   # 最初の行を取得
ENDLINE=$(cat ${URLLIST} | tail -n 1)

# 各行を取得し、内容が EOF になるまで
until [ "${URL}" == "${ENDLINE}" ]
do

/usr/local/bin/yt-dlp ${URL}
# /usr/local/bin/yt-dlp ${URL} --paths /home/vfly2/youtube   # ここでダウンロードディレクトリを指定できます
LINE=$((${LINE}+1))   # 1 を加算
URL=$(grepline ${URLLIST} ${LINE})   # 次の行を取得し、最後の行に達したらループを終了

done

/usr/local/bin/yt-dlp ${ENDLINE}   # 最後の行の URL のダウンロードを補完

動画リンクを ytdlplist に保存します:

vim /home/vfly2/ytdlplist

一行に一つのリンクを記入します

https://www.youtube.com/watch?v=gIbfYsQfNWs
https://www.youtube.com/watch?v=laIvjmdM0Ww

スクリプトを実行します(デフォルトでは現在のディレクトリにダウンロードされます)

bash -ex ./yt-dlp.sh

ネットノートとの組み合わせ#

毎回一つか二つの動画をダウンロードするだけの場合、ターミナルに接続してファイルを編集し、スクリプトを実行するのは少し面倒です。

以前のブログでネットノートの紹介をしました:私が 2 年間使用しているミニマリストウェブノート - 承飛之咎 (vfly2.com)、これは curl を使って内容を取得できます。

ネットノートを通じてリンクを随時保存し、curl でリンクを取得し、一定の時間ごとにスクリプトを自動実行して動画をダウンロードすれば、操作を省くことができます。

リアルタイム性は少し劣りますが、AhFei はダウンロードディレクトリを Emby のメディアライブラリに変更し、Emby を通じて視聴しています。こうすることで高品質の動画が直接保存され、見終わった後に不要なものを削除し、動画が削除される心配もなく、別途ダウンロードして保存する必要もありません。


上記のスクリプトの流れに似ています:

filename="yt-dlp.sh"
touch $filename && chmod +x $filename && vim $filename
vim yt-dlp.sh

URLLIST に加えて、WEBLIST という変数も追加しました。これはネットノートの URL で、ここでは AhFei が構築したデモを使用します: https://forward.vfly.app/ytdlplist 、リンクをここにコピーし、一行ごとに記入します。

読者の皆さんはこの公開インスタンスを直接使用するか、自分で構築できます:私が 2 年間使用しているミニマリストウェブノート - 承飛之咎 (vfly2.com)

#!/bin/bash
# 複数のプラットフォーム(YouTube など)の動画をダウンロードします

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# export http_proxy="http://127.0.0.1:1080"
# export https_proxy="http://127.0.0.1:1080"
# export no_proxy=127.0.0.1,localhost


# 動画 URL を含むファイルのパス
URLLIST="/home/vfly2/ytdlplist"
WEBLIST="https://forward.vfly.app/ytdlplist"

# ウェブ上の動画リンクをダウンロード
curl -k $WEBLIST > $URLLIST


# ファイルの指定行の内容を取得する関数、変数1はファイルパス、変数2は行番号
function grepline(){
    url=$(cat ${1} | head -n ${2} | tail -n 1)
    echo ${url}
}


LINE=1
URL=$(grepline ${URLLIST} ${LINE})   # 最初の行を取得
ENDLINE=$(cat ${URLLIST} | tail -n 1)

# 各行を取得し、内容が EOF になるまで
until [ "${URL}" == "${ENDLINE}" ]
do

# echo ${URL}
/usr/local/bin/yt-dlp ${URL}
# /usr/local/bin/yt-dlp ${URL} --paths /home/vfly2/youtube   # ここでダウンロードディレクトリを指定できます
LINE=$((${LINE}+1))   # 1 を加算
URL=$(grepline ${URLLIST} ${LINE})   # 次の行を取得し、最後の行に達したらループを終了

done

/usr/local/bin/yt-dlp ${ENDLINE}   # 最後の行の URL のダウンロードを補完
# ウェブノートに完了のフラグを送信
echo -e "\nabove have done, but may skip" >> $URLLIST
curl -k --data-urlencode "text@${URLLIST}" $WEBLIST

これで毎回 SSH で以下のコマンドを実行するだけで済み、ファイルを編集してリンクをコピーする必要がなくなります。

bash -ex ./yt-dlp.sh

原文リンク: https://blog.vfly2.com/2023/10/download-youtube-videos-with-yt-dlp/

版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 承飞之咎 (blog.vfly2.com)

更新を保ち続けて ٩(・̤̀ᵕ・̤́๑)ᵒᵏᵎᵎᵎᵎ 明確で再現可能な実用的なスキルを提供し、RSS での購読を歓迎し、コメントや指摘も歓迎します。

Telegram グループ https://t.me/vfly2 で、記事の手順に関する問題を共有できます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。