def test_make_v1_from_tyer(self): self.assertEquals( MakeID3v1({"TDRC": TDRC(text="2010-10-10")}), MakeID3v1({"TYER": TYER(text="2010")})) self.assertEquals( ParseID3v1(MakeID3v1({"TDRC": TDRC(text="2010-10-10")})), ParseID3v1(MakeID3v1({"TYER": TYER(text="2010")})))
def test_v1_not_v11(self): self.id3["TRCK"] = TRCK(encoding=0, text="32") tag = MakeID3v1(self.id3) self.failUnless(32, ParseID3v1(tag)["TRCK"]) del (self.id3["TRCK"]) tag = MakeID3v1(self.id3) tag = tag[:125] + b' ' + tag[-1:] self.failIf("TRCK" in ParseID3v1(tag))
def test_nulls(self): s = u'TAG%(title)30s%(artist)30s%(album)30s%(year)4s%(cmt)29s\x03\x01' s = s % dict(artist=u'abcd\00fg', title=u'hijklmn\x00p', album=u'qrst\x00v', cmt=u'wxyz', year=u'1224') tags = ParseID3v1(s.encode("ascii")) self.assertEquals(b'abcd'.decode('latin1'), tags['TPE1']) self.assertEquals(b'hijklmn'.decode('latin1'), tags['TIT2']) self.assertEquals(b'qrst'.decode('latin1'), tags['TALB'])
def test_remove_v1(self): from mutagen.id3 import ParseID3v1 res, out = self.call("--remove-v1", self.filename) with open(self.filename, "rb") as h: h.seek(-128, 2) data = h.read() self.failUnlessEqual(len(data), 128) self.failIf(ParseID3v1(data))
def test_include_id3v1(self): self.call(fsn(u'--write-v1'), self.filename, self.blank_file) with open(self.blank_file, 'rb') as fileobj: fileobj.seek(-128, 2) frames = ParseID3v1(fileobj.read(128)) # If ID3v1 frames are present, assume they've been written correctly by # mutagen, so no need to check them self.failUnless(frames)
def id3v1_values(fn): close_file = isinstance(fn, basestring) fileobj = open(fn, 'rb') if close_file else fn fileobj.seek(-128, 2) frames = ParseID3v1(fileobj.read(128)) if close_file: fileobj.close() if frames: return convert_id3_frames(frames)
def test_missing_year(self): tag = ParseID3v1( b'ABCTAGhello world\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\xff') self.failUnlessEqual(tag["TIT2"], "hello world")
def test_nonascii(self): s = u'TAG%(title)30s%(artist)30s%(album)30s%(year)4s%(cmt)29s\x03\x01' s = s % dict(artist=u'abcd\xe9fg', title=u'hijklmn\xf3p', album=u'qrst\xfcv', cmt=u'wxyz', year=u'1234') tags = ParseID3v1(s.encode("latin-1")) self.assertEquals(b'abcd\xe9fg'.decode('latin1'), tags['TPE1']) self.assertEquals(b'hijklmn\xf3p'.decode('latin1'), tags['TIT2']) self.assertEquals(b'qrst\xfcv'.decode('latin1'), tags['TALB']) self.assertEquals('wxyz', tags['COMM']) self.assertEquals("3", tags['TRCK']) self.assertEquals("1234", tags['TDRC'])
def test_include_id3v1(self): fd, blank_file = mkstemp(suffix='.mp3') os.close(fd) self.call('--write-v1', self.filename, blank_file) fileobj = open(blank_file, 'rb') fileobj.seek(-128, 2) frames = ParseID3v1(fileobj.read(128)) # If ID3v1 frames are present, assume they've been written correctly by # mutagen, so no need to check them self.failUnless(frames)
def test_short_year(self): data = ( b'XTAGhello world\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\xff') tag = ParseID3v1(data) self.failUnlessEqual(tag["TIT2"], "hello world") self.failUnlessEqual(tag["TDRC"], "0001") frames, offset = find_id3v1(cBytesIO(data)) self.assertEqual(offset, -125) self.assertEqual(frames, tag)
class ID3File(ID3): def load(self, fp, known_frames=None, translate=True): self.filename = fp.name self.__known_frames = known_frames self.__fileobj = fp try: self.__filesize = fp.size except AttributeError: self.__filesize = len(fp.read()) fp.seek(0) # grumble grumble self.__load_header = self._ID3__load_header self.__fullread = self._ID3__fullread self.__read_frames = self._ID3__read_frames self._ID3__known_frames = self.__known_frames self._ID3__fileobj = self.__fileobj self._ID3__filesize = self.__filesize try: try: self.__load_header() except EOFError: self.size = 0 raise ID3NoHeaderError("%s: too small (%d bytes)" %( filename, self.__filesize)) except (ID3NoHeaderError, ID3UnsupportedVersionError), err: self.size = 0 import sys stack = sys.exc_info()[2] try: self.__fileobj.seek(-128, 2) except EnvironmentError: raise err, None, stack else: frames = ParseID3v1(self.__fileobj.read(128)) if frames is not None: self.version = (1, 1) map(self.add, frames.values()) else: raise err, None, stack
def test_short(self): s = MakeID3v1(dict(TDRC="1")) self.failUnlessEqual(len(s), 128) tag = ParseID3v1(s) self.failUnlessEqual(tag["TDRC"], "0001")
def test_v1_genre(self): tag = {} tag["TCON"] = TCON(encoding=0, text="Pop") v1tag = MakeID3v1(tag) self.failUnlessEqual(ParseID3v1(v1tag)["TCON"].genres, ["Pop"])
def test_invalid_track(self): tag = {} tag["TRCK"] = TRCK(encoding=0, text="not a number") v1tag = MakeID3v1(tag) self.failIf("TRCK" in ParseID3v1(v1tag))
def test_invalid(self): self.failUnless(ParseID3v1(b"") is None)
def test_roundtrip(self): frames = {} for key in ["TIT2", "TALB", "TPE1", "TDRC"]: frames[key] = self.id3[key] self.assertEquals(ParseID3v1(MakeID3v1(frames)), frames)
def test_long(self): s = MakeID3v1(dict(TDRC="123456789")) self.failUnlessEqual(len(s), 128) tag = ParseID3v1(s) self.failUnlessEqual(tag["TDRC"], "1234")
def test_empty(self): s = MakeID3v1(dict(TDRC="")) self.failUnlessEqual(len(s), 128) tag = ParseID3v1(s) self.failIf("TDRC" in tag)
def test_none(self): s = MakeID3v1(dict()) self.failUnlessEqual(len(s), 128) tag = ParseID3v1(s) self.failIf("TDRC" in tag)