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]