Mercurial > hg > tilerswift
changeset 109:e3ffae4d7528
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!
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Thu, 19 Sep 2019 17:05:15 -0400 |
parents | 0c338cd2cc8e |
children | 5858225c600e |
files | nes.py tilerswift |
diffstat | 2 files changed, 30 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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:]
--- 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]