import struct, zlib, os, datetime TYPE_NORMAL, TYPE_DEMV1, TYPE_TXT, TYPE_PAK, TYPE_DZ, TYPE_DEM, \ TYPE_NEHAHRA, TYPE_DIR, TYPE_STORE, TYPE_LAST = range(10) class DzipReadError(Exception): pass class Binary(object): def __init__(self, f): names, codes = zip(*self.layout) code = '<' + ''.join(codes) s = struct.calcsize(code) data = struct.unpack(code, f.read(s)) for n, d in zip(names, data): setattr(self, n, d) class DzDirectory(Binary): layout = [('ptr', 'I'), ('size', 'I'), ('real', 'I'), ('len', 'H'), ('pak', 'H'), ('crc', 'i'), ('type', 'I'), ('date', 'I'), ('inter', 'I')] def __init__(self, f): super(DzDirectory, self).__init__(f) self.name = f.read(self.len)[:-1] class PakEntry(Binary): layout = [('name', '56s'), ('ptr', 'I'), ('len', 'I')] def __init__(self, f): super(DzDirectory, self).__init__(f) self.name = self.name[:self.name.index('\0')] class DzFile(object): def __init__(self, fname): if isinstance(fname, str): self.f = open(fname) else: self.f = fname d, z, self.major, self.minor, offset, numfiles = struct.unpack( '> 16 & 0x1f, (date >> 21 & 0x0f) + 1, (date >> 25 & 0x7f) + 1980, date >> 11 & 0x1f, date >> 5 & 0x3f, (date & 0x1f) << 1) return year, month, day, hour, min, secs def dzList(fname): dzf = DzFile(fname) print "contents of %s, created using version %u.%u:"%( fname, dzf.major, dzf.minor) for d in dzf.dirs: if d.type == TYPE_DIR: print " %s"%d.name elif d.pak and d.type != TYPE_PAK: print " %-17s size: %-8u packed: %-8u"%(d.name, d.real, d.size) else: print " %-18s size: %-8u packed: %-8u"%(d.name, d.real, d.size), year, month, day, hour, min, secs = parseDate(d.date) print "%02u.%02u.%4u %02u:%02u:%02u"%(day, month, year, hour, min, secs) print def dzUncompress(fname): dzf = DzFile(fname) print "%s created using v%u.%u"%( fname, dzf.major, dzf.minor) for d in dzf.dirs: if d.type not in [TYPE_NORMAL, TYPE_STORE]: print "can't decompress %s yet"%(d.name,) else: if os.path.exists(d.name): print "%s exists; will not overwrite"%(d.name,) else: print "extracting", d.name open(d.name, 'wb').write(dzf.extract(d)) print def dzExtract(fname, name): dzf = DzFile(fname) for d in dzf.dirs: if d.name != name: continue return dzf.extract(d) raise DzipReadError, "failed to find" def gettxt(dzname): dzf = DzFile(dzname) for d in dzf.dirs: if d.name.endswith('.txt'): return d.name, dzf.extract(d) def getdemdate(dzf): for d in dzf.dirs: if d.name.endswith('.dem') and '_' in d.name: return datetime.datetime(*parseDate(d.date)) raise DzipReadError, "not found!" def getdemdate(dzf): for d in dzf.dirs: if d.name.endswith('.dem') and '_' in d.name: return datetime.datetime(*parseDate(d.date)) raise DzipReadError, "not found!" if __name__ == '__main__': import sys try: print getdemdate(sys.argv[1]) except DzipReadError, e: print e.args[0]