Advertisement
Guest User

unknytt.py

a guest
Jan 11th, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.58 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import struct
  4. import os
  5. import sys
  6.  
  7. def readheader(f):
  8.     magic = f.read(2)
  9.     if magic == '':
  10.         raise EOFError
  11.     if magic != 'NF':
  12.         raise ValueError, "not a valid knytt stories file"
  13.     nextchar = f.read(1)
  14.     name = []
  15.     while nextchar != '\0':
  16.         name.append(nextchar)
  17.         nextchar = f.read(1)
  18.     name = ''.join(name)
  19.     sizedata = f.read(4)
  20.     (size,) = struct.unpack('<L', sizedata)
  21.     return name, size
  22.  
  23. def extractfile(f, destdir='.'):
  24.     try:
  25.         name, size = readheader(f)
  26.     except EOFError:
  27.         return False
  28.    
  29.     outfilename = os.path.join(destdir, *name.split('\\'))
  30.    
  31.     print("Extracting %s (%s bytes).." % (name, size))
  32.    
  33.     outdir, dummy = os.path.split(outfilename)
  34.     try:
  35.         os.makedirs(outdir)
  36.     except OSError:
  37.         pass
  38.    
  39.     outfile = open(outfilename, 'wb')
  40.     bytestowrite = size
  41.     while bytestowrite > 0:
  42.         data = f.read(min(bytestowrite, 4096))
  43.         if data == '':
  44.             raise EOFError, "file ended prematurely"
  45.         outfile.write(data)
  46.         bytestowrite -= len(data)
  47.    
  48.     return True
  49.  
  50. def unknytt(f, worlddir='.'):
  51.     try:
  52.         name, dummy = readheader(f)
  53.     except EOFError:
  54.         raise ValueError, "not a valid knytt stories file"
  55.    
  56.     print("Creating %s\\" % name)
  57.     destdir = os.path.join(worlddir, name)
  58.     os.mkdir(destdir)
  59.    
  60.     while extractfile(f, destdir):
  61.         pass
  62.    
  63.     print("Everything is ok.")
  64.  
  65. if __name__ == '__main__':
  66.     f = open(sys.argv[1], 'rb')
  67.     unknytt(f)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement