yt-dlpでアルバムを落とすときに便利かもしれないスクリプト

アルバムを落とす

そのままの意味でYouTubeMusicから落とすときなどに便利かもしれないスクリプトです。
私が使っていて特に不満を感じないだけでなにか不備があるかもしれないので、そのときはClaudeに修正を依頼してください。

.sh版

Info
macOS,Ubuntu,ArchLinuxで動作検証しています。
#!/bin/bash

# 設定
OUTPUT_DIR="$HOME/Music"
FORMAT="mp3"

# コマンドライン引数をチェック
if [ $# -eq 0 ]; then
    echo "URLを指定してね"
    exit 1
fi

# 引数を URL として使用
URL="$1"

# 出力ディレクトリが存在しない場合は作成
mkdir -p "$OUTPUT_DIR"

# yt-dlp コマンドを実行
yt-dlp "$URL" \
    --default-search "ytsearch" \
    --add-header "Accept-Language:ja-JP" \
    --add-metadata \
    --embed-metadata \
    -f "bestaudio[acodec^=opus]/best" \
    -x \
    --audio-format "$FORMAT" \
    --audio-quality 0 \
    --embed-thumbnail \
    --convert-thumbnails jpg \
    --ppa "ThumbnailsConvertor:-qmin 1 -q:v 1 -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\"" \
    -o "$OUTPUT_DIR/%(album)s/%(playlist_index)s - %(title)s.%(ext)s" \
    --parse-metadata "playlist_index:%(track_number)s" \
    --parse-metadata "%(upload_date).4s:%(meta_year)s" \
    --parse-metadata "%(upload_date).4s:%(meta_date)s" \
    --parse-metadata "%(artists.0)s:%(meta_album_artist)s" \
    --parse-metadata "n_entries:%(meta_totaltracks)s" \
    --no-warnings

exit_code=$?

if [ $exit_code -eq 0 ]; then
    echo "ダウンロードが完了しました!"
    echo "保存先: $OUTPUT_DIR"
else
    echo "エラーが発生しました。終了コード: $exit_code"
fi

exit $exit_code

これを適当な名前で保存して(例:album-dl.sh),chmodで実行可能な権限を付けてください。

使い方は

./album-dl.sh https://music.youtube.com/playlist?list=xxxxxxx..

これで~/Musicにアルバム名でフォルダが作成され、その中にダウンロードされます。

.py版

import os
import sys
import subprocess
from pathlib import Path

def main():
    # 設定
    output_dir = os.path.expanduser("~/Music")
    audio_format = "mp3"

    # コマンドライン引数をチェック
    if len(sys.argv) < 2:
        print("URLを指定してね")
        sys.exit(1)

    # 引数をURLとして使用
    url = sys.argv[1]

    # 出力ディレクトリが存在しない場合は作成
    os.makedirs(output_dir, exist_ok=True)

    # yt-dlp コマンドを構築
    cmd = [
        "yt-dlp", url,
        "--default-search", "ytsearch",
        "--add-header", "Accept-Language:ja-JP",
        "--add-metadata",
        "--embed-metadata",
        "-f", "bestaudio[acodec^=opus]/best",
        "-x",
        "--audio-format", audio_format,
        "--audio-quality", "0",
        "--embed-thumbnail",
        "--convert-thumbnails", "jpg",
        "--ppa", "ThumbnailsConvertor:-qmin 1 -q:v 1 -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\"",
        "-o", f"{output_dir}/%(album)s/%(playlist_index)s - %(title)s.%(ext)s",
        "--parse-metadata", "playlist_index:%(track_number)s",
        "--parse-metadata", "%(upload_date).4s:%(meta_year)s",
        "--parse-metadata", "%(upload_date).4s:%(meta_date)s",
        "--parse-metadata", "%(artists.0)s:%(meta_album_artist)s",
        "--parse-metadata", "n_entries:%(meta_totaltracks)s",
        "--no-warnings"
    ]

    # サブプロセスでコマンドを実行
    try:
        result = subprocess.run(cmd, check=True, text=True, stderr=subprocess.PIPE)
        print("ダウンロードが完了しました!")
        print(f"保存先: {output_dir}")
        return 0
    except subprocess.CalledProcessError as e:
        print(f"エラーが発生しました。終了コード: {e.returncode}")
        if e.stderr:
            print(f"エラー内容: {e.stderr}")
        return e.returncode

if __name__ == "__main__":
    sys.exit(main())

これを適当な名前で保存してください。(例:album-dl.py)
使い方は

python album-dl.py https://music.youtube.com/playlist?list=xxxxxxx..

共通して必要な手順

いずれもpythonの実行できる環境・yt-dlp・ffmpeg・mutagenが必要です。

特徴

特徴としてはアルバムアートの埋め込み時にサムネイルを1:1にクロップして正方形にしている点です。
あとは色々メタデータをゴニョゴニョしている点ですかね…。

終わり

まぁこんなもんですかね…。

いちいち打つのとか面倒くさいのでスクリプトを書くのはいいです。
よきシェルライフを。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。