高見知英の技術ログ

技術関係のログをQiitaから移行してきました。プログラミングのほか、使っているアプリの細かい仕様についてなど書いていきます。

ゲームサントラのトラック番号をディスクごとの値でなくサントラでの連番に変換するスクリプトを書いた

先日こちらを買いましてん。

ゲームのサウンドトラックを買ったことがある方はわかると思いますが、これ、PCにリッピングしてMP3ファイルにすると、トラック番号がサウンドトラック全体の連番ではなく、ディスクごとの連番になってしまうんですよね。

で、このサントラはゲームでも珍しい7枚組のサウンドトラックなので、手作業で修正するのはあまりにも手間なのです。

ということで、せっかく前回MP3のID3タグを参照するモジュールを使ったので、今回もpythonで一括修正スクリプトを書きました。

github.com

いちおうREADMEにも書いていますが、とりあえずpipenv installで必要なモジュールがインストールされますので、トラック番号を設定したいファイル群をフォルダごと配置し、スクリプトを実行するだけです。

手抜きのため、フォルダの指定やファイル順序の設定などはしていません。

やってること

やっていることは単純。カレントフォルダ配下をすべて検索し、mp3ファイルを探します。

そして見つけられたらID3タグを確認し、トラック番号を連番に書き換えます。

def scan(trackno: int, dir: Path):
  for f in dir.iterdir():
    if f.is_dir():
      trackno = scan(trackno, f)
    elif f.is_file() and f.name.endswith("mp3"):
      tags = EasyID3(f)
      oldtrack = tags["tracknumber"]
      tags["tracknumber"] = f"{trackno}"
      print(f"> {f.name} {oldtrack} -> {trackno}")
      tags.save()
      f.rename(f.parent / re.sub(r"^\d+(-\d+)?\s*", "", f.name))
      trackno += 1
  return trackno

if __name__ == "__main__":
  scan(1, Path("."))

もしフォルダだった場合は、再帰的にそのフォルダ内も掘っていきます。ついでにファイル名にトラック番号がついていたら、削除します。

本当はアルバムの[Disc 1]などの記述も削除したかったのですが、文字列のデコードがうまくできなかったのでそのままとしました。必要であればあとでエクスプローラーから編集します。

終了後、すべてのファイルを操作したい場合

Windows Media Playerなどでリッピングした場合、初期設定だとサントラはディスクごとに別々のフォルダに保存されているはずなので

エクスプローラーの検索機能より「種類:オーディオ」で検索します。 f:id:TakamiChie:20210318113647p:plain

わたしの場合、音楽は一括して「D:\Users\ユーザー\Music\ゲーム\」に保存しているので、そこにコピーしました。

f:id:TakamiChie:20210318113805p:plain

はい、できあがり