【python】yt-dlpを使って音源を取得する

目次

yt-dlpとは?

yt-dlpは、動画サイトからコンテンツをダウンロードできる便利なツールです。

このツールは、YouTubeをはじめとする多くのプラットフォームに対応しており、動画や音声を簡単に取得できます。また、形式変換やメタデータの取得も可能です。

ただし、著作権のあるコンテンツを無断でダウンロードすることは法律で禁止されています。 使用する際は必ず対象コンテンツの利用規約を確認しましょう


前提

  • 使った環境
    • 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スクリプトでフォルダ整理を行います。

実験の結果 📊

  1. WAVファイルを保存できた
    • downloads/music/<動画タイトル>.wav
  2. サムネイル画像を保存できた
    • downloads/music/<動画タイトル>.jpg
  3. 動画の情報をJSON形式で保存し、内容を確認できた
    • JSONファイルからタイトルや再生回数などを確認可能

気づいたこと 🤔

  • 良かった点:
    • yt-dlpはとても便利で、音声だけを取り出したり情報を保存する機能が簡単に使えた。
    • Pythonで整理することで、保存場所をきちんと分けられた。
  • 改善できる点:
    • もっといろいろな動画サイトに対応するオプションを試したい。
    • サムネイルの形式を選べるようにするとさらに便利になる。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次