#!/usr/bin/python3 """ ### ps2-sync This tool makes links to ISO files in the way that Open PS2 Loader expects. It should work for both Samba and USB loading, but has only been tested with Samba. This depends on hdl-dump. """ import os import subprocess # TODO: Replace these with user input and/or config files. ROOT_PATH = '.' def get_disc_info(disc_image_path): this_disc_info = { 'gameid': None, 'disc_type': None, 'filename': None } # TODO: Figure out how to do hdl-dump's work in this script. # I tried this with isoparser, but the parsing took far too long. hdl_dump_args = ['hdl-dump', 'cdvd_info2', disc_image_path] # hdl-dump has a weird output format, quoting items inconsistently. Fortunately, it isn't # likely to change anytime soon. hdl_dump_result = subprocess.run(hdl_dump_args, capture_output=True) if hdl_dump_result.returncode == 0: hdl_dump_output = hdl_dump_result.stdout.decode('utf-8').split(' ') # hdl-dump prepends "dual-layer" to the disc type field instead of using DVD5/DVD9. if hdl_dump_output[0] == 'dual-layer': this_disc_info['gameid'] = hdl_dump_output[4][1:-1] this_disc_info['disc_type'] = hdl_dump_output[1] else: this_disc_info['gameid'] = hdl_dump_output[3][1:-1] this_disc_info['disc_type'] = hdl_dump_output[0] this_disc_info['filename'] = os.path.basename(disc_image_path) else: print('File %s is not a Playstation 2 disc image.' % os.path.basename(disc_image_path)) return this_disc_info def remove_dead_links(directory): for link_name in os.listdir(directory): link_path = os.path.abspath(os.path.join(directory, link_name)) if os.path.islink(link_path): link_target = os.path.join(directory, os.readlink(link_path)) if not os.path.exists(link_target): print('Removing dead link %s.' % link_path) os.remove(link_path) root_path = os.path.abspath(ROOT_PATH) source_path = os.path.join(root_path, 'iso') disc_repo = os.path.join(root_path, '.opl-srv') os.makedirs(os.path.join(disc_repo, 'DVD'), exist_ok=True) os.makedirs(os.path.join(disc_repo, 'CD'), exist_ok=True) remove_dead_links(os.path.join(disc_repo, 'DVD')) remove_dead_links(os.path.join(disc_repo, 'CD')) for filename in os.listdir(source_path): disc_path = os.path.join(source_path, filename) disc_info = get_disc_info(disc_path) if not disc_info['disc_type'] or not disc_info['gameid']: print("Disc type could not be determined for %s" % disc_info['filename']) else: disc_link_filename = '%s.%s' % (disc_info['gameid'], disc_info['filename']) disc_link_path = os.path.join(disc_repo, disc_info['disc_type'], disc_link_filename) disc_rel_path = os.path.relpath(disc_path, start=os.path.dirname(disc_link_path)) if not os.path.exists(disc_link_path): print('Adding disc %s.' % disc_info['filename']) print('Linking to %s.' % disc_rel_path) os.symlink(disc_rel_path, disc_link_path) else: print('Disc %s already linked.' % disc_info['filename'])