metaflac 问题

metaflac 问题

我似乎无法让 --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命令,然后用分隔符结束每个命令,在每行上写上“@”。同样很乏味,但同样有效。

相关内容