すぐ忘れるのでメモ

c++初心者です

Distinction2000のmp3ファイルを結合

Distinction2000でダウンロードしてきた単語が単語,例文ごとに細かく分けられていたので,結合してみた.ffmpegが使える環境が必要.以下は,ubuntu22.04で実行.

プログラムの中身

  • 最初の4桁の数字が同じファイルを1つにまとめる.4桁の数字の次の数字の順にならべる.
  • ファイル名は4桁の数字_単語名.mp3
  • TAG付けは,曲名=ファイル名,アーティスト=atsu,アルバム=Distinction2000
  • 出力先はoutputと言う名のディレクト

ChatGPTにお願いして作成したpythonコード

import os
import re
import subprocess
import eyed3

def embed_tags(file_path, title, artist="atsu", album="Distinction2000"):
    audiofile = eyed3.load(file_path)

    if not audiofile.tag:
        audiofile.initTag()

    audiofile.tag.title = title
    audiofile.tag.artist = artist
    audiofile.tag.album = album

    audiofile.tag.save()

def merge_and_tag(prefix):
    # カレントディレクトリ内の該当するMP3ファイルを取得
    mp3_files = [f for f in os.listdir() if f.endswith('.mp3') and f.startswith(f'{prefix}.')]

    # prefix の後に続く英単語を抽出
    word_match = next((re.search(f'{prefix}\.0 (\w+)', f) for f in mp3_files if f.startswith(f'{prefix}.0 ')), None)
    if not word_match:
        print(f"No matching file found for prefix {prefix}!")
        return

    word = word_match.group(1)

    # prefix の後に続く数字でソートするための関数
    def sorting_key(filename):
        match = re.search(f'{prefix}\.(\d+)', filename)
        if match:
            return int(match.group(1))
        return float('inf')  # 数字がない場合、最後になるようにする

    # ソート
    files_to_merge = sorted(mp3_files, key=sorting_key)

    # 出力ディレクトリとファイル名
    output_dir = "output"
    output_file = os.path.join(output_dir, f"{prefix}_{word}.mp3")

    # 出力ディレクトリが存在しない場合、作成
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # ffmpeg コマンドを構築
    input_files_str = " ".join([f"-i \"{f}\"" for f in files_to_merge])
    cmd = f"ffmpeg {input_files_str} -filter_complex concat=n={len(files_to_merge)}:v=0:a=1 -acodec libmp3lame {output_file}"

    # コマンドの実行
    subprocess.call(cmd, shell=True)

    # タグ埋め込み
    embed_tags(output_file, f"{prefix}_{word}")


# 0004 から 0007 までの処理
for i in range(1, 2001):
    merge_and_tag(str(i).zfill(4))