Advertisement
Guest User

rename_vpks.py

a guest
Aug 30th, 2016
1,455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.24 KB | None | 0 0
  1. import filecmp
  2. import glob
  3. import os
  4. import string
  5. import struct
  6. import sys
  7. import zipfile
  8.  
  9. input_filename = "*.vpk"
  10. if len(sys.argv) > 1:
  11.     input_filename = sys.argv[1]
  12.  
  13. for filename in glob.glob(input_filename):
  14.     filename = filename.strip()
  15.    
  16.     if not os.path.exists(filename):
  17.         print "Could not find %s, skipping..." % filename
  18.         continue
  19.    
  20.     with zipfile.ZipFile(filename, 'r') as vpk:
  21.         param_path = "sce_sys/param.sfo"
  22.    
  23.         if param_path not in vpk.namelist():
  24.             param_path = None
  25.             for subfile in vpk.namelist():
  26.                 # Search for param.sfo
  27.                 if subfile.endswith("param.sfo"):
  28.                     param_path = subfile
  29.                     break
  30.                    
  31.         if not param_path:
  32.             print "Could not find param.sfo in %s, skipping..." % filename
  33.             break
  34.            
  35.         # Read param.sfo
  36.         param_data = vpk.read(param_path)
  37.        
  38.         key_offset, data_offset = struct.unpack("<II", param_data[0x08:0x10])
  39.         keys = param_data[key_offset:data_offset].strip('\0').split('\0')
  40.        
  41.         def get_data(key):
  42.             if key not in keys:
  43.                 return None
  44.        
  45.             idx = keys.index(key)
  46.             info_offset = 0x14 + (idx * 0x10)
  47.             len, _, offset = struct.unpack("<III", param_data[info_offset + 0x04: info_offset + 0x10])
  48.             data = param_data[data_offset+offset:data_offset+offset+len]
  49.             key = keys[idx]
  50.            
  51.             return data
  52.            
  53.         title = get_data("TITLE").strip('\0').strip().decode('utf-8')
  54.         title_id = get_data("TITLE_ID").strip('\0').strip()
  55.         version = get_data("APP_VER").strip('\0').strip()
  56.            
  57.         if not title:
  58.             print "Could not find title of game"
  59.             exit(-1)
  60.            
  61.         region = None
  62.         if "PCSB" in title_id or "PCSF" in title_id:
  63.             region = "EUR"
  64.         elif "PCSE" in title_id or "PCSA" in title_id:
  65.             region = "USA"
  66.         elif "PCSG" in title_id or "PCSC" in title_id:
  67.             region = "JPN"
  68.        
  69.     new_filename = "%s" % title
  70.     if title_id:
  71.         new_filename = "%s (%s)" % (new_filename, title_id)
  72.     if version:
  73.         new_filename = "%s (v%s)" % (new_filename, version)
  74.     if region:
  75.         new_filename = "%s (%s)" % (new_filename, region)
  76.    
  77.     # Remove invalid characters from filename in the ASCII range
  78.     valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
  79.     new_filename_base = ''.join(c for c in new_filename if c in valid_chars or ord(c) > 0x7f)
  80.    
  81.     new_filename = new_filename_base + ".vpk"
  82.    
  83.     # Check if the files are the same
  84.     # A simple filename comparison does not work because of encoding issues unfortunately
  85.     # And such a check is required for when 2 VPKs are required because they will return the same name
  86.     dupe = 1
  87.     while os.path.exists(new_filename) and not filecmp.cmp(filename, new_filename):
  88.         new_filename = "%s (%d).vpk" % (new_filename_base, dupe)
  89.         dupe += 1
  90.        
  91.     print "Renaming '%s'..." % filename
  92.    
  93.     # Rename VPK file
  94.     os.rename(filename, new_filename)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement