mirror of
https://github.com/mupen64plus/mupen64plus-ui-python.git
synced 2025-04-02 10:51:53 -04:00
support multiple files in archives
This commit is contained in:
parent
ade2ede291
commit
c901c27246
3 changed files with 110 additions and 92 deletions
|
@ -15,7 +15,6 @@
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
import bz2
|
import bz2
|
||||||
import gzip
|
import gzip
|
||||||
import zipfile
|
import zipfile
|
||||||
|
@ -23,12 +22,7 @@ import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
try:
|
from m64py.utils import which
|
||||||
from m64py.utils import which
|
|
||||||
except ImportError, err:
|
|
||||||
sys.stderr.write("Error: Can't import m64py modules%s%s%s" % (
|
|
||||||
os.linesep, str(err), os.linesep))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import UnRAR2
|
import UnRAR2
|
||||||
|
@ -64,12 +58,11 @@ class Archive():
|
||||||
def __init__(self, filename):
|
def __init__(self, filename):
|
||||||
"""Opens archive."""
|
"""Opens archive."""
|
||||||
self.file = os.path.realpath(filename)
|
self.file = os.path.realpath(filename)
|
||||||
if not os.path.isfile(self.file) \
|
if not os.path.isfile(self.file) or not os.access(self.file, os.R_OK):
|
||||||
or not os.access(self.file, os.R_OK):
|
raise IOError("Cannot open %s. No such file." % (self.file))
|
||||||
raise IOError("Cannot open %s. No such file." % (
|
|
||||||
self.file))
|
|
||||||
|
|
||||||
self.filetype = self.get_filetype()
|
self.filetype = self.get_filetype()
|
||||||
|
|
||||||
if self.filetype == ZIP:
|
if self.filetype == ZIP:
|
||||||
self.fd = zipfile.ZipFile(self.file, 'r')
|
self.fd = zipfile.ZipFile(self.file, 'r')
|
||||||
elif self.filetype == GZIP:
|
elif self.filetype == GZIP:
|
||||||
|
@ -84,41 +77,39 @@ class Archive():
|
||||||
elif RAR_CMD:
|
elif RAR_CMD:
|
||||||
self.fd = RarCmd(self.file)
|
self.fd = RarCmd(self.file)
|
||||||
else:
|
else:
|
||||||
raise IOError("UnRAR2 module or rar/unrar is needed for %s." % (
|
raise IOError("UnRAR2 module or rar/unrar is needed for %s." % (self.file))
|
||||||
self.file))
|
|
||||||
elif self.filetype == LZMA:
|
elif self.filetype == LZMA:
|
||||||
if HAS_7Z:
|
if HAS_7Z:
|
||||||
self.fd = Archive7z(open(self.file, 'rb'))
|
self.fd = Archive7z(open(self.file, 'rb'))
|
||||||
elif LZMA_CMD:
|
elif LZMA_CMD:
|
||||||
self.fd = LzmaCmd(self.file)
|
self.fd = LzmaCmd(self.file)
|
||||||
else:
|
else:
|
||||||
raise IOError("lzma module or 7z is needed for %s." % (
|
raise IOError("lzma module or 7z is needed for %s." % (self.file))
|
||||||
self.file))
|
|
||||||
else:
|
else:
|
||||||
raise IOError("File %s is not a N64 ROM file." % (
|
raise IOError("File %s is not a N64 ROM file." % (self.file))
|
||||||
self.file))
|
|
||||||
|
|
||||||
def read(self):
|
self.namelist = self.get_namelist()
|
||||||
"""Reads data. If archive has more then one
|
|
||||||
file the first one is used."""
|
def read(self, filename=None):
|
||||||
|
"""Reads data."""
|
||||||
data = None
|
data = None
|
||||||
|
fname = self.namelist[0] if not filename else filename
|
||||||
if self.filetype == ZIP:
|
if self.filetype == ZIP:
|
||||||
data = self.fd.read(self.fd.infolist()[0])
|
data = self.fd.read(fname)
|
||||||
elif self.filetype == GZIP:
|
elif self.filetype == GZIP:
|
||||||
data = self.fd.read()
|
data = self.fd.read()
|
||||||
elif self.filetype == BZIP:
|
elif self.filetype == BZIP:
|
||||||
data = self.fd.read()
|
data = self.fd.read()
|
||||||
elif self.filetype == RAR:
|
elif self.filetype == RAR:
|
||||||
if HAS_RAR:
|
if HAS_RAR:
|
||||||
data = self.fd.read_files()[0][1]
|
data = self.fd.read_files(fname)[0][1]
|
||||||
elif RAR_CMD:
|
elif RAR_CMD:
|
||||||
data = self.fd.read()
|
data = self.fd.read(fname)
|
||||||
elif self.filetype == LZMA:
|
elif self.filetype == LZMA:
|
||||||
if HAS_7Z:
|
if HAS_7Z:
|
||||||
data = self.fd.getmember(
|
data = self.fd.getmember(fname).read()
|
||||||
self.fd.getnames()[0]).read()
|
|
||||||
elif LZMA_CMD:
|
elif LZMA_CMD:
|
||||||
data = self.fd.read()
|
data = self.fd.read(fname)
|
||||||
elif self.filetype == ROM:
|
elif self.filetype == ROM:
|
||||||
data = self.fd.read()
|
data = self.fd.read()
|
||||||
return data
|
return data
|
||||||
|
@ -131,6 +122,29 @@ class Archive():
|
||||||
else:
|
else:
|
||||||
self.fd.close()
|
self.fd.close()
|
||||||
|
|
||||||
|
def get_namelist(self):
|
||||||
|
"""Gets list of files in archive."""
|
||||||
|
if self.filetype == ZIP:
|
||||||
|
namelist = [name.filename for name in self.fd.infolist()]
|
||||||
|
elif self.filetype == GZIP:
|
||||||
|
namelist = [os.path.basename(self.file)]
|
||||||
|
elif self.filetype == BZIP:
|
||||||
|
namelist = [os.path.basename(self.file)]
|
||||||
|
elif self.filetype == RAR:
|
||||||
|
if HAS_RAR:
|
||||||
|
for filename in self.fd.infoiter():
|
||||||
|
namelist.append(filename.filename)
|
||||||
|
elif RAR_CMD:
|
||||||
|
namelist = self.fd.namelist
|
||||||
|
elif self.filetype == LZMA:
|
||||||
|
if HAS_7Z:
|
||||||
|
namelist = self.fd.getnames()
|
||||||
|
elif LZMA_CMD:
|
||||||
|
namelist = self.fd.namelist
|
||||||
|
elif self.filetype == ROM:
|
||||||
|
namelist = [os.path.basename(self.file)]
|
||||||
|
return namelist
|
||||||
|
|
||||||
def get_filetype(self):
|
def get_filetype(self):
|
||||||
"""Gets archive type."""
|
"""Gets archive type."""
|
||||||
fd = open(self.file, 'rb')
|
fd = open(self.file, 'rb')
|
||||||
|
@ -155,13 +169,10 @@ class RarCmd:
|
||||||
|
|
||||||
def __init__(self, archive):
|
def __init__(self, archive):
|
||||||
"""Opens archive."""
|
"""Opens archive."""
|
||||||
|
self.fd = None
|
||||||
self.file = archive
|
self.file = archive
|
||||||
self.namelist = self.namelist()
|
self.namelist = self.namelist()
|
||||||
self.filename = self.namelist[0]
|
self.tempdir = tempfile.mkdtemp()
|
||||||
self.tempdir = tempfile.mkdtemp(self.file)
|
|
||||||
self.extract()
|
|
||||||
self.fd = open(os.path.join(
|
|
||||||
self.tempdir, self.filename), "rb")
|
|
||||||
|
|
||||||
def namelist(self):
|
def namelist(self):
|
||||||
"""Returns list of filenames in archive."""
|
"""Returns list of filenames in archive."""
|
||||||
|
@ -170,21 +181,24 @@ class RarCmd:
|
||||||
|
|
||||||
def extract(self):
|
def extract(self):
|
||||||
"""Extracts archive to temp dir."""
|
"""Extracts archive to temp dir."""
|
||||||
proc = Popen([RAR_CMD, 'x', '-kb', '-p-', '-o-', '-inul', '--',
|
cmd = [RAR_CMD, 'x', '-kb', '-p-', '-o-', '-inul', '--',
|
||||||
self.file, self.filename, self.tempdir],
|
self.file, self.filename, self.tempdir]
|
||||||
stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
|
||||||
out = proc.communicate()
|
out = proc.communicate()
|
||||||
if out[1] != '':
|
if out[1] != '':
|
||||||
raise IOError("Error extracting file %s: %s." % (
|
raise IOError("Error extracting file %s: %s." % (self.file, out[1]))
|
||||||
self.file, out[1]))
|
|
||||||
|
|
||||||
def read(self):
|
def read(self, filename=None):
|
||||||
"""Reads data."""
|
"""Reads data."""
|
||||||
|
self.filename = self.namelist[0] if not filename else filename
|
||||||
|
self.extract()
|
||||||
|
self.fd = open(os.path.join(self.tempdir, self.filename), "rb")
|
||||||
return self.fd.read()
|
return self.fd.read()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Closes file descriptor and clean resources."""
|
"""Closes file descriptor and clean resources."""
|
||||||
self.fd.close()
|
if self.fd:
|
||||||
|
self.fd.close()
|
||||||
shutil.rmtree(self.tempdir)
|
shutil.rmtree(self.tempdir)
|
||||||
|
|
||||||
class LzmaCmd:
|
class LzmaCmd:
|
||||||
|
@ -192,35 +206,35 @@ class LzmaCmd:
|
||||||
|
|
||||||
def __init__(self, archive):
|
def __init__(self, archive):
|
||||||
"""Opens archive."""
|
"""Opens archive."""
|
||||||
|
self.fd = None
|
||||||
self.file = archive
|
self.file = archive
|
||||||
self.namelist = self.namelist()
|
self.namelist = self.namelist()
|
||||||
self.filename = self.namelist[0]
|
self.tempdir = tempfile.mkdtemp()
|
||||||
self.tempdir = tempfile.mkdtemp(self.filename)
|
|
||||||
self.extract()
|
|
||||||
self.fd = open(os.path.join(
|
|
||||||
self.tempdir, self.filename), "rb")
|
|
||||||
|
|
||||||
def namelist(self):
|
def namelist(self):
|
||||||
"""Returns list of filenames in archive."""
|
"""Returns list of filenames in archive."""
|
||||||
proc1 = Popen([LZMA_CMD, 'l', self.file], stdout=PIPE)
|
proc = Popen([LZMA_CMD, 'l', self.file], stdout=PIPE)
|
||||||
proc2 = Popen(['grep', '-F', '...A'], stdin=proc1.stdout, stdout=PIPE)
|
lines = [name.rstrip(os.linesep) for name in proc.stdout.readlines() if '...A' in name]
|
||||||
lines = [name.rstrip(os.linesep) for name in proc2.stdout.readlines()]
|
|
||||||
return [name[53:] for name in lines]
|
return [name[53:] for name in lines]
|
||||||
|
|
||||||
def extract(self):
|
def extract(self):
|
||||||
"""Extracts archive to temp dir."""
|
"""Extracts archive to temp dir."""
|
||||||
proc = Popen([LZMA_CMD, 'x', '-o'+self.tempdir, self.file, self.filename],
|
cmd = [LZMA_CMD, 'x', '-o'+self.tempdir, self.file, self.filename]
|
||||||
stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
|
||||||
out = proc.communicate()
|
out = proc.communicate()
|
||||||
if "Error" in out[0]:
|
if "Error" in out[0]:
|
||||||
raise IOError("Error extracting file %s: %s." % (
|
raise IOError("Error extracting file %s: %s." % (
|
||||||
self.file, out[0]))
|
self.file, out[0]))
|
||||||
|
|
||||||
def read(self):
|
def read(self, filename=None):
|
||||||
"""Reads data."""
|
"""Reads data."""
|
||||||
|
self.filename = self.namelist[0] if not filename else filename
|
||||||
|
self.extract()
|
||||||
|
self.fd = open(os.path.join(self.tempdir, self.filename), "rb")
|
||||||
return self.fd.read()
|
return self.fd.read()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Closes file descriptor and clean resources."""
|
"""Closes file descriptor and clean resources."""
|
||||||
self.fd.close()
|
if self.fd:
|
||||||
|
self.fd.close()
|
||||||
shutil.rmtree(self.tempdir)
|
shutil.rmtree(self.tempdir)
|
||||||
|
|
|
@ -14,28 +14,23 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
from PyQt4.QtCore import *
|
||||||
import sys
|
from PyQt4.QtGui import QDialog, QMessageBox, QListWidgetItem
|
||||||
|
|
||||||
from PyQt4.QtGui import QDialog, QMessageBox
|
from m64py.utils import version_split
|
||||||
|
from m64py.core.defs import FRONTEND_VERSION
|
||||||
try:
|
from m64py.ui.about_ui import Ui_AboutDialog
|
||||||
from m64py.core.defs import FRONTEND_VERSION
|
from m64py.ui.license_ui import Ui_LicenseDialog
|
||||||
from m64py.ui.about_ui import Ui_AboutDialog
|
from m64py.ui.archive_ui import Ui_ArchiveDialog
|
||||||
from m64py.ui.license_ui import Ui_LicenseDialog
|
|
||||||
except ImportError, err:
|
|
||||||
sys.stderr.write("Error: Can't import m64py modules%s%s%s" % (
|
|
||||||
os.linesep, str(err), os.linesep))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
class AboutDialog(QDialog, Ui_AboutDialog):
|
class AboutDialog(QDialog, Ui_AboutDialog):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
QDialog.__init__(self, parent)
|
QDialog.__init__(self, parent)
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
text = self.labelAbout.text()
|
text = self.labelAbout.text()
|
||||||
text.replace("FRONTEND_VERSION", FRONTEND_VERSION)
|
text = text.replace("FRONTEND_VERSION", FRONTEND_VERSION)
|
||||||
text.replace("CORE_VERSION",
|
text = text.replace("CORE_VERSION",
|
||||||
str(parent.worker.m64p.core_version))
|
version_split(parent.worker.m64p.core_version))
|
||||||
self.labelAbout.setText(text)
|
self.labelAbout.setText(text)
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
|
@ -51,3 +46,17 @@ class InfoDialog(QMessageBox):
|
||||||
self.setText(text)
|
self.setText(text)
|
||||||
self.setWindowTitle("Info")
|
self.setWindowTitle("Info")
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
|
class ArchiveDialog(QDialog, Ui_ArchiveDialog):
|
||||||
|
def __init__(self, parent, files):
|
||||||
|
QDialog.__init__(self, parent)
|
||||||
|
self.setupUi(self)
|
||||||
|
self.build_list(files)
|
||||||
|
|
||||||
|
def build_list(self, files):
|
||||||
|
self.listWidget.clear()
|
||||||
|
for fname in files:
|
||||||
|
item = QListWidgetItem(fname)
|
||||||
|
item.setData(Qt.UserRole, fname)
|
||||||
|
self.listWidget.addItem(item)
|
||||||
|
self.listWidget.setCurrentRow(0)
|
||||||
|
|
|
@ -15,21 +15,15 @@
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
|
|
||||||
from PyQt4.QtGui import *
|
from PyQt4.QtGui import *
|
||||||
from PyQt4.QtCore import *
|
from PyQt4.QtCore import *
|
||||||
|
|
||||||
try:
|
from m64py.utils import log, md5sum
|
||||||
from m64py.utils import log, md5sum
|
from m64py.archive import Archive, EXT_FILTER
|
||||||
from m64py.archive import Archive, EXT_FILTER
|
from m64py.ui.romlist_ui import Ui_ROMList
|
||||||
from m64py.ui.romlist_ui import Ui_ROMList
|
|
||||||
except ImportError, err:
|
|
||||||
sys.stderr.write("Error: Can't import m64py modules%s%s%s" % (
|
|
||||||
os.linesep, str(err), os.linesep))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from m64py.ui import title_rc
|
from m64py.ui import title_rc
|
||||||
|
@ -75,8 +69,8 @@ class ROMList(QMainWindow, Ui_ROMList):
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
self.read_rom_list()
|
self.read_rom_list()
|
||||||
self.roms = self.qset.value("rom_list", []).toPyObject()
|
self.roms = self.qset.value("rom_list", [])
|
||||||
if self.qset.value("show_available", 0).toInt()[0]:
|
if bool(self.qset.value("show_available", 0)):
|
||||||
self.add_available_items(self.roms)
|
self.add_available_items(self.roms)
|
||||||
else:
|
else:
|
||||||
self.add_items()
|
self.add_items()
|
||||||
|
@ -119,7 +113,7 @@ class ROMList(QMainWindow, Ui_ROMList):
|
||||||
except KeyError:
|
except KeyError:
|
||||||
md5 = key
|
md5 = key
|
||||||
list_item = QListWidgetItem(rom['goodname'])
|
list_item = QListWidgetItem(rom['goodname'])
|
||||||
list_item.setData(Qt.UserRole, (md5, None))
|
list_item.setData(Qt.UserRole, (md5, None, None))
|
||||||
list_item.setFlags(Qt.ItemIsEnabled)
|
list_item.setFlags(Qt.ItemIsEnabled)
|
||||||
self.listWidget.addItem(list_item)
|
self.listWidget.addItem(list_item)
|
||||||
self.pushOpen.setEnabled(False)
|
self.pushOpen.setEnabled(False)
|
||||||
|
@ -135,11 +129,11 @@ class ROMList(QMainWindow, Ui_ROMList):
|
||||||
self.qset.setValue("rom_list", self.roms)
|
self.qset.setValue("rom_list", self.roms)
|
||||||
self.qset.sync()
|
self.qset.sync()
|
||||||
self.listWidget.clear()
|
self.listWidget.clear()
|
||||||
for md5, path in self.roms:
|
for md5, path, fname in self.roms:
|
||||||
if md5 in self.romlist:
|
if md5 in self.romlist:
|
||||||
goodname = self.romlist[md5]['goodname']
|
goodname = self.romlist[md5]['goodname']
|
||||||
list_item = QListWidgetItem(goodname)
|
list_item = QListWidgetItem(goodname)
|
||||||
list_item.setData(Qt.UserRole, (md5, path))
|
list_item.setData(Qt.UserRole, (md5, path, fname))
|
||||||
self.listWidget.addItem(list_item)
|
self.listWidget.addItem(list_item)
|
||||||
self.progressBar.setValue(0)
|
self.progressBar.setValue(0)
|
||||||
self.progressBar.hide()
|
self.progressBar.hide()
|
||||||
|
@ -150,7 +144,7 @@ class ROMList(QMainWindow, Ui_ROMList):
|
||||||
|
|
||||||
def refresh_items(self):
|
def refresh_items(self):
|
||||||
"""Refreshes available ROMs list"""
|
"""Refreshes available ROMs list"""
|
||||||
path_roms = self.qset.value("Paths/ROM").toString()
|
path_roms = self.qset.value("Paths/ROM")
|
||||||
if not path_roms:
|
if not path_roms:
|
||||||
self.parent.emit(SIGNAL(
|
self.parent.emit(SIGNAL(
|
||||||
"info_dialog(PyQt_PyObject)"),
|
"info_dialog(PyQt_PyObject)"),
|
||||||
|
@ -162,31 +156,31 @@ class ROMList(QMainWindow, Ui_ROMList):
|
||||||
self.reader.set_path(path_roms)
|
self.reader.set_path(path_roms)
|
||||||
self.reader.start()
|
self.reader.start()
|
||||||
|
|
||||||
def file_open(self, path):
|
def file_open(self, path, fname):
|
||||||
"""Opens ROM file."""
|
"""Opens ROM file."""
|
||||||
self.close()
|
self.close()
|
||||||
if self.parent.isMinimized():
|
if self.parent.isMinimized():
|
||||||
self.parent.activateWindow()
|
self.parent.activateWindow()
|
||||||
self.parent.emit(SIGNAL(
|
self.parent.emit(SIGNAL(
|
||||||
"file_open(PyQt_PyObject)"), str(path))
|
"file_open(PyQt_PyObject, PyQt_PyObject)"), path, fname)
|
||||||
|
|
||||||
def on_progress_bar_changed(self, value):
|
def on_progress_bar_changed(self, value):
|
||||||
self.progressBar.setValue(value)
|
self.progressBar.setValue(value)
|
||||||
|
|
||||||
def on_item_open(self):
|
def on_item_open(self):
|
||||||
item = self.listWidget.currentItem()
|
item = self.listWidget.currentItem()
|
||||||
md5, path = item.data(Qt.UserRole).toPyObject()
|
md5, path, fname = item.data(Qt.UserRole)
|
||||||
if path:
|
if path:
|
||||||
self.file_open(path)
|
self.file_open(path, fname)
|
||||||
|
|
||||||
def on_item_activated(self, item):
|
def on_item_activated(self, item):
|
||||||
md5, path = item.data(Qt.UserRole).toPyObject()
|
md5, path, fname = item.data(Qt.UserRole)
|
||||||
if path:
|
if path:
|
||||||
self.file_open(path)
|
self.file_open(path, fname)
|
||||||
|
|
||||||
def on_item_changed(self, current, previous):
|
def on_item_changed(self, current, previous):
|
||||||
if not current: return
|
if not current: return
|
||||||
md5, path = current.data(Qt.UserRole).toPyObject()
|
md5, path, fname = current.data(Qt.UserRole)
|
||||||
|
|
||||||
title = QPixmap(os.path.join(
|
title = QPixmap(os.path.join(
|
||||||
self.user_data_path, "title", "%s.png") % md5)
|
self.user_data_path, "title", "%s.png") % md5)
|
||||||
|
@ -241,7 +235,7 @@ class ROMReader(QThread):
|
||||||
|
|
||||||
def set_path(self, path):
|
def set_path(self, path):
|
||||||
"""Sets ROM directory path."""
|
"""Sets ROM directory path."""
|
||||||
self.rom_path = str(path)
|
self.rom_path = path
|
||||||
|
|
||||||
def get_roms(self):
|
def get_roms(self):
|
||||||
"""Returns ROM list."""
|
"""Returns ROM list."""
|
||||||
|
@ -265,13 +259,14 @@ class ROMReader(QThread):
|
||||||
fullpath = os.path.join(self.rom_path, filename)
|
fullpath = os.path.join(self.rom_path, filename)
|
||||||
try:
|
try:
|
||||||
archive = Archive(fullpath)
|
archive = Archive(fullpath)
|
||||||
romfile = archive.read()
|
for fname in archive.namelist:
|
||||||
archive.close()
|
romfile = archive.read(fname)
|
||||||
|
archive.close()
|
||||||
|
rom_md5 = md5sum(filedata=romfile)
|
||||||
|
self.roms.append((rom_md5.upper(), fullpath, fname))
|
||||||
except Exception, err:
|
except Exception, err:
|
||||||
log.warn(str(err))
|
log.warn(str(err))
|
||||||
continue
|
continue
|
||||||
rom_md5 = md5sum(filedata=romfile)
|
|
||||||
self.roms.append((rom_md5.upper(), fullpath))
|
|
||||||
percent = float(filenum) / float(num_files) * 100
|
percent = float(filenum) / float(num_files) * 100
|
||||||
self.parent.progressBar.emit(
|
self.parent.progressBar.emit(
|
||||||
SIGNAL("valueChanged(int)"), percent)
|
SIGNAL("valueChanged(int)"), percent)
|
||||||
|
|
Loading…
Add table
Reference in a new issue