Guest User

Untitled

a guest
Sep 27th, 2019
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.89 KB | None | 0 0
  1. import io
  2. import struct
  3. import os
  4.  
  5. class MOTFile:
  6.     """MOT File TODO"""
  7.  
  8.     def __init__(self, data):
  9.         self.data = data
  10.  
  11.     @property
  12.     def is_valid(self):
  13.         """Returns true iff the data size is equal to the size of all
  14.        contained files"""
  15.         try:
  16.             return len(self.data) == self.offset(self.num_files - 1) + self.size(self.num_files-1)
  17.         except:
  18.             return False
  19.  
  20.     @property
  21.     def num_files(self):
  22.         return struct.unpack("I", self.data[:4])[0]
  23.    
  24.     @property
  25.     def header_size(self):
  26.         size = 4 + self.num_files * 4
  27.         # Round to a multiple of 16
  28.         return ((size + 15) // 16) * 16
  29.  
  30.     def offset(self, i):
  31.         if i == 0:
  32.             return self.header_size
  33.         else:
  34.             return self.size(i-1) + self.offset(i-1)
  35.  
  36.         return struct.unpack("I", self.data[4+(i*8):8+(i*8)])[0]
  37.  
  38.     def size(self, i):
  39.         start = 4 + i*4
  40.         return struct.unpack("I", self.data[start:start+4])[0]
  41.  
  42.     def file(self, i):
  43.         offset = self.offset(i)
  44.         size = self.size(i)
  45.         return self.data[offset:offset+size]
  46.  
  47.     def describe(self):
  48.         res = io.StringIO()
  49.         res.write(f"Total Size: {len(self.data)}\n")
  50.         res.write(f"Valid: {self.is_valid}\n")
  51.         for n in range(self.num_files):
  52.             offset = self.offset(n)
  53.             size = self.size(n)
  54.             res.write(f"{n:01d}: offset {offset}, size {size}\n")
  55.         return res.getvalue()
  56.  
  57.     def unpack_to(self, path):
  58.         os.makedirs(path, exist_ok=True)
  59.         for i in range(self.num_files):
  60.             fbytes = self.file(i)
  61.             if MOTFile(fbytes).is_valid:
  62.                 MOTFile(fbytes).unpack_to(os.path.join(path, f"{i:03d}"))
  63.             else:
  64.                 with open(os.path.join(path, f"{i:03d}"), "wb") as f:
  65.                     f.write(fbytes)
Advertisement
Add Comment
Please, Sign In to add comment