▶️

【yt-dlp】YouTubeの動画ダウンローダー yt-dlpが良い

に公開

はじめに

推しの切り抜き動画を作りたい欲が出てきて、ダウンロードソフトを探索したところ、yt-dlpに遭遇して利用してみたら、最高だったので紹介します。

※動画ダウンロードについて

動画のダウンロード行為は法的にグレーです。
動画のダウンロードについては、利用規約では下記のように明記されています。

  1. 本サービスまたはコンテンツのいずれかの部分に対しても、アクセス、複製、ダウンロード、配信、送信、放送、展示、販売、ライセンス供与、改変、修正、またはその他の方法での使用を行うこと。ただし、(a)本サービスによって明示的に承認されている場合、または(b)YouTube および(適用される場合)各権利所持者が事前に書面で許可している場合を除きます。
    利用規約

ダウンロード対象の動画投稿者が定義している規約があれば、そちらを確認してから利用してください。

また、本ツールを利用する場合は自己責任で。

yt-dlpについて

  • 切り抜き動画とか作る場合とかに使えるソフト。
    • CLIベースのソフト。
    • GUI用ソフト、Parabolicというものもある

https://github.com/yt-dlp/yt-dlp

サポート

導入

Windows

  1. こちらからyt-dlp.exeをダウンロード
  2. 好きな箇所に.exeを配置
  3. コマンドプロンプトで、yt-dlp --versionで確認
  • ffmpegというソフトもインストールする必要がある
winget install --id=Gyan.FFmpeg -e

Linux

  1. 下記コマンドを実行
# yt-dlp のインストール
wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O ~/.local/bin/yt-dlp

# ファイルのパーミッション変更
chmod a+rx ~/.local/bin/yt-dlp
  1. yt-dlp --versionで確認
  2. ffmpegのインストール
sudo apt install ffmpeg

更新

yt-dlp -U

動画ダウンロード

yt-dlp --recode-video mp4 --download-sections "*1:00:58-1:02:03" https://youtu.be/_txHFIWp3SM
  • --recode-video: ファイル形式の指定
  • --download-sections:時間指定してダウンロード
  • URLを指定

音声のみダウンロード

yt-dlp -x --audio-format mp3 --download-sections "*1:00:58-1:02:03" https://youtu.be/_txHFIWp3SM
  • -xを付与することで、音声ダウンロード
  • --audio-formatでファイル形式を指定

複数セクション指定

  • download-sectionsオプションを複数指定
yt-dlp --download-sections "*00:10-00:20" --download-sections "*01:30-01:45" "https://www.youtube.com/watch?v=xxxxxxxxxxx"

複数動画をまとめてダウンロード

  • 一つのコマンドでまとめてダウンロードすることはできない
  • スクリプトファイルに上記コマンドを複数記述し、実行することで実現可能
yt-dlp --download-sections "00:10-00:20,01:30-01:45" "https://www.youtube.com/watch?v=xxxxxxxxxxx"
yt-dlp --download-sections "00:10-00:20,01:30-01:45" "https://www.youtube.com/watch?v=yyyyyyyyyyy"
yt-dlp --download-sections "00:10-00:20,01:30-01:45" "https://www.youtube.com/watch?v=zzzzzzzzzzz"

ファイル名を指定して出力

yt-dlp \
--download-sections "*0:08:10-0:08:20" \
https://youtu.be/oMCu95t9LCc -o "%(title)s - %(section_start)s-%(section_end)s.%(ext)s"

再生リストのリストアップ

  • 動画のダウンロードだけでなく、再生リストに登録されたデータの取得をすることができます。
    • 再生リスト内の限定公開動画のみ列挙するなどの利用が可能
# 特定の再生リストから、限定公開の動画のみを抽出する
yt-dlp --ignore-errors --no-abort-on-error --no-warnings --extractor-args "youtube:lang=ja" --match-filter "availability = 'unlisted'" -O "[Status: %(availability)s] %(title)s - %(webpage_url)s " "https://www.youtube.com/xxxxxxx"
  • URLに再生リスト、チャンネルを指定することが可能

  • --ignore-errors --no-abort-on-error --no-warnings:エラー、警告の非表示

  • --extractor-args "youtube:lang=ja":言語指定。

    • これがないと、タイトルが英語向けのものになってしまうことがある
  • --match-filter "availability = 'unlisted'":フィルタリング。限定公開のみ対象にする

動画データ収集

  • yt-dlpの動画ダウンロード対象のデータ収集方法もついでにまとめる
  • ※yt-dlpの機能ではない

時間取得

  • 動画右クリック / 現時点の動画のURLをコピー

DB

  • NotionとかExcelを利用して、時間指定URLを貼り付けるだけで、yt-dlp用のコマンドを出力させると楽

  • 時間取得(Notion数式)

lets(
  /* Extract the time parameter from the URL */
  url, prop("URL"),
  timeParam, url.split("t=").last().split("&").first(),
  totalSeconds, toNumber(timeParam),
  
  /* Calculate hours, minutes, seconds for start time */
  startHours, floor(totalSeconds / 3600),
  startMinutes, floor((totalSeconds - startHours * 3600) / 60),
  startSeconds, totalSeconds - startHours * 3600 - startMinutes * 60,
  
  /* Calculate end time (add duration seconds or default to 10) */
  added_seconds, if(empty(prop("duration")), 10, prop("duration")),
  endTotalSeconds, totalSeconds + added_seconds,
  endHours, floor(endTotalSeconds / 3600),
  endMinutes, floor((endTotalSeconds - endHours * 3600) / 60),
  endSeconds, endTotalSeconds - endHours * 3600 - endMinutes * 60,
  
  /* Format the times properly */
  startTimeString, format(startHours) + ":" + format(startMinutes).padStart(2, "0") + ":" + format(startSeconds).padStart(2, "0")
  ,
  
  endTimeString, format(endHours) + ":" + format(endMinutes).padStart(2, "0") + ":" + format(endSeconds).padStart(2, "0"),
  
  /* Combine into final format */
  if(empty(url) or not url.contains("t="), 
    "", 
    "*" + startTimeString + "-" + endTimeString
  )
)
/* サブアイテムの有無を確認 */
if(prop("サブアイテム").length() > 0,
  /* サブアイテムが存在する場合、フォーマットを適用して結合 */
  prop("サブアイテム")
    .map("--download-sections \"" +  current.prop("時間") + "\" ")
    .filter(not empty(current))
    .join(""),
  /* サブアイテムがない場合、現在のアイテムの時間を表示(存在する場合) */
  "--download-sections \"" + prop("時間")
)
/* Start with the basic command */
"yt-dlp " + 

/* Add mp3 format option if mp3 property is not "No" */
if(prop("mp3") != false, "-x --audio-format mp3 ", "") + 

/* Add download sections if 時間 (time) property is not empty */
if(not empty(prop("時間2")), "^\n" +prop("時間2") +"^\n", "") + 

/* Always add the URL at the end */
prop("URL2")

+ " -o \"%(title)s - %(section_start)s-%(section_end)s.%(ext)s\"\n"

さいごに

pythonなどを利用して使用することも可能だそうです。
GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader

Discussion