def compare(a: str, b: str, check_tags: bool = True) -> int: if filecmp.cmp(a, b, False): return Result.SAME_FILE if check_tags: with TemporaryDirectory('compare-mp3') as tempdir: tempdir = Path(tempdir) name_a = (tempdir / 'a.mp3').as_posix() name_b = (tempdir / 'b.mp3').as_posix() copy_file(a, name_a) copy_file(b, name_b) id3.delete(name_a) id3.delete(name_b) if filecmp.cmp(name_a, name_b, False): return Result.SAME_BITSTREAM with TemporaryDirectory('.wav') as tempdir: name_a = tempdir + '/a.wav' name_b = tempdir + '/b.wav' check_call([which_lame(), '--decode', a, name_a]) check_call([which_lame(), '--decode', b, name_b]) set_writable(name_a) set_writable(name_b) if filecmp.cmp(name_a, name_b, False): return Result.SAME_WAV return Result.DIFFERENT
def test_empty_plustag_minustag_empty(self): id3 = ID3(self.filename) with open(self.filename, 'wb') as h: h.truncate() id3.save() id3.delete() self.failIf(id3) with open(self.filename, 'rb') as h: self.assertEquals(h.read(10), b'')
def test_delete_id3_with_ape(self): ID3(self.filename).save(v1=2) ape_tag = APEv2() ape_tag["oh"] = ["no"] ape_tag.save(self.filename) id3.delete(self.filename, delete_v2=False) self.assertEqual(APEv2(self.filename)["oh"], "no")
def test_save_id3_over_ape(self): id3.delete(self.filename, delete_v2=False) ape_tag = APEv2() ape_tag["oh"] = ["no"] ape_tag.save(self.filename) ID3(self.filename).save() self.assertEqual(APEv2(self.filename)["oh"], "no")
def test_empty_plustag_minustag_empty(self): id3 = ID3(self.filename) with open(self.filename, 'wb') as h: h.truncate() id3.save() id3.delete() self.failIf(id3) with open(self.filename, 'rb') as h: self.assertEquals(h.read(10), b'')
def test_delete_id3_with_ape(self): ID3(self.filename).save(v1=2) ape_tag = APEv2() ape_tag["oh"] = ["no"] ape_tag.save(self.filename) id3.delete(self.filename, delete_v2=False) self.assertEqual(APEv2(self.filename)["oh"], "no")
def test_save_id3_over_ape(self): id3.delete(self.filename, delete_v2=False) ape_tag = APEv2() ape_tag["oh"] = ["no"] ape_tag.save(self.filename) ID3(self.filename).save() self.assertEqual(APEv2(self.filename)["oh"], "no")
def test_ape_id3_lookalike(self): # mp3 with apev2 tag that parses as id3v1 (at least with ParseID3v1) id3.delete(self.filename, delete_v2=False) ape_tag = APEv2() ape_tag["oh"] = [ "noooooooooo0000000000000000000000000000000000ooooooooooo"] ape_tag.save(self.filename) ID3(self.filename).save() self.assertTrue(APEv2(self.filename))
def test_ape_id3_lookalike(self): # mp3 with apev2 tag that parses as id3v1 (at least with ParseID3v1) id3.delete(self.filename, delete_v2=False) ape_tag = APEv2() ape_tag["oh"] = [ "noooooooooo0000000000000000000000000000000000ooooooooooo"] ape_tag.save(self.filename) ID3(self.filename).save() self.assertTrue(APEv2(self.filename))
def test_merge_dst_no_tag(self): id3 = ID3(self.filename) id3.delete() id3.save(v2_version=3) with open(self.blank_file, "wb") as h: h.write(b"SOMEDATA") res, out, err = self.call2( self.filename, self.blank_file, fsn(u"--merge")) assert not any([res, out, err]) result = ID3(self.blank_file) assert result.version == (2, 3, 0)
def test_merge(self): id3 = ID3(self.filename) id3.delete() id3.add(mutagen.id3.TALB(text=[u"foo"])) id3.save(v2_version=3) target = ID3() target.add(mutagen.id3.TPE1(text=[u"bar", u"quux"])) target.save(self.blank_file, v2_version=4) res, out, err = self.call2( self.filename, self.blank_file, fsn(u"--merge")) assert not any([res, out, err]) result = ID3(self.blank_file) assert result.version == (2, 4, 0) assert result.getall("TALB")[0].text == [u"foo"] assert result.getall("TPE1")[0].text == [u"bar", u"quux"]
def tag(self, files, release, genre=None, strip_existing_tags=False, progress=None): files_and_tracks = zip(files, release.tracks) for file, track in files_and_tracks: if strip_existing_tags: id3.delete(file) apev2.delete(file) try: tag = id3.ID3(file) except id3.ID3NoHeaderError: tag = id3.ID3() tag.add(id3.TPE1(3, track.artist.name)) tag.add(id3.TALB(3, track.release.title)) tag.add(id3.TIT2(3, track.title)) tag.add(id3.TDRC(3, track.release.earliestReleaseDate)) tag.add(id3.TRCK(3, track.number_str())) if track.release.album_artist is not None: tag.add(id3.TPE2(3, track.release.album_artist)) discset = track.release.discset if discset: disc_num = discset.number_str() tag.add(id3.TPOS(3, disc_num)) if discset.desc: tag.delall('COMM') tag.add(id3.COMM(3, text=discset.desc, desc='', lang='eng')) if genre is not None: tag.add(id3.TCON(3, genre)) tag.add(id3.UFID(owner='http://musicbrainz.org', data=track.uuid)) tag.save(file) if progress is not None: progress(file, track)