我似乎无法让 --with-filename 标签在 metaflac 中工作。它使用以下命令将标签枚举到文件中:
metaflac --with-filename --export-tags-to=audio_tags.csv '/media/marcel/Archives2/Albums/Locatelli; Concerti Grossi, Op. 1, Nos. 1-6/Track 21.flac'
但我没有得到文件名,只有标签:
title=2. Allegro
work=Concerto Grosso in D major, Op. 1, No. 5
ALBUM=Locatelli: Concerti Grossi, Op. 1, Nos. 1-6
ALBUMARTIST=Jaroslav Kreček, Capella Istropolitana
ARTIST=Jaroslav Kreček, Capella Istropolitana
BAND=Jaroslav Kreček, Capella Istropolitana
CATALOGUE=730099444521, 8.553445
COMPOSER=Pietro Antonio Locatelli
DISCNUMBER=1
TOTALDISCS=1
TOTALTRACKS=27
DATE=1996
ORGANIZATION=Naxos
TRACKNUMBER=21
非常感谢您的帮助。使用 Xubuntu 22.04
答案1
我设法通过 PHP 脚本解决了这个问题,因为最终目标是将标签放入由 Web 服务器提供的数据库中。首先,将所有 flac 文件列在一个文本文件中:
find /media/marcel/Archives2/Albums -type f -name '*flac' > flac_files.txt
使用 PHP 打开文件进行读取,然后获取数据库句柄并准备 PDO 语句来写入每个文件名:
$dbh = new PDO(<database_details>, <user>, <pw>, <persistent>);
$qry = "INSERT INTO temp (filename) VALUES (?)";
$stmt = $dbh->prepare($qry);
$flac = fopen('/media/marcel/Archives2/Albums/flac_files.txt', "r");
现在解析每一行flac_文件.txt,使用准备好的查询将文件名写入数据库,从中获取标签值放入数组中metaflacshell 并依次写入数据库:
while (!feof($flac)) {
$filename = rtrim(fgets($flac));
$stmt = $dbh->bindParam(1, $filename);
$stmt->execute();
$tag_list = explode("\n", shell_exec('metaflac --export-tags-to=- "' . $filename . '"')) //explode on linefeed character;
$c = count($tag_list);
for ($i = 0 ; $i < $c ; $i++) {
$tag = explode('=', $tag_list[$i]);
if ($tag[0]) { // no empty tags!
$rec = "UPDATE albums.temp SET " . $tag[0] . " = '" . str_replace("'", "’", $tag[1]) . "' WHERE filename = '" . $filename . "'"; //no quotes, just real apostrophes
$data = $dbh->query($rec);
}
}
}
快速而肮脏,但有效。当然,你需要设置温度提前将适当的标签作为列名写入表中。或者,您可以将每个文件名写入第二个文件,然后从metaflac命令,然后用分隔符结束每个命令,在每行上写上“@”。同样很乏味,但同样有效。