def assertTagError(self, prefix): errors = checker.find_tags_errors(self.au_file) for err_msg in errors: if err_msg.startswith(prefix): return print errors self.fail()
def test_ufid_tag_checks(self): ufid_tag = mutagen.id3.UFID(owner="bad", data="bad") self.au_file.mutagen_id3.add(ufid_tag) self.assertTagError(checker.ERROR_TAG_MISSING_REQUIRED + "UFID") ufid_tag.owner = constants.UFID_OWNER_IDENTIFIER # Need to re-add since changing the owner also changes the # hash key. A very annoying corner case, more proof that # mutagen's "just make it look like a dict" strategy is # ultimately misguided. self.au_file.mutagen_id3.add(ufid_tag) self.assertTagError(checker.ERROR_UFID_BAD_MALFORMED) bad_ufid_data = ufid.ufid(TEST_VOL + 1, TEST_TS, TEST_FP) ufid_tag.data = bad_ufid_data self.assertTagError(checker.ERROR_UFID_BAD_VOLUME) bad_ufid_data = ufid.ufid(TEST_VOL, TEST_TS + 1, TEST_FP) ufid_tag.data = bad_ufid_data self.assertTagError(checker.ERROR_UFID_BAD_TIMESTAMP) bad_ufid_data = ufid.ufid(TEST_VOL, TEST_TS, "2" * 40) ufid_tag.data = bad_ufid_data self.assertTagError(checker.ERROR_UFID_BAD_FINGERPRINT) ufid_tag.data = self.au_file.ufid() errors = checker.find_tags_errors(self.au_file) self.assertNoTagError(checker.ERROR_TAG_MISSING_REQUIRED + "UFID") self.assertNoTagError(checker.ERROR_UFID_BAD_OWNER) self.assertNoTagError(checker.ERROR_UFID_BAD_MALFORMED) self.assertNoTagError(checker.ERROR_UFID_BAD_VOLUME) self.assertNoTagError(checker.ERROR_UFID_BAD_TIMESTAMP) self.assertNoTagError(checker.ERROR_UFID_BAD_FINGERPRINT)
def standardize_file(au_file): """Correct and check a file's tags. Args: au_file: An AudioFile object. This object's tags are corrected in-place. Raises: ImportFileError: if the tags are broken or cannot be fixed. """ original_id3 = au_file.mutagen_id3 au_file.mutagen_id3 = _fix_file_tags(au_file) # Make sure our checker finds no errors. pre_write_tagging_errors = checker.find_tags_errors(au_file) if pre_write_tagging_errors: au_file.mutagen_id3 = original_id3 # Put back the original tags raise ImportFileError(["Found pre-write errors"] + pre_write_tagging_errors)
def test_tag_checks_no_errors(self): self.au_file.mutagen_id3.add( mutagen.id3.TOWN(text=["MPG/3"], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TLEN(text=[str(TEST_DURATION)], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TOWN(text=[constants.TOWN_FILE_OWNER], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TPE1(text=["Bob Dylan"], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TIT2(text=["Just Like Tom Thumb's Blues"], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TRCK(text=["3/4"], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add(self.au_file.ufid_tag()) self.au_file.mutagen_id3.add( mutagen.id3.TFLT(text=["MPG/3"], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TXXX(desc=constants.TXXX_FRAME_SIZE_DESCRIPTION, text=[unicode(TEST_FRAME_SIZE)], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TXXX(desc=constants.TXXX_FRAME_COUNT_DESCRIPTION, text=[unicode(TEST_FRAME_COUNT)], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.au_file.mutagen_id3.add( mutagen.id3.TXXX(desc=constants.TXXX_ALBUM_ID_DESCRIPTION, text=[unicode(TEST_ALBUM_ID)], encoding=constants.DEFAULT_ID3_TEXT_ENCODING)) self.assertEqual([], checker.find_tags_errors(self.au_file))
def assertNoTagError(self, prefix): errors = checker.find_tags_errors(self.au_file) for err_msg in errors: if err_msg.startswith(prefix): self.fail(errors)
""" # Make sure the canonical directory exists. try: os.makedirs(au_file.canonical_directory(prefix)) except OSError, ex: if ex.errno != errno.EEXIST: raise path = au_file.canonical_path(prefix) if os.path.exists(path): raise ImportFileError(["File exists: " + path]) au_file.mutagen_id3.save(path) assert au_file.payload is not None out_fh = open(path, "a") out_fh.write(au_file.payload) out_fh.close() # Now make sure that the file we just wrote passes our checks. new_au_file = audio_file.scan(path) if new_au_file is None: raise ImportFileError(["New file damaged!"]) new_au_file.volume = au_file.volume new_au_file.import_timestamp = au_file.import_timestamp post_write_tagging_errors = checker.find_tags_errors(new_au_file) if post_write_tagging_errors: os.unlink(path) raise ImportFileError(["Found post-write errors!"] + post_write_tagging_errors) return path