def _loadTags(self): try: audio = FLAC() audio.load(self.uri) return audio.tags except Exception, e: return None
def tag_reader(file): """ Read tags in audio files """ file_path = os.path.join(file[0],file[1]) if file[2] == "mp3": try: tag = easyid3.EasyID3(file_path) return tag except: return "None" # print "tag reading error/ no tag/empty tag for file "+file_path elif file[2] == "flac": try: flac_file = FLAC.load(file_path) flac_file.tags # ?? # ????? return "None" except: return "None" else: print file[2]+" filetype has no tag format processed." return "None"
def tag_reader(file): """ Read tags in audio files """ file_path = os.path.join(file[0], file[1]) if file[2] == "mp3": try: tag = easyid3.EasyID3(file_path) return tag except: return "None" # print "tag reading error/ no tag/empty tag for file "+file_path elif file[2] == "flac": try: flac_file = FLAC.load(file_path) flac_file.tags # ?? # ????? return "None" except: return "None" else: print file[2] + " filetype has no tag format processed." return "None"
class TFLAC(TestCase): SAMPLE = os.path.join("tests", "data", "silence-44-s.flac") NEW = SAMPLE + ".new" def setUp(self): shutil.copy(self.SAMPLE, self.NEW) self.failUnlessEqual(open(self.SAMPLE).read(), open(self.NEW).read()) self.flac = FLAC(self.NEW) def test_delete(self): self.failUnless(self.flac.tags) self.flac.delete() self.failIf(self.flac.tags) flac = FLAC(self.NEW) self.failIf(flac.tags) def test_module_delete(self): delete(self.NEW) flac = FLAC(self.NEW) self.failIf(flac.tags) def test_info(self): self.failUnlessAlmostEqual(FLAC(self.NEW).info.length, 3.7, 1) def test_keys(self): self.failUnlessEqual(self.flac.keys(), self.flac.tags.keys()) def test_values(self): self.failUnlessEqual(self.flac.values(), self.flac.tags.values()) def test_items(self): self.failUnlessEqual(self.flac.items(), self.flac.tags.items()) def test_vc(self): self.failUnlessEqual(self.flac['title'][0], 'Silence') def test_write_nochange(self): f = FLAC(self.NEW) f.save() self.failUnlessEqual(open(self.SAMPLE).read(), open(self.NEW).read()) def test_write_changetitle(self): f = FLAC(self.NEW) f["title"] = "A New Title" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["title"][0], "A New Title") def test_write_changetitle_unicode_value(self): f = FLAC(self.NEW) f["title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["title"][0], u"A Unicode Title \u2022") def test_write_changetitle_unicode_key(self): f = FLAC(self.NEW) f[u"title"] = "A New Title" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], "A New Title") def test_write_changetitle_unicode_key_and_value(self): f = FLAC(self.NEW) f[u"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], u"A Unicode Title \u2022") def test_force_grow(self): f = FLAC(self.NEW) f["faketag"] = ["a" * 1000] * 1000 f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["a" * 1000] * 1000) def test_force_shrink(self): self.test_force_grow() f = FLAC(self.NEW) f["faketag"] = "foo" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["foo"]) def test_add_vc(self): f = FLAC(os.path.join("tests", "data", "no-tags.flac")) self.failIf(f.tags) f.add_tags() self.failUnless(f.tags == []) self.failUnlessRaises(ValueError, f.add_tags) def test_add_vc_implicit(self): f = FLAC(os.path.join("tests", "data", "no-tags.flac")) self.failIf(f.tags) f["foo"] = "bar" self.failUnless(f.tags == [("foo", "bar")]) self.failUnlessRaises(ValueError, f.add_tags) def test_ooming_vc_header(self): # issue 112: Malformed FLAC Vorbis header causes out of memory error # http://code.google.com/p/mutagen/issues/detail?id=112 self.assertRaises(IOError, FLAC, os.path.join('tests', 'data', 'ooming-header.flac')) def test_with_real_flac(self): if not have_flac: return self.flac["faketag"] = "foobar" * 1000 self.flac.save() badval = os.system("tools/notarealprogram 2> %s" % devnull) value = os.system("flac -t %s 2> %s" % (self.flac.filename, devnull)) self.failIf(value and value != badval) def test_save_unknown_block(self): block = MetadataBlock("test block data") block.code = 99 self.flac.metadata_blocks.append(block) self.flac.save() def test_load_unknown_block(self): self.test_save_unknown_block() flac = FLAC(self.NEW) self.failUnlessEqual(len(flac.metadata_blocks), 7) self.failUnlessEqual(flac.metadata_blocks[5].code, 99) self.failUnlessEqual(flac.metadata_blocks[5].data, "test block data") def test_two_vorbis_blocks(self): self.flac.metadata_blocks.append(self.flac.metadata_blocks[1]) self.flac.save() self.failUnlessRaises(IOError, FLAC, self.NEW) def test_missing_streaminfo(self): self.flac.metadata_blocks.pop(0) self.flac.save() self.failUnlessRaises(IOError, FLAC, self.NEW) def test_load_invalid_flac(self): self.failUnlessRaises( IOError, FLAC, os.path.join("tests", "data", "xing.mp3")) def test_save_invalid_flac(self): self.failUnlessRaises( IOError, self.flac.save, os.path.join("tests", "data", "xing.mp3")) def test_pprint(self): self.failUnless(self.flac.pprint()) def test_double_load(self): blocks = list(self.flac.metadata_blocks) self.flac.load(self.flac.filename) self.failUnlessEqual(blocks, self.flac.metadata_blocks) def test_seektable(self): self.failUnless(self.flac.seektable) def test_cuesheet(self): self.failUnless(self.flac.cuesheet) def test_pictures(self): self.failUnless(self.flac.pictures) def test_add_picture(self): f = FLAC(self.NEW) c = len(f.pictures) f.add_picture(Picture()) f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.pictures), c + 1) def test_clear_pictures(self): f = FLAC(self.NEW) c1 = len(f.pictures) c2 = len(f.metadata_blocks) f.clear_pictures() f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.metadata_blocks), c2 - c1) def test_ignore_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW) f = FLAC(self.NEW) f['title'] = 'vc title' f.save() id3 = ID3(self.NEW) self.failUnlessEqual(id3['TIT2'].text, ['id3 title']) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_delete_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW, v1=2) f = FLAC(self.NEW) f['title'] = 'vc title' f.save(deleteid3=True) self.failUnlessRaises(ID3NoHeaderError, ID3, self.NEW) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_mime(self): self.failUnless("audio/x-flac" in self.flac.mime) def test_variable_block_size(self): FLAC(os.path.join("tests", "data", "variable-block.flac")) def test_load_flac_with_application_block(self): FLAC(os.path.join("tests", "data", "flac_application.flac")) def tearDown(self): os.unlink(self.NEW)
class TFLAC(TestCase): SAMPLE = os.path.join(DATA_DIR, "silence-44-s.flac") def setUp(self): self.NEW = get_temp_copy(self.SAMPLE) self.flac = FLAC(self.NEW) def tearDown(self): os.unlink(self.NEW) def test_zero_samples(self): # write back zero sample count and load again self.flac.info.total_samples = 0 self.flac.save() new = FLAC(self.flac.filename) assert new.info.total_samples == 0 assert new.info.bitrate == 0 assert new.info.length == 0.0 def test_bitrate(self): assert self.flac.info.bitrate == 101430 old_file_size = os.path.getsize(self.flac.filename) self.flac.save(padding=lambda x: 9999) new_flac = FLAC(self.flac.filename) assert os.path.getsize(new_flac.filename) > old_file_size assert new_flac.info.bitrate == 101430 def test_padding(self): for pad in [0, 42, 2**24 - 1, 2 ** 24]: self.flac.save(padding=lambda x: pad) new = FLAC(self.flac.filename) expected = min(2**24 - 1, pad) self.assertEqual(new.metadata_blocks[-1].length, expected) def test_save_multiple_padding(self): # we don't touch existing padding blocks on save, but will # replace them in the file with one at the end def num_padding(f): blocks = f.metadata_blocks return len([b for b in blocks if isinstance(b, Padding)]) num_blocks = num_padding(self.flac) self.assertEqual(num_blocks, 1) block = Padding() block.length = 42 self.flac.metadata_blocks.append(block) block = Padding() block.length = 24 self.flac.metadata_blocks.append(block) self.flac.save() self.assertEqual(num_padding(self.flac), num_blocks + 2) new = FLAC(self.flac.filename) self.assertEqual(num_padding(new), 1) self.assertTrue(isinstance(new.metadata_blocks[-1], Padding)) def test_increase_size_new_padding(self): self.assertEqual(self.flac.metadata_blocks[-1].length, 3060) value = u"foo" * 100 self.flac[u"foo"] = [value] self.flac.save() new = FLAC(self.NEW) self.assertEqual(new.metadata_blocks[-1].length, 2752) self.assertEqual(new[u"foo"], [value]) def test_delete(self): self.failUnless(self.flac.tags) self.flac.delete() self.assertTrue(self.flac.tags is not None) self.assertFalse(self.flac.tags) flac = FLAC(self.NEW) self.assertTrue(flac.tags is None) def test_delete_change_reload(self): self.flac.delete() self.flac.tags["FOO"] = ["BAR"] self.flac.save() assert FLAC(self.flac.filename)["FOO"] == ["BAR"] # same with delete failing due to IO etc. with pytest.raises(MutagenError): self.flac.delete(os.devnull) self.flac.tags["FOO"] = ["QUUX"] self.flac.save() assert FLAC(self.flac.filename)["FOO"] == ["QUUX"] def test_module_delete(self): delete(self.NEW) flac = FLAC(self.NEW) self.failIf(flac.tags) def test_info(self): self.failUnlessAlmostEqual(FLAC(self.NEW).info.length, 3.7, 1) def test_keys(self): self.failUnlessEqual( list(self.flac.keys()), list(self.flac.tags.keys())) def test_values(self): self.failUnlessEqual( list(self.flac.values()), list(self.flac.tags.values())) def test_items(self): self.failUnlessEqual( list(self.flac.items()), list(self.flac.tags.items())) def test_vc(self): self.failUnlessEqual(self.flac['title'][0], 'Silence') def test_write_nochange(self): f = FLAC(self.NEW) f.save() with open(self.SAMPLE, "rb") as a: with open(self.NEW, "rb") as b: self.failUnlessEqual(a.read(), b.read()) def test_write_changetitle(self): f = FLAC(self.NEW) if PY3: self.assertRaises( TypeError, f.__setitem__, b'title', b"A New Title") else: f[b"title"] = b"A New Title" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[b"title"][0], b"A New Title") def test_write_changetitle_unicode_value(self): f = FLAC(self.NEW) if PY3: self.assertRaises( TypeError, f.__setitem__, b'title', u"A Unicode Title \u2022") else: f[b"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[b"title"][0], u"A Unicode Title \u2022") def test_write_changetitle_unicode_key(self): f = FLAC(self.NEW) f[u"title"] = b"A New Title" if PY3: self.assertRaises(ValueError, f.save) else: f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], b"A New Title") def test_write_changetitle_unicode_key_and_value(self): f = FLAC(self.NEW) f[u"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], u"A Unicode Title \u2022") def test_force_grow(self): f = FLAC(self.NEW) f["faketag"] = ["a" * 1000] * 1000 f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["a" * 1000] * 1000) def test_force_shrink(self): self.test_force_grow() f = FLAC(self.NEW) f["faketag"] = "foo" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["foo"]) def test_add_vc(self): f = FLAC(os.path.join(DATA_DIR, "no-tags.flac")) self.failIf(f.tags) f.add_tags() self.failUnless(f.tags == []) self.failUnlessRaises(ValueError, f.add_tags) def test_add_vc_implicit(self): f = FLAC(os.path.join(DATA_DIR, "no-tags.flac")) self.failIf(f.tags) f["foo"] = "bar" self.failUnless(f.tags == [("foo", "bar")]) self.failUnlessRaises(ValueError, f.add_tags) def test_ooming_vc_header(self): # issue 112: Malformed FLAC Vorbis header causes out of memory error # https://github.com/quodlibet/mutagen/issues/112 self.assertRaises(error, FLAC, os.path.join(DATA_DIR, 'ooming-header.flac')) def test_with_real_flac(self): if not have_flac: return self.flac["faketag"] = "foobar" * 1000 self.flac.save() self.failIf(call_flac("-t", self.flac.filename) != 0) def test_save_unknown_block(self): block = MetadataBlock(b"test block data") block.code = 99 self.flac.metadata_blocks.append(block) self.flac.save() def test_load_unknown_block(self): self.test_save_unknown_block() flac = FLAC(self.NEW) self.failUnlessEqual(len(flac.metadata_blocks), 7) self.failUnlessEqual(flac.metadata_blocks[5].code, 99) self.failUnlessEqual(flac.metadata_blocks[5].data, b"test block data") def test_two_vorbis_blocks(self): self.flac.metadata_blocks.append(self.flac.metadata_blocks[1]) self.flac.save() self.failUnlessRaises(error, FLAC, self.NEW) def test_missing_streaminfo(self): self.flac.metadata_blocks.pop(0) self.flac.save() self.failUnlessRaises(error, FLAC, self.NEW) def test_load_invalid_flac(self): self.failUnlessRaises( error, FLAC, os.path.join(DATA_DIR, "xing.mp3")) def test_save_invalid_flac(self): self.failUnlessRaises( error, self.flac.save, os.path.join(DATA_DIR, "xing.mp3")) def test_pprint(self): self.failUnless(self.flac.pprint()) def test_double_load(self): blocks = list(self.flac.metadata_blocks) self.flac.load(self.flac.filename) self.failUnlessEqual(blocks, self.flac.metadata_blocks) def test_seektable(self): self.failUnless(self.flac.seektable) def test_cuesheet(self): self.failUnless(self.flac.cuesheet) def test_pictures(self): self.failUnless(self.flac.pictures) def test_add_picture(self): f = FLAC(self.NEW) c = len(f.pictures) f.add_picture(Picture()) f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.pictures), c + 1) def test_clear_pictures(self): f = FLAC(self.NEW) c1 = len(f.pictures) c2 = len(f.metadata_blocks) f.clear_pictures() f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.metadata_blocks), c2 - c1) def test_ignore_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW) f = FLAC(self.NEW) f['title'] = 'vc title' f.save() id3 = ID3(self.NEW) self.failUnlessEqual(id3['TIT2'].text, ['id3 title']) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_delete_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW, v1=2) f = FLAC(self.NEW) f['title'] = 'vc title' f.save(deleteid3=True) self.failUnlessRaises(ID3NoHeaderError, ID3, self.NEW) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_save_on_mp3(self): path = os.path.join(DATA_DIR, "silence-44-s.mp3") self.assertRaises(error, self.flac.save, path) def test_mime(self): self.failUnless("audio/x-flac" in self.flac.mime) def test_variable_block_size(self): FLAC(os.path.join(DATA_DIR, "variable-block.flac")) def test_load_flac_with_application_block(self): FLAC(os.path.join(DATA_DIR, "flac_application.flac"))
class TFLAC(TestCase): SAMPLE = os.path.join(DATA_DIR, "silence-44-s.flac") def setUp(self): self.NEW = get_temp_copy(self.SAMPLE) self.flac = FLAC(self.NEW) def tearDown(self): os.unlink(self.NEW) def test_zero_samples(self): # write back zero sample count and load again self.flac.info.total_samples = 0 self.flac.save() new = FLAC(self.flac.filename) assert new.info.total_samples == 0 assert new.info.bitrate == 0 assert new.info.length == 0.0 def test_bitrate(self): assert self.flac.info.bitrate == 101430 old_file_size = os.path.getsize(self.flac.filename) self.flac.save(padding=lambda x: 9999) new_flac = FLAC(self.flac.filename) assert os.path.getsize(new_flac.filename) > old_file_size assert new_flac.info.bitrate == 101430 def test_padding(self): for pad in [0, 42, 2**24 - 1, 2**24]: self.flac.save(padding=lambda x: pad) new = FLAC(self.flac.filename) expected = min(2**24 - 1, pad) self.assertEqual(new.metadata_blocks[-1].length, expected) def test_save_multiple_padding(self): # we don't touch existing padding blocks on save, but will # replace them in the file with one at the end def num_padding(f): blocks = f.metadata_blocks return len([b for b in blocks if isinstance(b, Padding)]) num_blocks = num_padding(self.flac) self.assertEqual(num_blocks, 1) block = Padding() block.length = 42 self.flac.metadata_blocks.append(block) block = Padding() block.length = 24 self.flac.metadata_blocks.append(block) self.flac.save() self.assertEqual(num_padding(self.flac), num_blocks + 2) new = FLAC(self.flac.filename) self.assertEqual(num_padding(new), 1) self.assertTrue(isinstance(new.metadata_blocks[-1], Padding)) def test_increase_size_new_padding(self): self.assertEqual(self.flac.metadata_blocks[-1].length, 3060) value = u"foo" * 100 self.flac[u"foo"] = [value] self.flac.save() new = FLAC(self.NEW) self.assertEqual(new.metadata_blocks[-1].length, 2752) self.assertEqual(new[u"foo"], [value]) def test_delete(self): self.failUnless(self.flac.tags) self.flac.delete() self.assertTrue(self.flac.tags is not None) self.assertFalse(self.flac.tags) flac = FLAC(self.NEW) self.assertTrue(flac.tags is None) def test_module_delete(self): delete(self.NEW) flac = FLAC(self.NEW) self.failIf(flac.tags) def test_info(self): self.failUnlessAlmostEqual(FLAC(self.NEW).info.length, 3.7, 1) def test_keys(self): self.failUnlessEqual(list(self.flac.keys()), list(self.flac.tags.keys())) def test_values(self): self.failUnlessEqual(list(self.flac.values()), list(self.flac.tags.values())) def test_items(self): self.failUnlessEqual(list(self.flac.items()), list(self.flac.tags.items())) def test_vc(self): self.failUnlessEqual(self.flac['title'][0], 'Silence') def test_write_nochange(self): f = FLAC(self.NEW) f.save() with open(self.SAMPLE, "rb") as a: with open(self.NEW, "rb") as b: self.failUnlessEqual(a.read(), b.read()) def test_write_changetitle(self): f = FLAC(self.NEW) if PY3: self.assertRaises(TypeError, f.__setitem__, b'title', b"A New Title") else: f[b"title"] = b"A New Title" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[b"title"][0], b"A New Title") def test_write_changetitle_unicode_value(self): f = FLAC(self.NEW) if PY3: self.assertRaises(TypeError, f.__setitem__, b'title', u"A Unicode Title \u2022") else: f[b"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[b"title"][0], u"A Unicode Title \u2022") def test_write_changetitle_unicode_key(self): f = FLAC(self.NEW) f[u"title"] = b"A New Title" if PY3: self.assertRaises(ValueError, f.save) else: f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], b"A New Title") def test_write_changetitle_unicode_key_and_value(self): f = FLAC(self.NEW) f[u"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], u"A Unicode Title \u2022") def test_force_grow(self): f = FLAC(self.NEW) f["faketag"] = ["a" * 1000] * 1000 f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["a" * 1000] * 1000) def test_force_shrink(self): self.test_force_grow() f = FLAC(self.NEW) f["faketag"] = "foo" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["foo"]) def test_add_vc(self): f = FLAC(os.path.join(DATA_DIR, "no-tags.flac")) self.failIf(f.tags) f.add_tags() self.failUnless(f.tags == []) self.failUnlessRaises(ValueError, f.add_tags) def test_add_vc_implicit(self): f = FLAC(os.path.join(DATA_DIR, "no-tags.flac")) self.failIf(f.tags) f["foo"] = "bar" self.failUnless(f.tags == [("foo", "bar")]) self.failUnlessRaises(ValueError, f.add_tags) def test_ooming_vc_header(self): # issue 112: Malformed FLAC Vorbis header causes out of memory error # https://github.com/quodlibet/mutagen/issues/112 self.assertRaises(error, FLAC, os.path.join(DATA_DIR, 'ooming-header.flac')) def test_with_real_flac(self): if not have_flac: return self.flac["faketag"] = "foobar" * 1000 self.flac.save() self.failIf(call_flac("-t", self.flac.filename) != 0) def test_save_unknown_block(self): block = MetadataBlock(b"test block data") block.code = 99 self.flac.metadata_blocks.append(block) self.flac.save() def test_load_unknown_block(self): self.test_save_unknown_block() flac = FLAC(self.NEW) self.failUnlessEqual(len(flac.metadata_blocks), 7) self.failUnlessEqual(flac.metadata_blocks[5].code, 99) self.failUnlessEqual(flac.metadata_blocks[5].data, b"test block data") def test_two_vorbis_blocks(self): self.flac.metadata_blocks.append(self.flac.metadata_blocks[1]) self.flac.save() self.failUnlessRaises(error, FLAC, self.NEW) def test_missing_streaminfo(self): self.flac.metadata_blocks.pop(0) self.flac.save() self.failUnlessRaises(error, FLAC, self.NEW) def test_load_invalid_flac(self): self.failUnlessRaises(error, FLAC, os.path.join(DATA_DIR, "xing.mp3")) def test_save_invalid_flac(self): self.failUnlessRaises(error, self.flac.save, os.path.join(DATA_DIR, "xing.mp3")) def test_pprint(self): self.failUnless(self.flac.pprint()) def test_double_load(self): blocks = list(self.flac.metadata_blocks) self.flac.load(self.flac.filename) self.failUnlessEqual(blocks, self.flac.metadata_blocks) def test_seektable(self): self.failUnless(self.flac.seektable) def test_cuesheet(self): self.failUnless(self.flac.cuesheet) def test_pictures(self): self.failUnless(self.flac.pictures) def test_add_picture(self): f = FLAC(self.NEW) c = len(f.pictures) f.add_picture(Picture()) f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.pictures), c + 1) def test_clear_pictures(self): f = FLAC(self.NEW) c1 = len(f.pictures) c2 = len(f.metadata_blocks) f.clear_pictures() f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.metadata_blocks), c2 - c1) def test_ignore_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW) f = FLAC(self.NEW) f['title'] = 'vc title' f.save() id3 = ID3(self.NEW) self.failUnlessEqual(id3['TIT2'].text, ['id3 title']) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_delete_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW, v1=2) f = FLAC(self.NEW) f['title'] = 'vc title' f.save(deleteid3=True) self.failUnlessRaises(ID3NoHeaderError, ID3, self.NEW) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_save_on_mp3(self): path = os.path.join(DATA_DIR, "silence-44-s.mp3") self.assertRaises(error, self.flac.save, path) def test_mime(self): self.failUnless("audio/x-flac" in self.flac.mime) def test_variable_block_size(self): FLAC(os.path.join(DATA_DIR, "variable-block.flac")) def test_load_flac_with_application_block(self): FLAC(os.path.join(DATA_DIR, "flac_application.flac"))
class TFLAC(TestCase): SAMPLE = os.path.join("tests", "data", "silence-44-s.flac") NEW = SAMPLE + ".new" def setUp(self): shutil.copy(self.SAMPLE, self.NEW) self.failUnlessEqual(open(self.SAMPLE, "rb").read(), open(self.NEW, "rb").read()) self.flac = FLAC(self.NEW) def test_delete(self): self.failUnless(self.flac.tags) self.flac.delete() self.failIf(self.flac.tags) flac = FLAC(self.NEW) self.failIf(flac.tags) def test_module_delete(self): delete(self.NEW) flac = FLAC(self.NEW) self.failIf(flac.tags) def test_info(self): self.failUnlessAlmostEqual(FLAC(self.NEW).info.length, 3.7, 1) def test_keys(self): self.failUnlessEqual( list(self.flac.keys()), list(self.flac.tags.keys())) def test_values(self): self.failUnlessEqual( list(self.flac.values()), list(self.flac.tags.values())) def test_items(self): self.failUnlessEqual( list(self.flac.items()), list(self.flac.tags.items())) def test_vc(self): self.failUnlessEqual(self.flac['title'][0], 'Silence') def test_write_nochange(self): f = FLAC(self.NEW) f.save() self.failUnlessEqual(open(self.SAMPLE, "rb").read(), open(self.NEW, "rb").read()) def test_write_changetitle(self): f = FLAC(self.NEW) if PY3: self.assertRaises( TypeError, f.__setitem__, b'title', b"A New Title") else: f[b"title"] = b"A New Title" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[b"title"][0], b"A New Title") def test_write_changetitle_unicode_value(self): f = FLAC(self.NEW) if PY3: self.assertRaises( TypeError, f.__setitem__, b'title', u"A Unicode Title \u2022") else: f[b"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[b"title"][0], u"A Unicode Title \u2022") def test_write_changetitle_unicode_key(self): f = FLAC(self.NEW) f[u"title"] = b"A New Title" if PY3: self.assertRaises(ValueError, f.save) else: f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], b"A New Title") def test_write_changetitle_unicode_key_and_value(self): f = FLAC(self.NEW) f[u"title"] = u"A Unicode Title \u2022" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f[u"title"][0], u"A Unicode Title \u2022") def test_force_grow(self): f = FLAC(self.NEW) f["faketag"] = ["a" * 1000] * 1000 f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["a" * 1000] * 1000) def test_force_shrink(self): self.test_force_grow() f = FLAC(self.NEW) f["faketag"] = "foo" f.save() f = FLAC(self.NEW) self.failUnlessEqual(f["faketag"], ["foo"]) def test_add_vc(self): f = FLAC(os.path.join("tests", "data", "no-tags.flac")) self.failIf(f.tags) f.add_tags() self.failUnless(f.tags == []) self.failUnlessRaises(ValueError, f.add_tags) def test_add_vc_implicit(self): f = FLAC(os.path.join("tests", "data", "no-tags.flac")) self.failIf(f.tags) f["foo"] = "bar" self.failUnless(f.tags == [("foo", "bar")]) self.failUnlessRaises(ValueError, f.add_tags) def test_ooming_vc_header(self): # issue 112: Malformed FLAC Vorbis header causes out of memory error # http://code.google.com/p/mutagen/issues/detail?id=112 self.assertRaises(IOError, FLAC, os.path.join('tests', 'data', 'ooming-header.flac')) def test_with_real_flac(self): if not have_flac: return self.flac["faketag"] = "foobar" * 1000 self.flac.save() badval = os.system("tools/notarealprogram 2> %s" % devnull) value = os.system("flac -t %s 2> %s" % (self.flac.filename, devnull)) self.failIf(value and value != badval) def test_save_unknown_block(self): block = MetadataBlock(b"test block data") block.code = 99 self.flac.metadata_blocks.append(block) self.flac.save() def test_load_unknown_block(self): self.test_save_unknown_block() flac = FLAC(self.NEW) self.failUnlessEqual(len(flac.metadata_blocks), 7) self.failUnlessEqual(flac.metadata_blocks[5].code, 99) self.failUnlessEqual(flac.metadata_blocks[5].data, b"test block data") def test_two_vorbis_blocks(self): self.flac.metadata_blocks.append(self.flac.metadata_blocks[1]) self.flac.save() self.failUnlessRaises(IOError, FLAC, self.NEW) def test_missing_streaminfo(self): self.flac.metadata_blocks.pop(0) self.flac.save() self.failUnlessRaises(IOError, FLAC, self.NEW) def test_load_invalid_flac(self): self.failUnlessRaises( IOError, FLAC, os.path.join("tests", "data", "xing.mp3")) def test_save_invalid_flac(self): self.failUnlessRaises( IOError, self.flac.save, os.path.join("tests", "data", "xing.mp3")) def test_pprint(self): self.failUnless(self.flac.pprint()) def test_double_load(self): blocks = list(self.flac.metadata_blocks) self.flac.load(self.flac.filename) self.failUnlessEqual(blocks, self.flac.metadata_blocks) def test_seektable(self): self.failUnless(self.flac.seektable) def test_cuesheet(self): self.failUnless(self.flac.cuesheet) def test_pictures(self): self.failUnless(self.flac.pictures) def test_add_picture(self): f = FLAC(self.NEW) c = len(f.pictures) f.add_picture(Picture()) f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.pictures), c + 1) def test_clear_pictures(self): f = FLAC(self.NEW) c1 = len(f.pictures) c2 = len(f.metadata_blocks) f.clear_pictures() f.save() f = FLAC(self.NEW) self.failUnlessEqual(len(f.metadata_blocks), c2 - c1) def test_ignore_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW) f = FLAC(self.NEW) f['title'] = 'vc title' f.save() id3 = ID3(self.NEW) self.failUnlessEqual(id3['TIT2'].text, ['id3 title']) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_delete_id3(self): id3 = ID3() id3.add(TIT2(encoding=0, text='id3 title')) id3.save(self.NEW, v1=2) f = FLAC(self.NEW) f['title'] = 'vc title' f.save(deleteid3=True) self.failUnlessRaises(ID3NoHeaderError, ID3, self.NEW) f = FLAC(self.NEW) self.failUnlessEqual(f['title'], ['vc title']) def test_mime(self): self.failUnless("audio/x-flac" in self.flac.mime) def test_variable_block_size(self): FLAC(os.path.join("tests", "data", "variable-block.flac")) def test_load_flac_with_application_block(self): FLAC(os.path.join("tests", "data", "flac_application.flac")) def tearDown(self): os.unlink(self.NEW)