code: def read_header(self):
          
  
          def read_mpq_header(offset=None):
              if offset:
                  self.file.seek(offset)
              data = self.file.read(32)
              header = MPQFileHeader._make(
                  struct.unpack(MPQFileHeader.struct_format, data))
              header = header._asdict()
              if header['format_version'] == 1:
                  data = self.file.read(12)
                  extended_header = MPQFileHeaderExt._make(
                      struct.unpack(MPQFileHeaderExt.struct_format, data))
                  header.update(extended_header._asdict())
              return header
  
          def read_mpq_user_data_header():
              data = self.file.read(16)
              header = MPQUserDataHeader._make(
                  struct.unpack(MPQUserDataHeader.struct_format, data))
              header = header._asdict()
              header['content'] = self.file.read(header['user_data_header_size'])
              return header
  
          magic = self.file.read(4)
          self.file.seek(0)
  
          if magic == b'MPQ\x1a':
              header = read_mpq_header()
              header['offset'] = 0
          elif magic == b'MPQ\x1b':
              user_data_header = read_mpq_user_data_header()
              header = read_mpq_header(user_data_header['mpq_header_offset'])
              header['offset'] = user_data_header['mpq_header_offset']
              header['user_data_header'] = user_data_header
          else:
              raise ValueError("Invalid file header.")
  
          return header
docs: Read the header of a MPQ archive.