def get_frame_data(name, size, bpi=True): data = name if bpi: data += BitPaddedInt.to_str(size) else: data += BitPaddedInt.to_str(size, bits=8) data += b"\x00\x00" + b"\x01" * size return data
def test_long(self): if PY2: data = BitPaddedInt.to_str(sys.maxint + 1, width=16) val = BitPaddedInt(data) self.assertEqual(val, sys.maxint + 1) self.assertTrue(isinstance(val, BitPaddedLong)) else: self.assertTrue(BitPaddedInt is BitPaddedLong)
def __init__(self, fileobj): """Raises MusepackHeaderError""" header = fileobj.read(4) if len(header) != 4: raise MusepackHeaderError("not a Musepack file") # Skip ID3v2 tags if header[:3] == b"ID3": header = fileobj.read(6) if len(header) != 6: raise MusepackHeaderError("not a Musepack file") size = 10 + BitPaddedInt(header[2:6]) fileobj.seek(size) header = fileobj.read(4) if len(header) != 4: raise MusepackHeaderError("not a Musepack file") if header.startswith(b"MPCK"): self.__parse_sv8(fileobj) else: self.__parse_sv467(fileobj) if not self.bitrate and self.length != 0: fileobj.seek(0, 2) self.bitrate = intround(fileobj.tell() * 8 / self.length)
def test_read__ignore_CRM(self): tags = ID3Tags() header = ID3Header() header.version = ID3Header._V22 framedata = CRM(owner="foo", desc="bar", data=b"bla")._writeData() datasize = BitPaddedInt.to_str(len(framedata), width=3, bits=8) tags._read(header, b"CRM" + datasize + framedata) self.assertEqual(len(tags), 0)
def skip_id3(fileobj): """Might raise IOError""" # WMP writes multiple id3s, so skip as many as we find while True: idata = fileobj.read(10) try: id3, insize = struct.unpack('>3sxxx4s', idata) except struct.error: id3, insize = b'', 0 insize = BitPaddedInt(insize) if id3 == b'ID3' and insize > 0: fileobj.seek(insize, 1) else: fileobj.seek(-len(idata), 1) break
def __check_header(self, fileobj, name): """Returns the offset of the flac block start (skipping id3 tags if found). The passed fileobj will be advanced to that offset as well. """ size = 4 header = fileobj.read(4) if header != b"fLaC": size = None if header[:3] == b"ID3": size = 14 + BitPaddedInt(fileobj.read(6)[2:]) fileobj.seek(size - 4) if fileobj.read(4) != b"fLaC": size = None if size is None: raise FLACNoHeaderError("%r is not a valid FLAC file" % name) return size
def __init__(self, fileobj): """Raises AACError""" # skip id3v2 header start_offset = 0 header = fileobj.read(10) if header.startswith(b"ID3"): size = BitPaddedInt(header[6:]) start_offset = size + 10 fileobj.seek(start_offset) adif = fileobj.read(4) if adif == b"ADIF": self._parse_adif(fileobj) self._type = "ADIF" else: self._parse_adts(fileobj, start_offset) self._type = "ADTS"
def test_s1l(self): self.assertEquals( BitPaddedInt.to_str(1, bigendian=False), b'\x01\x00\x00\x00')
def test_promote_long(self): l = BitPaddedInt(sys.maxint ** 2) self.assertTrue(isinstance(l, long)) self.assertEqual(BitPaddedInt(l.as_str(width=-1)), l)
def test_s0(self): self.assertEquals(BitPaddedInt.to_str(0), b'\x00\x00\x00\x00')
def test_s129(self): self.assertEquals(BitPaddedInt.to_str(129), b'\x00\x00\x01\x01')
def test_minwidth(self): self.assertEquals( len(BitPaddedInt.to_str(100, width=-1, minwidth=6)), 6)
def test_str_int_init(self): self.assertEquals(BitPaddedInt(238).as_str(), BitPaddedInt(struct.pack('>L', 238)).as_str())
def test_w129(self): self.assertEquals(BitPaddedInt.to_str(129, width=2), b'\x01\x01')
def test_1l(self): self.assertEquals( BitPaddedInt(b'\x01\x00\x00\x00', bigendian=False), 1)
def test_1(self): self.assertEquals(BitPaddedInt(b'\x00\x00\x00\x01'), 1)
def test_zero(self): self.assertEquals(BitPaddedInt(b'\x00\x00\x00\x00'), 0)
def test_promote_long(self): l = BitPaddedInt(sys.maxint**2) self.assertTrue(isinstance(l, long)) self.assertEqual(BitPaddedInt(l.as_str(width=-1)), l)
def test_w129l(self): self.assertEquals( BitPaddedInt.to_str(129, width=2, bigendian=False), b'\x01\x01')
def test_varwidth(self): self.assertEquals(len(BitPaddedInt.to_str(100)), 4) self.assertEquals(len(BitPaddedInt.to_str(100, width=-1)), 4) self.assertEquals(len(BitPaddedInt.to_str(2 ** 32, width=-1)), 5)
def test_s65(self): self.assertEquals(BitPaddedInt.to_str(0x41, 6), b'\x00\x00\x01\x01')
def test_32b(self): self.assertEquals(BitPaddedInt(b'\xFF\xFF\xFF\xFF', bits=8), 0xFFFFFFFF)
def test_32bi(self): self.assertEquals(BitPaddedInt(0xFFFFFFFF, bits=8), 0xFFFFFFFF)
def test_has_valid_padding(self): self.failUnless(BitPaddedInt.has_valid_padding(b"\xff\xff", bits=8)) self.failIf(BitPaddedInt.has_valid_padding(b"\xff")) self.failIf(BitPaddedInt.has_valid_padding(b"\x00\xff")) self.failUnless(BitPaddedInt.has_valid_padding(b"\x7f\x7f")) self.failIf(BitPaddedInt.has_valid_padding(b"\x7f", bits=6)) self.failIf(BitPaddedInt.has_valid_padding(b"\x9f", bits=6)) self.failUnless(BitPaddedInt.has_valid_padding(b"\x3f", bits=6)) self.failUnless(BitPaddedInt.has_valid_padding(0xff, bits=8)) self.failIf(BitPaddedInt.has_valid_padding(0xff)) self.failIf(BitPaddedInt.has_valid_padding(0xff << 8)) self.failUnless(BitPaddedInt.has_valid_padding(0x7f << 8)) self.failIf(BitPaddedInt.has_valid_padding(0x9f << 32, bits=6)) self.failUnless(BitPaddedInt.has_valid_padding(0x3f << 16, bits=6))
def test_s32b(self): self.assertEquals(BitPaddedInt(b'\xFF\xFF\xFF\xFF', bits=8).as_str(), b'\xFF\xFF\xFF\xFF')
def test_129b(self): self.assertEquals(BitPaddedInt(b'\x00\x00\x01\x81'), 0x81)
def test_65(self): self.assertEquals(BitPaddedInt(b'\x00\x00\x01\x81', 6), 0x41)