def test_pic(self): id3 = ID3() id3.version = (2, 2) id3.add(PIC(encoding=0, mime="PNG", desc="cover", type=3, data=b"")) id3.update_to_v24() self.failUnlessEqual(id3["APIC:cover"].mime, "image/png")
def __init__(self, filename=None): self.__id3 = ID3() if filename is not None: self.load(filename)
def updateFileMetadata(track, tags): if track.location.endswith(".mp3"): # Check if the file has a tag header audioTag = ID3() if tags.trackTitle is not None: audioTag.add(TIT2(text=tags.trackTitle)) if tags.trackYear is not None: audioTag.add(TDRC(text=str(tags.trackYear))) if tags.trackArtist is not None: audioTag.add(TPE1(text=tags.trackArtist)) if tags.trackPerformer is not None: audioTag.add(TOPE(text=tags.trackPerformer)) if tags.trackComposer is not None: audioTag.add(TCOM(text=tags.trackComposer)) if tags.trackNumber is not None: if tags.albumTotalTrack is not None: audioTag.add(TRCK(text=str(tags.trackNumber) + "/" + str(tags.albumTotalTrack))) else: audioTag.add(TRCK(text=str(tags.trackNumber))) if tags.trackBPM is not None: audioTag.add(TBPM(text=str(tags.trackBPM))) if tags.lyrics is not None: audioTag.add(USLT(text=tags.lyrics)) if tags.trackGenre is not None: audioTag.add(TCON(text=tags.trackGenre)) if tags.albumTitle is not None: audioTag.add(TALB(text=tags.albumTitle)) if tags.albumArtist is not None: audioTag.add(TPE1(text=tags.albumArtist)) if tags.albumTotalDisc is not None: audioTag.add(TXXX(desc="TOTALDISCS", text=[tags.albumTotalDisc])) if tags.comment is not None: audioTag.add(COMM(text=tags.comment)) if tags.albumDiscNumber is not None: audioTag.add(TPOS(text=str(tags.albumDiscNumber))) if tags.cover is not None: audioTag.add(APIC(data=tags.cover, type=3)) audioTag.save(track.location) data = errorCheckMessage(True, None) elif track.location.endswith(".flac"): audioTag = FLAC(track.location) if tags.trackTitle is not None: audioTag["TITLE"] = tags.trackTitle if tags.trackYear is not None: audioTag['DATE'] = str(tags.trackYear) if tags.trackArtist is not None: audioTag['ARTIST'] = tags.trackArtist if tags.trackPerformer is not None: audioTag['PERFORMER'] = tags.trackPerformer if tags.trackComposer is not None: audioTag['COMPOSER'] = tags.trackComposer if tags.trackNumber is not None: audioTag['TRACKNUMBER'] = str(tags.trackNumber) if tags.albumTotalTrack is not None: audioTag['TOTALTRACK'] = str(tags.albumTotalTrack) if tags.trackBPM is not None: audioTag['BPM'] = tags.trackBPM if tags.lyrics is not None: audioTag['LYRICS'] = tags.lyrics if tags.trackGenre is not None: audioTag['GENRE'] = tags.trackGenre if tags.albumTitle is not None: audioTag['ALBUM'] = tags.albumTitle if tags.albumArtist is not None: audioTag['ARTIST'] = tags.albumArtist if tags.albumTotalDisc is not None: audioTag['TOTALDISC'] = str(tags.albumTotalDisc) if tags.albumDiscNumber is not None: audioTag['DISCNUMBER'] = str(tags.albumDiscNumber) if tags.comment is not None: audioTag['COMMENT'] = str(tags.comment) if tags.cover is not None: picture = audioTag.pictures picture[0].data = tags.cover audioTag.save(track.location) data = errorCheckMessage(True, None) else: data = errorCheckMessage(False, "formatError") return data
from tests import TestCase, add from mutagen.id3 import Frames, Frames_2_2, ID3 from mutagen._compat import text_type _22 = ID3(); _22.version = (2,2,0) _23 = ID3(); _23.version = (2,3,0) _24 = ID3(); _24.version = (2,4,0) class FrameSanityChecks(TestCase): def test_TF(self): from mutagen.id3 import TextFrame self.assert_(isinstance(TextFrame(encoding=0, text='text'), TextFrame)) def test_UF(self): from mutagen.id3 import UrlFrame self.assert_(isinstance(UrlFrame('url'), UrlFrame)) def test_WXXX(self): from mutagen.id3 import WXXX self.assert_(isinstance(WXXX(url='durl'), WXXX)) def test_NTF(self): from mutagen.id3 import NumericTextFrame self.assert_(isinstance(NumericTextFrame(encoding=0, text='1'), NumericTextFrame)) def test_NTPF(self): from mutagen.id3 import NumericPartTextFrame self.assert_(
def write(self): if ID3 is not None: with translate_errors(): ID3().delete(filename=self["~filename"]) super(FLACFile, self).write()
def test_delete_invalid_zero(self): with open(self.filename, 'wb') as f: f.write(b'ID3\x04\x00\x00\x00\x00\x00\x00abc') ID3(self.filename).delete() with open(self.filename, 'rb') as f: self.assertEquals(f.read(10), b'abc')
#!/usr/bin/env python import sys from mutagen.id3 import ID3 a_fpath = sys.argv[1] b_fpath = sys.argv[2] a = ID3(a_fpath) b = ID3() for key, val in a.iteritems(): b[key] = val b.save(b_fpath)
def setUp(self): self.filename = os.path.join(DATA_DIR, 'silence-44-s-v1.mp3') self.id3 = ID3(self.filename)
def test_bad_tyer(self): audio = ID3(self.bad_tyer) self.failIf("TYER" in audio) self.failUnless("TIT2" in audio)
def test_time_dropped(self): id3 = ID3() id3.version = (2, 3) id3.add(TIME(encoding=0, text=["1155"])) id3.update_to_v24() self.assertFalse(id3.getall("TIME"))
def test_rvad_dropped(self): id3 = ID3() id3.version = (2, 3) id3.add(RVAD()) id3.update_to_v24() self.assertFalse(id3.getall("RVAD"))
def test_ipls(self): id3 = ID3() id3.version = (2, 3) id3.add(IPLS(encoding=0, people=[["a", "b"], ["c", "d"]])) id3.update_to_v24() self.failUnlessEqual(id3["TIPL"], [["a", "b"], ["c", "d"]])
def test_tory(self): id3 = ID3() id3.version = (2, 3) id3.add(TORY(encoding=0, text="2006")) id3.update_to_v24() self.failUnlessEqual(id3["TDOR"], "2006")
def test_lnk(self): id3 = ID3() id3.version = (2, 2) id3.add(LNK(frameid="PIC", url="http://foo.bar")) id3.update_to_v24() self.assertTrue(id3.getall("LINK"))
def test_genre_from_v23_1(self): tags = ID3() tags.add(id3.TCON(encoding=1, text=["(4)Rock"])) tags.update_to_v23() self.failUnlessEqual(tags["TCON"].text, ["Disco", "Rock"])
def setUp(self): self.filename = get_temp_copy( os.path.join(DATA_DIR, "silence-44-s.mp3")) self.audio = ID3(self.filename)
def test_genre_from_v23_2(self): tags = ID3() tags.add(id3.TCON(encoding=1, text=["(RX)(3)(CR)"])) tags.update_to_v23() self.failUnlessEqual(tags["TCON"].text, ["Remix", "Dance", "Cover"])
def test_tdor(self): tags = ID3() tags.add(id3.TDOR(encoding=1, text="2003-04-05 12:03")) tags.update_to_v23() self.failUnlessEqual(tags["TORY"].text, ["2003"])
def test_read_popm_long_counter(self): f = ID3(self.filename) self.failUnless("POPM:Windows Media Player 9 Series" in f) popm = f["POPM:Windows Media Player 9 Series"] self.assertEquals(popm.rating, 255) self.assertEquals(popm.count, 2709193061)
def test_corrupt_save(self): with open(self.filename, "r+b") as h: h.seek(5, 0) h.write(b"nope") self.assertRaises(id3.error, ID3().save, self.filename)
trck_str = tokens[1] # # tit2_str = '黑暗森林-' + trck_str new_file_name = talb_str + '-' + tit2_str + file_suffix logging.debug('%s,%s,%s,%s', tit2_str, talb_str, tpe2_str, trck_str) tit2 = TIT2(text=tit2_str) # 标题 talb = TALB(text=talb_str) # 唱片集 tpe2 = TPE2(text=tpe2_str) # 唱片集艺术家 tpe1 = TPE1(text=tpe1_str) # 参与创作的艺术家 trck = TRCK(text=trck_str) # # old_file_path = os.path.join(dir1, old_file_name) new_file_path = os.path.join(dir1, new_file_name) os.rename(old_file_path, new_file_path) logging.debug(new_file_path) id3 = ID3(new_file_path) id3.add(tit2) id3.add(talb) id3.add(tpe1) id3.add(tpe2) id3.add(trck) id3.save() files = os.listdir(dir2) for old_file_name in files: # tit2_str = old_file_name.replace(file_suffix, '') tokens = old_file_name.replace(file_suffix, '').split('-') token = tokens[1] talb_str = '三体3' # 唱片集 tpe2_str = '哈哈笑' # 唱片集艺术家
def test_load_save_inval_version(self): audio = ID3(self.filename) self.assertRaises(ValueError, audio.save, v2_version=5) self.assertRaises(ValueError, ID3, self.filename, v2_version=5)
import os from mutagen.id3 import ID3, TPE1 BASE_DIR = 'om_shanti_om/' ARTIST_PROMPT = True def print_meta(a): for x in a.keys(): if 'APIC' not in x: print(x, a[x]) for f in os.listdir(BASE_DIR): if f.split('.')[1] == 'mp3': print(f) audio_file = ID3(BASE_DIR + f) print('*****State of the metadata before adjustment:*****') print_meta(audio_file) # adjust Title if 'TIT2' in audio_file.keys(): title_obj = audio_file['TIT2'] tokens = title_obj.text[0].split() tokens = [x for x in tokens if not '.com' in x.lower()] title = ' '.join(tokens) audio_file['TIT2'].text[0] = title # adjust Album name (usually has other trash in it) if 'TALB' in audio_file.keys(): alb_obj = audio_file['TALB'] tokens = alb_obj tokens = alb_obj.text[0].split() tokens = [
def test_wrong_encoding(self): t = ID3(self.filename) t.add(TIT2(encoding=Encoding.LATIN1, text=[u"\u0243"])) self.assertRaises(MutagenError, t.save)
def update_id3(self, path: str, track: beatport.Track): #AIFF Check aiff = None if path.endswith('.aiff') or path.endswith('.aif'): aiff = AIFF(path) f = aiff.tags else: f = ID3() f.load(path, v2_version=3, translate=True) #Update tags if UpdatableTags.title in self.config.update_tags and self.config.overwrite: f.setall('TIT2', [TIT2(text=track.title)]) if UpdatableTags.artist in self.config.update_tags and self.config.overwrite: f.setall('TPE1', [ TPE1(text=self.config.artist_separator.join( [a.name for a in track.artists])) ]) if UpdatableTags.album in self.config.update_tags and ( self.config.overwrite or len(f.getall('TALB')) == 0): f.setall('TALB', [TALB(text=track.album.name)]) if UpdatableTags.label in self.config.update_tags and ( self.config.overwrite or len(f.getall('TPUB')) == 0): f.setall('TPUB', [TPUB(text=track.label.name)]) if UpdatableTags.bpm in self.config.update_tags and ( self.config.overwrite or len(f.getall('TBPM')) == 0): f.setall('TBPM', [TBPM(text=str(track.bpm))]) if UpdatableTags.genre in self.config.update_tags and ( self.config.overwrite or len(f.getall('TCON')) == 0): f.setall('TCON', [TCON(text=', '.join([g.name for g in track.genres]))]) #Dates if UpdatableTags.date in self.config.update_tags: #ID3 v2.3 if self.config.id3v23 and (self.config.overwrite or (len(f.getall('TYER')) == 0 and len(f.getall('TDAT')) == 0)): date = track.release_date.strftime('%d%m') f.setall('TDRC', []) f.setall('TDAT', [TDAT(text=date)]) f.setall('TYER', [TYER(text=str(track.release_date.year))]) #ID3 v2.4 if not self.config.id3v23 and (self.config.overwrite or len(f.getall('TDRC')) == 0): date = track.release_date.strftime('%Y-%m-%d') f.setall('TDAT', []) f.setall('TYER', []) f.setall('TDRC', [TDRC(text=date)]) if UpdatableTags.key in self.config.update_tags and ( self.config.overwrite or len(f.getall('TKEY')) == 0): f.setall('TKEY', [TKEY(text=track.id3key())]) if UpdatableTags.publishdate in self.config.update_tags and ( self.config.overwrite or len(f.getall('TDRL')) == 0): # f.setall('TORY', [TORY(text=str(track.publish_date.year))]) if not self.config.id3v23: date = track.publish_date.strftime('%Y-%m-%d') f.setall('TDRL', [TDRL(text=date)]) #Other keys if UpdatableTags.other in self.config.update_tags: f.add(TXXX(desc='WWWAUDIOFILE', text=track.url())) f.add(TXXX(desc='WWWPUBLISHER', text=track.label.url('label'))) #Redownlaod cover if self.config.replace_art: try: url = track.art(self.config.art_resolution) r = requests.get(url) data = APIC(encoding=3, mime='image/jpeg', type=3, desc=u'Cover', data=r.content) f.delall('APIC') f['APIC:cover.jpg'] = data except Exception: logging.warning('Error downloading cover for file: ' + path) if aiff == None: if self.config.id3v23: f.save(path, v2_version=3, v1=0) else: f.save(path, v2_version=4, v1=0) else: aiff.save()
def test_toemptyfile(self): t = ID3(self.filename) os.unlink(self.filename) open(self.filename, "wb").close() t.save(self.filename)
for enc in ('utf8', 'iso-8859-1', 'iso-8859-15', 'cp1252', 'cp1251', 'latin1'): try: lyrics = lyrics.decode(enc) TEXT_DESC = TEXT_DESC.decode(enc) print enc, break except: pass print "Adding lyrics to " + fname print "Language: " + TEXT_LANG print "Description: " + TEXT_DESC # create ID3 tag if not exists try: tags = ID3(fname) except ID3NoHeaderError: print "Adding ID3 header;", tags = ID3() # remove old unsychronized lyrics if len(tags.getall(u"USLT::'" + TEXT_LANG + "'")) != 0: print "Removing Lyrics." tags.delall(u"USLT::'" + TEXT_LANG + "'") #tags.save(fname) # hm, why? #tags.add(USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics)) # apparently the description is important when more than one # USLT frames are present #tags[u"USLT::'eng'"] = (USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics)) tags[u"USLT::'" + TEXT_LANG + "'"] = (USLT(encoding=3,
def test_tononfile(self): t = ID3(self.filename) os.unlink(self.filename) t.save(self.filename)
def test_txxx_multiple(self): res, out = self.call("--TXXX", "A:B", "--TXXX", "C:D", self.filename) self.failUnlessEqual((res, out), (0, "")) f = ID3(self.filename) assert len(f.getall("TXXX")) == 2
def test_unknown_reset(self): id3 = ID3(self.silence, known_frames={}) self.assertEquals(9, len(id3.unknown_frames)) id3.load(self.silence, known_frames={}) self.assertEquals(9, len(id3.unknown_frames))