def __init__(self, header_data, xheader_data): """Interprets byte data as a tag header to build object Args: header_data: character array of bytes representing the tag header. Must contain an ID3v1 tag xheader_data: character array of bytes representing the extended tag header. This does not have to contain an extended header (in which case it will be ignored). """ # Check we're actually looking at an ID3v1 tag if header_data[:3] != "TAG": raise Exception("Given data does not contain an ID3v1 tag header") # Extract data self.data = TrackData.TrackData() self.data.title = _strip_null_bytes(header_data[3:33]) self.data.artist = _strip_null_bytes(header_data[33:63]) self.data.album = _strip_null_bytes(header_data[63:93]) self.data.year = TrackData.mint(_strip_null_bytes(header_data[93:97])) if ord(header_data[125]) == 0 and ord(header_data[126]) != 0: self.version = 1 # id3 v1.1 self.comment = _strip_null_bytes(header_data[97:125]) self.data.track = ord(header_data[126]) else: self.version = 0 # id3 v1.0 self.comment = _strip_null_bytes(header_data[97:127]) self.data.track = None self.genre = ord(header_data[127]) # Check if we have an extended tag and extract it self.is_extended = xheader_data[:4] == "TAG+" if self.is_extended: self.data.title += _strip_null_bytes(xheader_data[4:64]) self.data.artist += _strip_null_bytes(xheader_data[64:124]) self.data.album += _strip_null_bytes(xheader_data[124:184])
def get_year(self, file_handle): """Retrieves the track year from this tag Args: file_handle: open file handle to read the frame body from Returns: int track year or None if this tag doesn't contain it """ version = self.header.version if version == 2: frame_id = "TYE" elif version == 3 or version == 4: frame_id = "TYER" else: return None frame = self.__get_frame(frame_id) if frame: body_data = _read_frame_text(frame.read_body(file_handle)) return TrackData.mint(body_data[0:4]) return None