Romlister -
def clean_name(self, name): """Remove common tags like (USA), [Rev A], etc.""" # Remove parentheses content name = re.sub(r'\([^)]*\)', '', name) # Remove brackets content name = re.sub(r'\[[^]]*\]', '', name) # Remove extra spaces and underscores name = re.sub(r'[_]+', ' ', name) name = re.sub(r'\s+', ' ', name).strip() return name
class RomLister: def (self, root_path, recursive=True): self.root_path = Path(root_path) self.recursive = recursive self.roms = []
def get_list(self, clean_names=False): """Return list of ROM file paths or cleaned names.""" if clean_names: return [self.clean_name(r.stem) for r in self.roms] return [str(r) for r in self.roms] romlister
lister = RomLister(args.directory, recursive=args.recursive) lister.scan()
self.roms = [p for p in iterator if p.is_file()] return self name): """Remove common tags like (USA)
def filter_by_size(self, min_bytes=None, max_bytes=None): """Filter by file size in bytes.""" if min_bytes is not None: self.roms = [r for r in self.roms if r.stat().st_size >= min_bytes] if max_bytes is not None: self.roms = [r for r in self.roms if r.stat().st_size <= max_bytes] return self
def export_json(self, filepath, clean_names=False): with open(filepath, 'w', encoding='utf-8') as f: json.dump(self.get_list(clean_names), f, indent=2) CLI Interface ------------------------------ def main(): parser = argparse.ArgumentParser(description="RomLister - Scan and filter ROM collections") parser.add_argument("directory", help="Root directory to scan for ROMs") parser.add_argument("-r", "--recursive", action="store_true", help="Scan subfolders recursively") parser.add_argument("-e", "--extensions", nargs="+", help="File extensions to include (e.g., nes sfc iso)") parser.add_argument("--min-size", type=int, help="Minimum file size in bytes") parser.add_argument("--max-size", type=int, help="Maximum file size in bytes") parser.add_argument("-p", "--pattern", help="Regex pattern to filter by filename") parser.add_argument("-c", "--clean-names", action="store_true", help="Remove region/version tags") parser.add_argument("-o", "--output", help="Output file path") parser.add_argument("-f", "--format", choices=["txt", "csv", "json"], default="txt", help="Output format") parser.add_argument("--list-only", action="store_true", help="Print list to console") name) name = re.sub(r'\s+'
args = parser.parse_args()