Exemplo n.º 1
0
    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"])
Exemplo n.º 2
0
    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"])
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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))
Exemplo n.º 6
0
    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))