Python(Mutagen)-无法从MP4 / MP3文件中获取艺术家

5

这是我第一次使用Python和外部API的经验;我试图从MP3/MP4文件中获取艺术家名称,但我没有成功。在第一个案例(MP3)中,我会得到以下错误:

HeaderNotFoundError: can't sync to an MPEG frame

在后者中,我的代码没有输出任何内容。
以下是我用于处理文件的测试函数:
1)MP3
from mutagen.mp3 import MP3    
def mp3_reader(path):
   track = MP3(path)       
   try:
       print track['artist']
   except SystemError:
       print ("SYSTEM ERROR!")

2) MP4

from mutagen.mp4 import MP4

def mp4_reader(path):

    track = MP4(path)

    try:
        print track.tags['artist']
    except SystemError:
        print ("SYSTEM ERROR!")

另外一个与Python有关的问题:我如何有效地使用try-catch表达式?我知道这些表达式不起作用...

非常感谢!!

编辑后的代码:

def mp3_reader(path):

track = MP3(path)

try:
    print ("Trying to print MP3 infos.")
    track.pprint()
except Exception as err:
    print (err)

在处理完MP3之后的APP输出结果:

{'TMED': TMED(encoding=1, text=[u'CD']), u'TXXX:SCRIPT': TXXX(encoding=1, desc=u'SCRIPT', text=[u'Latn']), u'TXXX:MusicBrainz Album Type': TXXX(encoding=1, desc=u'MusicBrainz Album Type', text=[u'album']), u'TXXX:MusicBrainz Album Artist Id': TXXX(encoding=1, desc=u'MusicBrainz Album Artist Id', text=[u'122d63fc-8671-43e4-9752-34e846d62a9c']), u'TXXX:MusicBrainz Artist Id': TXXX(encoding=1, desc=u'MusicBrainz Artist Id', text=[u'122d63fc-8671-43e4-9752-34e846d62a9c']), u'TXXX:BARCODE': TXXX(encoding=1, desc=u'BARCODE', text=[u'5099964783024']), 'TDOR': TDOR(encoding=0, text=[u'2010']), 'TDRC': TDRC(encoding=0, text=[u'2010-08-27']), 'TSO2': TSO2(encoding=1, text=[u'Perry, Katy']), 'TPE2': TPE2(encoding=1, text=[u'Katy Perry']), 'TPE1': TPE1(encoding=1, text=[u'Katy Perry']), 'TALB': TALB(encoding=1, text=[u'Teenage Dream']), u"COMM:iTunNORM:'eng'": COMM(encoding=0, lang='eng', desc=u'iTunNORM', text=[u' 000016A6 00001768 0000BFFB 0000BE99 00032378 00032378 00009227 000093AF 0001FCAC 00034AC1']), 'TCMP': TCMP(encoding=1, text=[u'1']), u'TXXX:CATALOGNUMBER': TXXX(encoding=1, desc=u'CATALOGNUMBER', text=[u'509996 47830 2 4']), u'UFID:http://musicbrainz.org': UFID(owner=u'http://musicbrainz.org', data='8cf81f4a-05fd-4688-bb8c-eb59df2026a0'), u'TXXX:MusicBrainz Release Group Id': TXXX(encoding=1, desc=u'MusicBrainz Release Group Id', text=[u'e6f683c9-fc85-412c-a352-d6e411fc2603']), 'TSOP': TSOP(encoding=1, text=[u'Perry, Katy']), 'TRCK': TRCK(encoding=0, text=[u'1/12']), u"COMM:iTunPGAP:'eng'": COMM(encoding=0, lang='eng', desc=u'iTunPGAP', text=[u'0/']), 'TIT2': TIT2(encoding=1, text=[u'Teenage Dream']), 'TSRC': TSRC(encoding=1, text=[u'USCA21001255']), 'TCON': TCON(encoding=0, text=[u'Pop']), 'TENC': TENC(encoding=0, text=[u'iTunes 10.0.0.68']), u'TXXX:MusicBrainz Album Id': TXXX(encoding=1, desc=u'MusicBrainz Album Id', text=[u'8551cd49-7da6-3139-809d-e48f6f3453e8']), 'TPUB': TPUB(encoding=1, text=[u'Capitol Records']), 'TPOS': TPOS(encoding=0, text=[u'1/1']), u"COMM:iTunSMPB:'eng'": COMM(encoding=0, lang='eng', desc=u'iTunSMPB', text=[u' 00000000 00000210 00000B41 00000000009943AF 00000000 003792F1 00000000 00000000 00000000 00000000 00000000 00000000']), u'TXXX:MusicBrainz Album Release Country': TXXX(encoding=1, desc=u'MusicBrainz Album Release Country', text=[u'DE']), u'TXXX:MusicBrainz Album Status': TXXX(encoding=1, desc=u'MusicBrainz Album Status', text=[u'official'])}
2个回答

5

嗯,关于你的MP3文件,你是否使用了实际的MP3作为path

看起来不是这样,或者至少缺少id3标签头。但更有可能的是这不是一个MP3文件,否则它就不会在异常中告诉你can't sync to an MPEG frame

针对你的第二个问题:

我如何有效地使用try-catch表达式?我知道那些行不通...

确实行不通,因为你捕获了SystemError,而mutagen并不抛出这个错误。如果你想捕获任何异常,你应该使用:

except Exception as err:
    print(err)

如果您只想获取与标签相关的错误:

except HeaderNotFoundError as err:
    print(err)

HTH


谢谢!路径是正确的。我在代码中早些时候就处理了它。这首歌可以在任何播放器上听,我也可以读取它的标签... [MP3情况]。那么MP4歌曲呢? - peperunas
很可能头部中的artist值存在但为空,否则应该会引发异常。关于MP3文件,mutagen访问该文件时肯定出了问题。您可以尝试使用track.pprint()来显示mutagen是否成功读取文件以及其中是否有任何数据。 - zmo
尝试做了那个... 它只打印出 "Trying to print MP3 infos."。没有错误,也没有其他信息。我应该怎样抛出 mutagen 异常?也许这不是一个“真正的”mp3文件?我该如何检查它是否是一个真正的mp3音频文件?非常感谢您的耐心! - peperunas
我又向前迈进了一步!(之前我的代码有些错误)现在我可以获取一些信息,但无法获取艺术家名称!输出结果在主要问题中。我尝试使用print(track['artist']),但没有成功。如何捕获mutagen异常? - peperunas
我尝试导入它,但我不知道要导入什么... mutagen?我在文档中也找不到它... - peperunas
显示剩余4条评论

0

使用@zmo编写的异常代码检查所有音频文件是否受支持并且没有损坏。还要检查所有音频是否仅为.mp3格式。mutagen MP3函数无法接受不受支持的MP3文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接