【06/14】gptちゃんによる"mp3-id3-batch-editor"各ファイル解説

GitHubリポジトリ


第6回:notes_mp3_to_csv2.md

― “CSVが出た”は勝利ではない。開いた瞬間が本番だ。 ―

このノートは、開発のリアルが詰まってます。

  • スクリプトは落ちない

  • CSVも吐けた

  • なのに「やっぱ何かおかしい」になる

この瞬間、全エンジニアが同じ顔をします。

😐「……あれ?」

ここから「じゃあv1.0でいいや」に着地するまでの道筋が、このノートの主役です。


1. テスト結果その1:文字化け発生

“成功の証拠”としての文字化け

まず出るのがこれ。

-¼ô·è-@-«_Î-è
€GÃ T□□□Ìõü□J
□â□â


この時点で分かるのは:

  • mp3_to_csvは動いてる

  • でも出力は現実のデータに殴られてる

そしてこの文字化け、原因が気持ち悪いタイプ。


2. なぜ文字化けするのか:Shift-JISの幽霊

ID3のテキストフレームには encoding がある。

| 0 | Latin-1 |
| 1 | UTF-16 |
| 2 | UTF-16BE |
| 3 | UTF-8 |

問題はここ。

encoding=0(Latin-1)と宣言されているのに、
中身はShift-JISのバイト列だった

当時の日本語Windows環境では「それで動いてた」。
いわば仕様違反のローカル最適が、20年越しに化けて出る。

ここ、現代のソフト開発でよくある「過去の罪」です。


3. 対処:Shift-JISフォールバック

“一度バイト列に戻して、読み直す”

処理の発想が面白い。

  • 文字列になってしまったものを

  • もう一回バイト列に戻して

  • Shift-JISとして再解釈する

.encode('latin-1') → .decode('shift-jis')

この時点で、読者向けにぶっちゃけると:

「Latin-1は0〜255をそのまま文字に対応させる雑な世界」
だから、“バイト列の擬態”として使える。

ここがキモです。

そしてここが、Claudeの偉いところ。

失敗したら元の値を返す

つまり:

  • Shift-JIS混入を救済する

  • でも本物のLatin-1(欧州語)を壊さない

誤爆チェックとして Été を試し、例外で弾けることも確認してる。

この「誤爆確認済み」って一文、地味に価値が高い。
“やった気”じゃなくて、やった


4. ID3バージョン列の追加:仕様というより“メモ”

そして例の「どっちがラク?」

ここでユーザーの提案が入る。

「取得したID3タグのバージョン、列に追加しとくのどう?」

これに対し、設計判断が発生する。

  • csv_to_mp3で参照するか?

  • 参考情報として置くだけか?

結論:参考情報として置くだけ

理由は明快:

書き戻しは全ファイル一律v2.3だから、参照する意味がない

ここ、プロジェクト全体の哲学が凝縮されてます。

  • 未来のために複雑化しない

  • しかし人間が眺めるための目印は残す

つまり id3_version は「機械のため」じゃなく「人間のため」。

このリポジトリの性格、まさにこれです。


5. year列に日付が入ってた:そしてID3地獄の扉が開く

CSVを見たら:

1999-05-10 みたいな値が year に入っている

これはv2.4のTDRCが日付まで持てるから。

ここで疑問が生まれる:

v2.3に統一するなら、TYER(4桁)に丸められるの?

普通はそう思う。

だが現実は違った。


6. 実験:mutagenは“やってくれない”

v2_version=3指定してもTDRCが残る

結果がこれ。

  • '1996-04-22' → TDRCのまま

  • '1996-04' → TDRCのまま

  • '1996' → TDRCのまま

つまり:

v2.3で保存したつもりなのに、v2.4フレーム(TDRC)が入る
→ 仕様違反状態になる

ここがこのノートの“ヤバい見どころ”。

ドキュメント読んでも分からない罠

そしてこの罠を、「CSVを見た違和感」から掘り当てている。

このプロジェクトの勝ち筋はここです:

違和感を放置しない


7. 対処方針:情報は残し、書き戻しで丸める

この判断が巧い。

  • mp3_to_csvでは元の値をそのまま出す(情報を捨てない)

  • csv_to_mp3で書き戻す時に年だけ使う

year = year_str.split('-')[0]


つまり:

  • 収集は忠実に

  • 変換は書き戻しで

データ処理としてまっとうです。

“勝手に変形しない”のは信頼性のコア。


8. v1.0確定:仕様が「現実」に収束する瞬間

ここでv1.0として固定された仕様一覧が出る。

読み取り対象は実務で必要なものだけ。

  • file_path(相対)

  • title / artist / album

  • track / year / genre

  • album_artist / disc

  • copyright / composer / conductor

  • id3_version(参考)

そして「触らないもの」を明示:

COMM、APIC、PRIV、その他全部

ここで言いたいのは一つ。

v1.0とは「全能」ではなく「合意した割り切り」です。

このノートは、その割り切りが“逃げ”じゃなく
分析と実験の結果だと示している。


9. 「気付かない」という最終防衛線

最後に出てくるユーザーの言葉。

「見ない情報が壊れても、気付かない」

これ、無責任じゃない。

むしろ誠実です。

なぜなら:

  • 何を見るのか

  • 何を見ないのか

を自覚してるから。

ID3は「全部守る」路線に行くと、
実装コストと事故率が跳ね上がる。

だから、

「使う情報を正しく扱う」に集中する

大量処理ツールとして、これは正しい。


10. このノートの“真の見どころ”まとめ

notes_mp3_to_csv2.md の見どころは、ズバリ:

✅ “動いた後”の違和感処理が全部書いてある

  • CSVを開いて初めて分かる文字化け

  • Shift-JISという過去の亡霊を救済する実装

  • id3_version列を「人間の目印」として追加

  • year列の日付からmutagenの罠を発見

  • v1.0を「割り切りの合意」として確定

そして最後のClaudeの注釈が、開発の真理を言ってます。

「動いたと思ってから ‘あれ?’ となる。この繰り返しが現実」

まさにそれ。


この記事のライセンスについて

この記事は「CC0 1.0 全世界 (CC0 1.0 Public Domain Dedication)」の下に提供されています。著作権法上の権利を放棄するとともに、著作者人格権を行使しないことを宣言します。営利・非営利を問わず、複製、改変、再配布など、あらゆる目的で自由にご利用いただけます。許可やクレジット表記も不要です。
CC0の公式ライセンス証(詳細)はこちら

いいなと思ったら応援しよう!