def testMultipleStrings(self): for cls in (stagger.Tag23, stagger.Tag24): # Versions 2.3 and 2.4 have support for multiple values in text # frames. tag = cls() tag.padding_max = 0 tag[TIT2] = ("Foo", "Bar", "Baz") self.assertEqual(len(tag[TIT2].text), 3) data = tag.encode() dtag = stagger.decode_tag(data) self.assertEqual(len(dtag[TIT2].text), 3) self.assertEqual(dtag[TIT2].text, tag[TIT2].text) # Version 2.2 has no such support, so stagger merges multiple strings. tag = stagger.Tag22() tag.padding_max = 0 tag[TT2] = ("Foo", "Bar", "Baz") self.assertEqual(len(tag[TT2].text), 3) with warnings.catch_warnings(record=True) as ws: data = tag.encode() self.assertEqual(len(ws), 1) self.assertEqual(ws[0].category, stagger.FrameWarning) dtag = stagger.decode_tag(data) self.assertEqual(len(dtag[TT2].text), 1) self.assertEqual(dtag[TT2].text, ["Foo / Bar / Baz"])
def testFrameOrder(self): # 24.stagger.sample-01.id3 contains a simple test tag that has file frames # in the following order: # # TIT2("TIT2"), TPE1("TPE1"), TALB("TALB"), TRCK("TRCK"), TPE2("TPE2") testfile = os.path.join(os.path.dirname(__file__), "samples", "24.stagger.sample-01.id3") framelist = [TRCK, TPE2, TALB, TIT2, TPE1] # Read tag, verify frame ordering is preserved tag = stagger.read_tag(testfile) self.assertEqual(len(tag), 5) self.assertEqual(set(tag.keys()), set(frame.frameid for frame in framelist)) self.assertEqual( [frame.frameid for frame in tag.frames(orig_order=True)], [frame.frameid for frame in framelist]) # Test frame contents for framecls in framelist: # tag[TIT2] == tag["TIT2"] self.assertTrue(framecls in tag) self.assertTrue(framecls.frameid in tag) self.assertEqual(tag[framecls], tag[framecls.frameid]) # type(tag[TIT2]) == TIT2 self.assertTrue(isinstance(tag[framecls], framecls)) # Each frame contains a single string, which is the frame id in # lowercase. self.assertEqual(len(tag[framecls].text), 1) self.assertEqual(tag[framecls].text[0], framecls.frameid.lower()) # Encode tag with default frame ordering, verify result is different. with open(testfile, "rb") as file: filedata = file.read() tag.padding_max = 0 # Default sorting order is different. tagdata = tag.encode() self.assertEqual(len(tagdata), len(filedata)) self.assertFalse(tagdata == filedata) # Override the sort order with an empty list, # verify resulting order is the same as in the original file. tag.frame_order = stagger.tags.FrameOrder() tagdata = tag.encode() self.assertTrue(tagdata == filedata) tag2 = stagger.decode_tag(tagdata) self.assertTrue(tag == tag2)
def testFrameOrder(self): # 24.stagger.sample-01.id3 contains a simple test tag that has file frames # in the following order: # # TIT2("TIT2"), TPE1("TPE1"), TALB("TALB"), TRCK("TRCK"), TPE2("TPE2") testfile = os.path.join(os.path.dirname(__file__), "samples", "24.stagger.sample-01.id3") framelist = [TRCK, TPE2, TALB, TIT2, TPE1] # Read tag, verify frame ordering is preserved tag = stagger.read_tag(testfile) self.assertEqual(len(tag), 5) self.assertEqual( set(tag.keys()), set(frame.frameid for frame in framelist)) self.assertEqual([frame.frameid for frame in tag.frames(orig_order=True)], [frame.frameid for frame in framelist]) # Test frame contents for framecls in framelist: # tag[TIT2] == tag["TIT2"] self.assertTrue(framecls in tag) self.assertTrue(framecls.frameid in tag) self.assertEqual(tag[framecls], tag[framecls.frameid]) # type(tag[TIT2]) == TIT2 self.assertTrue(isinstance(tag[framecls], framecls)) # Each frame contains a single string, which is the frame id in # lowercase. self.assertEqual(len(tag[framecls].text), 1) self.assertEqual(tag[framecls].text[0], framecls.frameid.lower()) # Encode tag with default frame ordering, verify result is different. with open(testfile, "rb") as file: filedata = file.read() tag.padding_max = 0 # Default sorting order is different. tagdata = tag.encode() self.assertEqual(len(tagdata), len(filedata)) self.assertFalse(tagdata == filedata) # Override the sort order with an empty list, # verify resulting order is the same as in the original file. tag.frame_order = stagger.tags.FrameOrder() tagdata = tag.encode() self.assertTrue(tagdata == filedata) tag2 = stagger.decode_tag(tagdata) self.assertTrue(tag == tag2)
def test(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", stagger.Warning) tag = stagger.read_tag(file) prefix_to_class = { "22.": stagger.Tag22, "23.": stagger.Tag23, "24.": stagger.Tag24 } # Check tag version based on filename prefix basename = os.path.basename(file) self.assertTrue( any(basename.startswith(prefix) for prefix in prefix_to_class)) for prefix in prefix_to_class: if basename.startswith(prefix): self.assertEqual(type(tag), prefix_to_class[prefix]) self.assertEqual(tag.version, int(prefix[1])) if basename.endswith(".lossy.id3"): # Don't try to match generated tag to original when stagger is # explicitly expected to modify the tag. return # Scrub known invalid frames. # Stagger won't save these, so they would result in a tag mismatch # below. for key in list(tag.keys()): if key.endswith(" "): # iTunes del tag[key] if tag.version == 4 and key == "XSOP": # MusicBrainz del tag[key] tag.padding_max = 0 data = tag.encode() tag2 = stagger.decode_tag(data) tag.padding_max = 0 data2 = tag.encode() self.assertEqual(data, data2, "data mismatch in file {0}".format(file)) self.assertEqual(tag, tag2, "tag mismatch in file{0}".format(file))
def test(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", stagger.Warning) tag = stagger.read_tag(file) prefix_to_class = { "22.": stagger.Tag22, "23.": stagger.Tag23, "24.": stagger.Tag24 } # Check tag version based on filename prefix basename = os.path.basename(file) self.assertTrue(any(basename.startswith(prefix) for prefix in prefix_to_class)) for prefix in prefix_to_class: if basename.startswith(prefix): self.assertEqual(type(tag), prefix_to_class[prefix]) self.assertEqual(tag.version, int(prefix[1])) if basename.endswith(".lossy.id3"): # Don't try to match generated tag to original when stagger is # explicitly expected to modify the tag. return # Scrub known invalid frames. # Stagger won't save these, so they would result in a tag mismatch below. for key in list(tag.keys()): if key.endswith(" "): # iTunes del tag[key] if tag.version == 4 and key == "XSOP": # MusicBrainz del tag[key] tag.padding_max = 0 data = tag.encode() tag2 = stagger.decode_tag(data) tag.padding_max = 0 data2 = tag.encode() self.assertEqual(data, data2, "data mismatch in file {0}".format(file)) self.assertEqual(tag, tag2, "tag mismatch in file{0}".format(file))