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)
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)
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
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