把 40 张现场专辑的歌单写进一份 Markdown,我用的笨办法

上个月整理自己的现场录音收藏,40 张专辑、一共 612 个音轨,分散在三个移动硬盘里。想干的事很简单:给每张专辑写一份带曲目和时长的歌单笔记,方便以后翻。手动敲了两张就放弃了,Excel 复制粘贴也会错位,因为不同来源的文件名格式完全不一样——有的是 01 - 歌名.flac,有的是 Artist - Album - 01 - 歌名.wav,还有一批是手机录的,文件名就是一串时间戳。

最后走的是「先归一化,再统一生成」的路子。第一步用 ffprobe 把每个文件的元数据和时长抽成 JSON,不依赖文件名:

find "$ALBUM_DIR" -type f \( -name '*.flac' -o -name '*.wav' -o -name '*.m4a' \) \
  -print0 | while IFS= read -r -d '' f; do
  ffprobe -v quiet -print_format json \
    -show_entries format=duration:format_tags=title,track,artist \
    "$f"
done > probe.ndjson

第二步把 ndjson 收敛成一张表,缺 title 的用文件名兜底,缺 track 的排到末尾并标出来。这一步我用了一段二十行的 Python,没有装任何库,标准库就够。第三步从表生成 Markdown,每张专辑一个二级标题,曲目行写成 序号. 歌名 — 时长,时长统一成 m:ss。

为什么不用现成的标签工具一次搞定?因为我的目标不是改文件,是生成一份可读、可 diff 的文本。改文件有风险,写错标签要回滚;生成文本错了删掉重来就行。代价是多一步中间产物,probe.ndjson 和中间表要留着,不然下次改格式还得重跑。

会失效的地方挺明确。手机录的那批文件基本没有内嵌标签,ffprobe 出来的 title 是空的,只能靠文件名,而文件名里的时间戳对听感没意义,最后我是边听边补的,这部分纯手工。另外 wav 的 duration 在个别文件上会偏几十毫秒,做歌单够用,做精确对齐就不行。还有一次 find 的路径里带空格,忘了 -print0,整批数据错位,白跑一遍。

现在这 40 份歌单笔记都在一个目录里,改一张专辑重跑一次脚本就行。想问问常整理现场录音的人:你们是更愿意把信息写进文件标签,还是像我这样单独维护一份文本?我有点怀疑自己选错了边。

0
赞同度 100% · 0 条评论 · 6 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。