2014-02-28 51 views
1

這些是我對Python和外部API的第一次體驗;我試圖從MP3/MP4文件中獲取藝術家姓名,但我沒有成功。 在第一種情況下(MP3)我得到以下錯誤:Python(Mutagen) - 無法從MP4/MP3文件中獲取藝術家

HeaderNotFoundError: can't sync to an MPEG frame 

在後面,我的代碼打印什麼。

這是處理我的文件我TEST功能:

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) 

APP後輸出一個MP3處理:

{'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'])} 

回答

1

好,爲你的MP3文件,你用一個實際的MP3作爲path

它看起來像你不是,或至少id3標籤標題丟失。但更有可能這不是一個MP3文件,或者它不會告訴你在例外can't sync to an MPEG frame

關於第二個問題:

how do I effectively use the try-catch expressions? I know that those do not work...

他們確實不工作,因爲你抓SystemError,這不是由誘變劑拋出。如果你想趕上任何例外,你應該使用:

except Exception as err: 
    print(err) 

,如果你想獲得唯一標籤相關的錯誤:

except HeaderNotFoundError as err: 
    print(err) 

HTH

+0

謝謝!路徑是正確的,但。我在我的代碼中較早處理它。這首歌可以在任何播放器上收聽,我可以閱讀它的標籤... [MP3情況]。那麼MP4歌曲呢? – peperunas

+0

這很可能是頭文件中'artist'的值存在但是爲空,否則它應該引發異常。關於MP3,誘變劑訪問文件肯定有問題。您應該嘗試'track.pprint()',以顯示誘變劑是否成功讀取文件以及是否有任何數據。 – zmo

+0

試圖做到這一點,它只打印「試圖打印MP3的信息。」。沒有錯誤,沒有。我怎樣才能拋出誘變異常?也許它不是一個「真正的」MP3文件?我如何檢查它是否是真正的mp3音頻文件?非常感謝您的耐心等待! – peperunas

相關問題