コード例 #1
0
 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")
コード例 #2
0
ファイル: easyid3.py プロジェクト: tomjohnhall/mutagen
 def __init__(self, filename=None):
     self.__id3 = ID3()
     if filename is not None:
         self.load(filename)
コード例 #3
0
ファイル: editor.py プロジェクト: fossabot/ManaZeak
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
コード例 #4
0
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_(
コード例 #5
0
ファイル: xiph.py プロジェクト: socialpercon/quodlibet
 def write(self):
     if ID3 is not None:
         with translate_errors():
             ID3().delete(filename=self["~filename"])
     super(FLACFile, self).write()
コード例 #6
0
 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')
コード例 #7
0
#!/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)
コード例 #8
0
 def setUp(self):
     self.filename = os.path.join(DATA_DIR, 'silence-44-s-v1.mp3')
     self.id3 = ID3(self.filename)
コード例 #9
0
 def test_bad_tyer(self):
     audio = ID3(self.bad_tyer)
     self.failIf("TYER" in audio)
     self.failUnless("TIT2" in audio)
コード例 #10
0
 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"))
コード例 #11
0
 def test_rvad_dropped(self):
     id3 = ID3()
     id3.version = (2, 3)
     id3.add(RVAD())
     id3.update_to_v24()
     self.assertFalse(id3.getall("RVAD"))
コード例 #12
0
 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"]])
コード例 #13
0
 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")
コード例 #14
0
 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"))
コード例 #15
0
 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"])
コード例 #16
0
 def setUp(self):
     self.filename = get_temp_copy(
         os.path.join(DATA_DIR, "silence-44-s.mp3"))
     self.audio = ID3(self.filename)
コード例 #17
0
 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"])
コード例 #18
0
 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"])
コード例 #19
0
 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)
コード例 #20
0
 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)
コード例 #21
0
ファイル: Sample2.py プロジェクト: lavax/ModifyMP3ID3Sample
        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 = '哈哈笑'  # 唱片集艺术家
コード例 #22
0
 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)
コード例 #23
0
ファイル: rename.py プロジェクト: ankmathur96/mp3-metadata
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 = [
コード例 #24
0
 def test_wrong_encoding(self):
     t = ID3(self.filename)
     t.add(TIT2(encoding=Encoding.LATIN1, text=[u"\u0243"]))
     self.assertRaises(MutagenError, t.save)
コード例 #25
0
    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()
コード例 #26
0
 def test_toemptyfile(self):
     t = ID3(self.filename)
     os.unlink(self.filename)
     open(self.filename, "wb").close()
     t.save(self.filename)
コード例 #27
0
ファイル: tag_lyrics.py プロジェクト: Snails8/dotfiles
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,
コード例 #28
0
 def test_tononfile(self):
     t = ID3(self.filename)
     os.unlink(self.filename)
     t.save(self.filename)
コード例 #29
0
 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
コード例 #30
0
 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))