目次
yt-dlpとは?
yt-dlp
は、動画サイトからコンテンツをダウンロードできる便利なツールです。
このツールは、YouTubeをはじめとする多くのプラットフォームに対応しており、動画や音声を簡単に取得できます。また、形式変換やメタデータの取得も可能です。
GitHub – yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader
A feature-rich command-line audio/video downloader – yt-dlp/yt-dlp
ただし、著作権のあるコンテンツを無断でダウンロードすることは法律で禁止されています。 使用する際は必ず対象コンテンツの利用規約を確認しましょう
前提
- 使った環境
- Pythonが使える状態
- yt-dlpをインストール済み
- 目標
- 動画の音声をWAVファイルに変えて保存する
- 動画の情報をJSONファイルに保存する
- サムネイル画像を動画タイトルごとに整理して保存する
実験でやったこと 📊
0. 環境設定
これを見ながら環境設定しました!
#python3.9.7
#プロジェクト作成
mkdir yt-dlp-test
cd yt-dlp-test
#仮想環境ファイルを作成
python -m venv venv
#仮想環境を起動(勝手に環境内のコマンドラインへ)
source venv/bin/activate
#仮想環境内でインストール
pip install yt-dlp
1. yt-dlpの基本機能を使う
基本的には、このコマンドを打つだけで指定したURLの動画がダウンロードされます。
yt-dlp "コピーしたURL"
音源とメタデータを取得するオプションについて
yt-dlpはかなり柔軟なツールで、100個以上のオプションが存在します。
例えば、Youtubeだと、音声データの形式や動画データの質、サムネの取得などはもちろん、 タイトルやアーティストなど動画のメタデータなども取得することができます。
オプションを利用して使って次のことをしました:
- 音声だけを取り出してWAV形式で保存 (
x --audio-format wav
) - 動画の情報をJSON形式で保存 (
-write-info-json
) - サムネイル画像を保存 (
-write-thumbnail
)
ターミナルでの実行例 🖥️
以下のコマンドをターミナルで実行することで、動画の音声をWAV形式で保存し、JSONファイルとサムネイルを取得できます。
yt-dlp -x --audio-format wav --write-info-json --write-thumbnail -o "downloads/temp/%(title)s.%(ext)s" <動画URL>
毎回書くのが面倒なのと、今後バッチ処理で取得したいので、pythonにしました。
2. タイトルごとのフォルダを作って保存
- 一度
temp
というフォルダに全て保存してから、ファイル名からタイトルを読み取ってフォルダを作成。 - 結果は以下のように整理されました:
downloads/
└── music/
└── <動画タイトル>/
├── <動画タイトル>.wav
├── <動画タイトル>.info.json
└── <動画タイトル>.jpg
3. Pythonスクリプトの工夫
- yt-dlpを使って音声をWAV形式で取り出す
- JSONファイルの中身を読み込んで表示する
- サムネイルをタイトルごとに移動して整理する
使ったPythonコード 🐍
import subprocess
import json
import os
import re
# yt-dlpで動画をダウンロードしてWAVファイルに変換し、サムネイルを保存
def download_and_convert_to_wav_with_thumbnail(url, base_output_path):
temp_template = f"{base_output_path}/temp/%(title)s.%(ext)s"
command = [
"yt-dlp",
"-x", # 音声を抽出
"--audio-format", "wav", # WAV形式で保存
"--write-info-json", # 動画の情報を保存
"--write-thumbnail", # サムネイル画像を保存
"-o", temp_template, # 一時保存用のテンプレート
url
]
subprocess.run(command, check=True)
# 一時フォルダ内のファイルを整理
temp_dir = f"{base_output_path}/temp"
for file_name in os.listdir(temp_dir):
title_match = re.match(r"(.+)\\\\\\\\.(wav|info\\\\\\\\.json|jpg|png|webp)", file_name)
if title_match:
title = title_match.group(1)
extension = title_match.group(2)
final_dir = os.path.join(base_output_path, "music", title)
os.makedirs(final_dir, exist_ok=True)
old_path = os.path.join(temp_dir, file_name)
new_path = os.path.join(final_dir, file_name)
os.rename(old_path, new_path)
# JSONファイルの中身を表示
def show_metadata(base_output_path):
music_dir = os.path.join(base_output_path, "music")
for root, dirs, files in os.walk(music_dir):
for file_name in files:
if file_name.endswith(".info.json"):
json_path = os.path.join(root, file_name)
with open(json_path, 'r', encoding='utf-8') as f:
metadata = json.load(f)
print(f"Metadata for {file_name}:")
print(json.dumps(metadata, indent=4, ensure_ascii=False))
# メイン処理
def main():
url = "<https://www.youtube.com/watch?v=XXXXXXXXXXX>" # ダウンロードする動画のURL
base_output_path = "./downloads" # 保存先フォルダ
os.makedirs(f"{base_output_path}/temp", exist_ok=True)
download_and_convert_to_wav_with_thumbnail(url, base_output_path)
show_metadata(base_output_path)
if __name__ == "__main__":
main()
これにより、一時フォルダdownloads/tempに必要なファイルが保存されます。その後、Pythonスクリプトでフォルダ整理を行います。
実験の結果 📊
- WAVファイルを保存できた
downloads/music/<動画タイトル>.wav
- サムネイル画像を保存できた
downloads/music/<動画タイトル>.jpg
- 動画の情報をJSON形式で保存し、内容を確認できた
- JSONファイルからタイトルや再生回数などを確認可能
気づいたこと 🤔
- 良かった点:
- yt-dlpはとても便利で、音声だけを取り出したり情報を保存する機能が簡単に使えた。
- Pythonで整理することで、保存場所をきちんと分けられた。
- 改善できる点:
- もっといろいろな動画サイトに対応するオプションを試したい。
- サムネイルの形式を選べるようにするとさらに便利になる。
コメント