Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import filecmp
- import glob
- import os
- import string
- import struct
- import sys
- import zipfile
- input_filename = "*.vpk"
- if len(sys.argv) > 1:
- input_filename = sys.argv[1]
- for filename in glob.glob(input_filename):
- filename = filename.strip()
- if not os.path.exists(filename):
- print "Could not find %s, skipping..." % filename
- continue
- with zipfile.ZipFile(filename, 'r') as vpk:
- param_path = "sce_sys/param.sfo"
- if param_path not in vpk.namelist():
- param_path = None
- for subfile in vpk.namelist():
- # Search for param.sfo
- if subfile.endswith("param.sfo"):
- param_path = subfile
- break
- if not param_path:
- print "Could not find param.sfo in %s, skipping..." % filename
- break
- # Read param.sfo
- param_data = vpk.read(param_path)
- key_offset, data_offset = struct.unpack("<II", param_data[0x08:0x10])
- keys = param_data[key_offset:data_offset].strip('\0').split('\0')
- def get_data(key):
- if key not in keys:
- return None
- idx = keys.index(key)
- info_offset = 0x14 + (idx * 0x10)
- len, _, offset = struct.unpack("<III", param_data[info_offset + 0x04: info_offset + 0x10])
- data = param_data[data_offset+offset:data_offset+offset+len]
- key = keys[idx]
- return data
- title = get_data("TITLE").strip('\0').strip().decode('utf-8')
- title_id = get_data("TITLE_ID").strip('\0').strip()
- version = get_data("APP_VER").strip('\0').strip()
- if not title:
- print "Could not find title of game"
- exit(-1)
- region = None
- if "PCSB" in title_id or "PCSF" in title_id:
- region = "EUR"
- elif "PCSE" in title_id or "PCSA" in title_id:
- region = "USA"
- elif "PCSG" in title_id or "PCSC" in title_id:
- region = "JPN"
- new_filename = "%s" % title
- if title_id:
- new_filename = "%s (%s)" % (new_filename, title_id)
- if version:
- new_filename = "%s (v%s)" % (new_filename, version)
- if region:
- new_filename = "%s (%s)" % (new_filename, region)
- # Remove invalid characters from filename in the ASCII range
- valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
- new_filename_base = ''.join(c for c in new_filename if c in valid_chars or ord(c) > 0x7f)
- new_filename = new_filename_base + ".vpk"
- # Check if the files are the same
- # A simple filename comparison does not work because of encoding issues unfortunately
- # And such a check is required for when 2 VPKs are required because they will return the same name
- dupe = 1
- while os.path.exists(new_filename) and not filecmp.cmp(filename, new_filename):
- new_filename = "%s (%d).vpk" % (new_filename_base, dupe)
- dupe += 1
- print "Renaming '%s'..." % filename
- # Rename VPK file
- os.rename(filename, new_filename)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement