2012-01-15 72 views
3

对于我的媒体服务器,我正在寻找将标记从FLAC文件传输到MP3的方法。将脚本从FLAC传输(MP3)到MP3的Linux脚本

在bash脚本,我可以使用metaflac到本地变量中提取的标签,但与ID3V2标签MP3的时候,我似乎失去民族文字(猜一定是Unicode?)

我也需要能够设置重播增益标签和专辑封面(全部出现在FLAC中)。

我正在寻找脚本解决方案来无人值守运行。

回答

5

试试这个工具eyed3。它支持专辑封面,文本编码采用latin1,utf8,utf16-BE和utf16-LE。但是不支持重放增益。据我所知,这并没有得到广泛的支持。

+0

这是迄今为止最好的解决方案。我似乎甚至可以使用--set-user-text-frame来设置重播增益值(从FLAC中提取)。唯一的挑战是可以设置的“年份”标签,并且显然可以用eyeD3再次读取,但它不能被mp3Tag(用于Windows)读取。 – TheRoadrunner 2012-01-17 20:49:22

+0

非ASCII字符被警告:“'ascii'编解码器无法解码位置XX中的字节0xc3:序号不在范围(128)中”,但非ASCII字符完全插入到新标签中。 – TheRoadrunner 2012-01-17 20:55:38

+2

年问题解决:eyeD3默认使用ID3v2.4标签。这个版本的年份元数据更为复杂。 eyeD3 -Y写入TDRL(发布日期)标签,而mp3tag(和其他人)在TDRC(录制时间)标签中查找年份。 更改我的标记脚本以包含--set-text-frame = TDRC:“$ DATE”解决了我的问题。 – TheRoadrunner 2012-01-28 14:43:12

9

如果您对Python解决方案感兴趣,那么诱变库看起来非常好。

from mutagen.flac import FLAC 
from mutagen.easyid3 import EasyID3 

flacfile = FLAC("flacfile.flac") 
mp3file = EasyID3("mp3file.mp3") 

for tag in flacfile: 
    if tag in EasyID3.valid_keys.keys(): 
     mp3file[tag] = flacfile[tag] 

mp3file.save() 

我发现这个解决方案复制MP3 ID3标签到FLAC文件:

,因为它可以容易。

+1

这对我有效,但我不得不使用保存选项强制1D3v2.3与Windows 7文件资源管理器兼容。 Mutagen想要默认使用v2.4,但保存选项允许您更改它: mp3file.save(None,1,3) 前2个参数是默认文件名以及如何处理v1标记,第三个参数是v2点版本。 https://mutagen.readthedocs.org/en/latest/api/id3.html?highlight=save#mutagen.id3.ID3.save – 2015-12-19 02:15:33

1

维克多的解决方案告诉我的方式。但是,如果将标记复制到刚刚转换的文件(例如从flac转换为mp3),则可能会失败。也就是说,如果您正在复制标签的文件还没有任何标签,它将会失败。

所以你可能需要首先填充目标文件,给它的手段有标签。

from mutagen import File 
from mutagen.flac import FLAC 
from mutagen.easyid3 import EasyID3 
from mutagen.id3 import ID3, ID3NoHeaderError 

def convert_tags(f1,f2): 
    # f1: full path to file copying tags from 
    # f2: full path to file copying tags to 
    # http://stackoverflow.com/questions/8873364/linux-script-to-transfer-id3-tags-from-flac-to-mp3 
    # http://stackoverflow.com/a/18369606/2455413 
    try: 
     meta = EasyID3(f2) 
    except ID3NoHeaderError: 
     meta = File(f2, easy=True) 
     meta.add_tags() 
     meta.save() 
    from_f = FLAC(f1) 
    to_f = EasyID3(f2) 
    for tag in from_f: 
     if tag in EasyID3.valid_keys.keys(): to_f[tag] = from_f[tag] 
    to_f.save() 
    return