示例#1
0
    def _read_id3v24_frame(self):
        (frame_id, ) = struct.unpack('> 4s ', self.input_file.read(4))
        size = utils.decode_bitwise_int(struct.unpack('> B B B B',
                                                      self.input_file.read(4)))

        self.input_file.seek(2, io.SEEK_CUR)  # Flags, not used

        return self._read_id3_generic_frame(frame_id, size, 4)
示例#2
0
    def _read_id3v24_frame(self):
        (frame_id, ) = struct.unpack('> 4s ', self.input_file.read(4))
        size = utils.decode_bitwise_int(
            struct.unpack('> B B B B', self.input_file.read(4)))

        self.input_file.seek(2, io.SEEK_CUR)  # Flags, not used

        return self._read_id3_generic_frame(frame_id, size, 4)
示例#3
0
    def _read_id3v2_tags(self):
        (mayor, minor) = struct.unpack('> B B', self.input_file.read(2))

        #TODO Check if extended header (second bit from left), and skip
        # In extended header, first 4 bytes are the size.
        self.input_file.seek(1, io.SEEK_CUR)  # Flags

        size = utils.decode_bitwise_int(struct.unpack('> B B B B',
                                                      self.input_file.read(4)))
        log.info(' Complete size: {}'.format(size))

        header_size = 10  # For id3v2.3 and id3v2.4
        if mayor == 2:
            read_frame = self._read_id3v22_frame
            header_size = 6
        elif mayor == 3:
            read_frame = self._read_id3v23_frame
        elif mayor == 4:
            read_frame = self._read_id3v24_frame
        else:   # pragma: no cover
            raise Exception('ID3 version "2.{}" not supported'.format(mayor))

        comments = {}
        while size > 0:

            # Remaining size is less than header size, must be padding
            if size <= header_size:
                self.input_file.seek(size, io.SEEK_CUR)
                break

            frame = read_frame()
            size -= (frame.size + header_size)
            if frame.comment:  # Only use some frames
                comments.update(frame.comment)

            elif frame.size == 0:  # Padding at the end of the frames
                log.info('Found padding: {} bytes'.format(frame.size + size))
                self.input_file.seek(size, io.SEEK_CUR)
                size = 0

        return comments
示例#4
0
    def _read_id3v2_tags(self):
        (mayor, minor) = struct.unpack('> B B', self.input_file.read(2))

        #TODO Check if extended header (second bit from left), and skip
        # In extended header, first 4 bytes are the size.
        self.input_file.seek(1, io.SEEK_CUR)  # Flags

        size = utils.decode_bitwise_int(
            struct.unpack('> B B B B', self.input_file.read(4)))
        log.info(' Complete size: {}'.format(size))

        header_size = 10  # For id3v2.3 and id3v2.4
        if mayor == 2:
            read_frame = self._read_id3v22_frame
            header_size = 6
        elif mayor == 3:
            read_frame = self._read_id3v23_frame
        elif mayor == 4:
            read_frame = self._read_id3v24_frame
        else:  # pragma: no cover
            raise Exception('ID3 version "2.{}" not supported'.format(mayor))

        comments = {}
        while size > 0:

            # Remaining size is less than header size, must be padding
            if size <= header_size:
                self.input_file.seek(size, io.SEEK_CUR)
                break

            frame = read_frame()
            size -= (frame.size + header_size)
            if frame.comment:  # Only use some frames
                comments.update(frame.comment)

            elif frame.size == 0:  # Padding at the end of the frames
                log.info('Found padding: {} bytes'.format(frame.size + size))
                self.input_file.seek(size, io.SEEK_CUR)
                size = 0

        return comments