Beispiel #1
0
 def test_update_parents(self):
     file = open(self.filename)
     atoms = Atoms(file)
     self.assertEqual(77, atoms.atoms[0].length)
     self.assertEqual(61, atoms.atoms[0].children[0].length)
     tags = MP4Tags(atoms, file)
     tags['pgap'] = True
     tags.save(self.filename)
     file = open(self.filename)
     atoms = Atoms(file)
     # original size + 'pgap' size + padding
     self.assertEqual(77 + 25 + 974, atoms.atoms[0].length)
     self.assertEqual(61 + 25 + 974, atoms.atoms[0].children[0].length)
Beispiel #2
0
    def test_update_parents(self):
        with open(self.filename, "rb") as fileobj:
            atoms = Atoms(fileobj)
            self.assertEqual(77, atoms.atoms[0].length)
            self.assertEqual(61, atoms.atoms[0].children[0].length)
            tags = MP4Tags(atoms, fileobj)
            tags['pgap'] = True
            tags.save(self.filename, padding=lambda x: 0)

        with open(self.filename, "rb") as fileobj:
            atoms = Atoms(fileobj)
            # original size + 'pgap' size + padding
            self.assertEqual(77 + 25 + 8, atoms.atoms[0].length)
            self.assertEqual(61 + 25 + 8, atoms.atoms[0].children[0].length)
Beispiel #3
0
 def __read_offsets(self, filename):
     fileobj = open(filename, 'rb')
     atoms = Atoms(fileobj)
     moov = atoms[b'moov']
     samples = []
     for atom in moov.findall(b'stco', True):
         fileobj.seek(atom.offset + 12)
         data = fileobj.read(atom.length - 12)
         fmt = ">%dI" % cdata.uint_be(data[:4])
         offsets = struct.unpack(fmt, data[4:])
         for offset in offsets:
             fileobj.seek(offset)
             samples.append(fileobj.read(8))
     for atom in moov.findall(b'co64', True):
         fileobj.seek(atom.offset + 12)
         data = fileobj.read(atom.length - 12)
         fmt = ">%dQ" % cdata.uint_be(data[:4])
         offsets = struct.unpack(fmt, data[4:])
         for offset in offsets:
             fileobj.seek(offset)
             samples.append(fileobj.read(8))
     try:
         for atom in atoms[b"moof"].findall(b'tfhd', True):
             data = fileobj.read(atom.length - 9)
             flags = cdata.uint_be(b"\x00" + data[:3])
             if flags & 1:
                 offset = cdata.ulonglong_be(data[7:15])
                 fileobj.seek(offset)
                 samples.append(fileobj.read(8))
     except KeyError:
         pass
     fileobj.close()
     return samples
Beispiel #4
0
 def test_too_short(self):
     fileobj = open(self.audio.filename, "rb")
     try:
         atoms = Atoms(fileobj)
         ilst = atoms[b"moov.udta.meta.ilst"]
         # fake a too long atom length
         ilst.children[0].length += 10000000
         self.failUnlessRaises(MP4MetadataError, MP4Tags, atoms, fileobj)
     finally:
         fileobj.close()
Beispiel #5
0
 def test_mdhd_version_1(self, soun=b"soun"):
     mdhd = Atom.render(b"mdhd", (b"\x01\x00\x00\x00" + b"\x00" * 16 +
                                  b"\x00\x00\x00\x02" +  # 2 Hz
                                  b"\x00\x00\x00\x00\x00\x00\x00\x10"))
     hdlr = Atom.render(b"hdlr", b"\x00" * 8 + soun)
     mdia = Atom.render(b"mdia", mdhd + hdlr)
     trak = Atom.render(b"trak", mdia)
     moov = Atom.render(b"moov", trak)
     fileobj = cBytesIO(moov)
     atoms = Atoms(fileobj)
     info = MP4Info(atoms, fileobj)
     self.failUnlessEqual(info.length, 8)
Beispiel #6
0
    def test_padding_2(self):
        self.audio["\xa9nam"] = u"wheeee" * 10
        self.audio.save()

        # Reorder "free" and "ilst" atoms
        with open(self.audio.filename, "rb+") as fileobj:
            atoms = Atoms(fileobj)
            meta = atoms[b"moov", b"udta", b"meta"]
            meta_length1 = meta.length
            ilst = meta[b"ilst", ]
            free = meta[b"free", ]
            self.failUnlessEqual(ilst.offset + ilst.length, free.offset)
            fileobj.seek(ilst.offset)
            ilst_data = fileobj.read(ilst.length)
            fileobj.seek(free.offset)
            free_data = fileobj.read(free.length)
            fileobj.seek(ilst.offset)
            fileobj.write(free_data + ilst_data)

        with open(self.audio.filename, "rb+") as fileobj:
            atoms = Atoms(fileobj)
            meta = atoms[b"moov", b"udta", b"meta"]
            ilst = meta[b"ilst", ]
            free = meta[b"free", ]
            self.failUnlessEqual(free.offset + free.length, ilst.offset)

        # Save the file
        self.audio["\xa9nam"] = u"wheeee" * 11
        self.audio.save()

        # Check the order of "free" and "ilst" atoms
        with open(self.audio.filename, "rb+") as fileobj:
            atoms = Atoms(fileobj)

        meta = atoms[b"moov", b"udta", b"meta"]
        ilst = meta[b"ilst", ]
        free = meta[b"free", ]
        self.failUnlessEqual(meta.length, meta_length1)
        self.failUnlessEqual(ilst.offset + ilst.length, free.offset)
 def load(self, fp):
     self.filename = fp.name
     fileobj = fp
     try:
         atoms = Atoms(fileobj)
         try: self.info = MP4Info(atoms, fileobj)
         except StandardError, err:
             raise MP4StreamInfoError, err, sys.exc_info()[2]
         try: self.tags = MP4Tags(atoms, fileobj)
         except MP4MetadataError:
             self.tags = None
         except StandardError, err:
             raise MP4MetadataError, err, sys.exc_info()[2]
Beispiel #8
0
 def test_multiple_tracks(self):
     hdlr = Atom.render(b"hdlr", b"\x00" * 8 + b"whee")
     mdia = Atom.render(b"mdia", hdlr)
     trak1 = Atom.render(b"trak", mdia)
     mdhd = Atom.render(b"mdhd", (b"\x01\x00\x00\x00" + b"\x00" * 16 +
                                  b"\x00\x00\x00\x02" +  # 2 Hz
                                  b"\x00\x00\x00\x00\x00\x00\x00\x10"))
     hdlr = Atom.render(b"hdlr", b"\x00" * 8 + b"soun")
     mdia = Atom.render(b"mdia", mdhd + hdlr)
     trak2 = Atom.render(b"trak", mdia)
     moov = Atom.render(b"moov", trak1 + trak2)
     fileobj = cBytesIO(moov)
     atoms = Atoms(fileobj)
     info = MP4Info(atoms, fileobj)
     self.failUnlessEqual(info.length, 8)
Beispiel #9
0
 def setUp(self):
     with open(self.filename, "rb") as h:
         self.atoms = Atoms(h)
Beispiel #10
0
 def wrap_ilst(self, data):
     ilst = Atom.render(b"ilst", data)
     meta = Atom.render(b"meta", b"\x00" * 4 + ilst)
     data = Atom.render(b"moov", Atom.render(b"udta", meta))
     fileobj = BytesIO(data)
     return MP4Tags(Atoms(fileobj), fileobj)
Beispiel #11
0
 def test_no_tracks(self):
     moov = Atom.render(b"moov", b"")
     fileobj = BytesIO(moov)
     atoms = Atoms(fileobj)
     with self.assertRaises(MP4StreamInfoError):
         MP4Info(atoms, fileobj)
Beispiel #12
0
 def test_extra_trailing_data(self):
     data = BytesIO(Atom.render(b"data", b"whee") + b"\x00\x00")
     self.failUnless(Atoms(data))
Beispiel #13
0
 def test_extra_trailing_data(self):
     data = StringIO(Atom.render("data", "whee") + "\x00\x00")
     self.failUnless(Atoms(data))
Beispiel #14
0
 def setUp(self):
     self.atoms = Atoms(open(self.filename, "rb"))
Beispiel #15
0
 def wrap_ilst(self, data):
     ilst = Atom.render("ilst", data)
     meta = Atom.render("meta", "\x00" * 4 + ilst)
     data = Atom.render("moov", Atom.render("udta", meta))
     fileobj = StringIO(data)
     return MP4Tags(Atoms(fileobj), fileobj)