docs: def read_header(self):
          """
          Reads VPK file header from the file
          """
          with fopen(self.vpk_path, 'rb') as f:
              (self.signature,
               self.version,
               self.tree_length
               ) = struct.unpack("3I", f.read(3*4))
  
              # original format - headerless
              if self.signature != 0x55aa1234:
                  raise ValueError("File is not VPK (invalid magic)")
              # v1
              elif self.version == 1:
                  self.header_length += 4*3
              # v2 with extended header
              #
              # according to http://forum.xentax.com/viewtopic.php?f=10&t=11208
              # struct VPKDirHeader_t
              # {
              #    int32 m_nHeaderMarker;
              #    int32 m_nVersion;
              #    int32 m_nDirectorySize;
              #    int32 m_nEmbeddedChunkSize;
              #    int32 m_nChunkHashesSize;
              #    int32 m_nSelfHashesSize;
              #    int32 m_nSignatureSize;
              # }
              elif self.version == 2:
                  (self.embed_chunk_length,
                   self.chunk_hashes_length,
                   self.self_hashes_length,
                   self.signature_length
                   ) = struct.unpack("4I", f.read(4*4))
                  self.header_length += 4*7
  
                  f.seek(self.tree_length + self.embed_chunk_length + self.chunk_hashes_length, 1)
  
                  assert self.self_hashes_length == 48, "Self hashes section size mismatch"
  
                  (self.tree_checksum,
                   self.chunk_hashes_checksum,
                   self.file_checksum,
                   ) = struct.unpack("16s16s16s", f.read(16*3))
              else:
                  raise ValueError("Invalid header, or unsupported version")