# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1568927115 14400 # Node ID e3ffae4d75282becf45a571b6beb78209274cd07 # Parent 0c338cd2cc8e4af03295d4c9db744c0c2e5b8981 NES_ROM: allow ROMs to be provided as zip files Bit barebones, but it works well enough for my collection. Some error handling is now enabled. Starting to look like a real program! diff --git a/nes.py b/nes.py --- a/nes.py +++ b/nes.py @@ -1,6 +1,9 @@ +from zipfile import ZipFile, BadZipFile + from PyQt5 import QtGui as QG from colours import TILE_PALETTES, palette_to_qt +from exceptions import ROMOpeningError class NES_ROM(object): @@ -13,8 +16,26 @@ self.read_rom() def read_rom(self): - with open(self.filename, 'rb') as f: - self.ines = f.read() + if self.filename.lower().endswith('.nes'): + with open(self.filename, 'rb') as rom: + self.ines = rom.read() + elif self.filename.lower().endswith('.zip'): + try: + with ZipFile(self.filename, 'r') as rom: + nesfiles = [f for f in rom.filelist if not f.is_dir() + and f.filename.lower().endswith(".nes")] + if len(nesfiles) != 1: + raise ROMOpeningError( + "Zipfile does not contain exactly one NES file" + ) + self.ines = rom.open(nesfiles[0]).read() + except BadZipFile as exc: + raise ROMOpeningError(f"Problem opening zip file:\n{exc}") + else: + raise ROMOpeningError( + f"Cannot deduce file type from file name:\n\n" + f"{self.filename.split('/')[-1]}" + ) self.header = self.ines[0:16] body = self.ines[16:] diff --git a/tilerswift b/tilerswift --- a/tilerswift +++ b/tilerswift @@ -31,12 +31,16 @@ def open_rom(self): filename, filetype = QW.QFileDialog.getOpenFileName( self, - "Open ROM", "", "NES Files (*.nes)" + "Open ROM", "", "NES Files (*.nes *.NES *.zip *.ZIP)" ) + if not filename: + return + try: new_rom_dockable = ROMDockable(filename, filetype, self.tile_picker) - except ROMOpeningError: - pass + except ROMOpeningError as exc: + QW.QMessageBox.critical(self, "Tilerswift message", str(exc)) + return try: last_docked = self.rom_dockables[-1]