diff --git a/src/component.py b/src/component.py index 48e9c1a..7a768ed 100644 --- a/src/component.py +++ b/src/component.py @@ -17,7 +17,7 @@ class ComponentMetaclass(type(QtCore.QObject)): def initializationWrapper(self, *args, **kwargs): try: return func(self, *args, **kwargs) - except: + except Exception: try: raise ComponentInitError(self, 'initialization process') except ComponentError: @@ -28,7 +28,7 @@ class ComponentMetaclass(type(QtCore.QObject)): def renderWrapper(self, *args, **kwargs): try: return func(self, *args, **kwargs) - except: + except Exception: from toolkit.frame import BlankFrame try: raise ComponentError(self, 'renderer') @@ -398,8 +398,19 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass): class ComponentException(RuntimeError): '''A base class for component errors''' + + _prevErrors = [] + def __init__(self, caller, name, immediate): + print('ComponentError by %s: %s' % (caller.name, name)) super().__init__() + if len(ComponentException._prevErrors) > 1: + ComponentException._prevErrors.pop() + ComponentException._prevErrors.insert(0, name) + if name in ComponentException._prevErrors[1:]: + # Don't create multiple windows for repeated messages + return + from toolkit import formatTraceback import sys if sys.exc_info()[0] is not None: diff --git a/src/components/sound.py b/src/components/sound.py index b3a627a..fcd9e4e 100644 --- a/src/components/sound.py +++ b/src/components/sound.py @@ -1,7 +1,6 @@ from PyQt5 import QtGui, QtCore, QtWidgets import os -from core import Core from component import Component from toolkit.frame import BlankFrame diff --git a/src/components/video.py b/src/components/video.py index 153fc4d..6b0a04a 100644 --- a/src/components/video.py +++ b/src/components/video.py @@ -6,8 +6,7 @@ import subprocess import threading from queue import PriorityQueue -from core import Core -from component import Component, ComponentError +from component import Component from toolkit.frame import BlankFrame from toolkit.ffmpeg import testAudioStream from toolkit import openPipe, checkOutput @@ -155,6 +154,7 @@ class Component(Component): return frame def properties(self): + # TODO: Disallow selecting the same video you're exporting to props = [] if not self.videoPath or self.badVideo \ or not os.path.exists(self.videoPath): diff --git a/src/core.py b/src/core.py index 4c08c04..b371d64 100644 --- a/src/core.py +++ b/src/core.py @@ -215,7 +215,7 @@ class Core: if hasattr(loader, 'updateComponentTitle'): loader.updateComponentTitle(i, modified) - except: + except Exception: errcode = 1 data = sys.exc_info() @@ -237,9 +237,10 @@ class Core: self.openingProject = False def parseAvFile(self, filepath): - '''Parses an avp (project) or avl (preset package) file. - Returns dictionary with section names as the keys, each one - contains a list of tuples: (compName, version, compPresetDict) + ''' + Parses an avp (project) or avl (preset package) file. + Returns dictionary with section names as the keys, each one + contains a list of tuples: (compName, version, compPresetDict) ''' validSections = ( 'Components', @@ -287,7 +288,7 @@ class Core: data[section].append((key, value.strip())) return 0, data - except: + except Exception: return 1, sys.exc_info() def importPreset(self, filepath): @@ -332,7 +333,7 @@ class Core: exportPath ) return True - except: + except Exception: return False def createPresetFile( @@ -397,7 +398,7 @@ class Core: ) ) return True - except: + except Exception: return False def newVideoWorker(self, loader, audioFile, outputPath): diff --git a/src/mainwindow.py b/src/mainwindow.py index 03b8dde..3cc5d26 100644 --- a/src/mainwindow.py +++ b/src/mainwindow.py @@ -314,7 +314,7 @@ class MainWindow(QtWidgets.QMainWindow): ['ffmpeg', '-version'], stderr=f ) goodVersion = str(ffmpegVers).split()[2].startswith('3') - except: + except Exception: goodVersion = False else: goodVersion = True @@ -381,7 +381,7 @@ class MainWindow(QtWidgets.QMainWindow): ) @QtCore.pyqtSlot() - def cleanUp(self): + def cleanUp(self, *args): self.timer.stop() self.previewThread.quit() self.previewThread.wait() diff --git a/src/presetmanager.py b/src/presetmanager.py index e602c16..b1eeb34 100644 --- a/src/presetmanager.py +++ b/src/presetmanager.py @@ -211,10 +211,9 @@ class PresetManager(QtWidgets.QDialog): self.parent.drawPreview() def openDeletePresetDialog(self): - selected = self.window.listWidget_presets.selectedItems() - if not selected: + row = self.getPresetRow() + if row == -1: return - row = self.window.listWidget_presets.row(selected[0]) comp, vers, name = self.presetRows[row] ch = self.parent.showMessage( msg='Really delete %s?' % name, @@ -242,32 +241,40 @@ class PresetManager(QtWidgets.QDialog): 'numbers, and spaces.', parent=window if window else self.window) + def getPresetRow(self): + row = self.window.listWidget_presets.currentRow() + if row > -1: + return row + + # check if component selected in MainWindow has preset loaded + componentList = self.parent.window.listWidget_componentList + compIndex = componentList.currentRow() + if compIndex == -1: + return compIndex + + preset = self.core.selectedComponents[compIndex].currentPreset + if preset is None: + return -1 + else: + rowTuple = ( + self.core.selectedComponents[compIndex].name, + self.core.selectedComponents[compIndex].version, + preset + ) + for i, tup in enumerate(self.presetRows): + if rowTuple == tup: + index = i + break + else: + return -1 + return index + def openRenamePresetDialog(self): # TODO: maintain consistency by changing this to call createNewPreset() presetList = self.window.listWidget_presets - index = presetList.currentRow() + index = self.getPresetRow() if index == -1: - # check if component selected in MainWindow has preset loaded - componentList = self.parent.window.listWidget_componentList - compIndex = componentList.currentRow() - if compIndex == -1: - return - - preset = self.core.selectedComponents[compIndex].currentPreset - if preset is None: - return - else: - rowTuple = ( - self.core.selectedComponents[compIndex].name, - self.core.selectedComponents[compIndex].version, - preset - ) - for i, tup in enumerate(self.presetRows): - if rowTuple == tup: - index = i - break - else: - return + return while True: newName, OK = QtWidgets.QInputDialog.getText( @@ -326,14 +333,14 @@ class PresetManager(QtWidgets.QDialog): self.settings.setValue("presetDir", os.path.dirname(filename)) def openExportDialog(self): - if not self.window.listWidget_presets.selectedItems(): + index = self.getPresetRow() + if index == -1: return filename, _ = QtWidgets.QFileDialog.getSaveFileName( self.window, "Export Preset", self.settings.value("presetDir"), "Preset Files (*.avl)") if filename: - index = self.window.listWidget_presets.currentRow() comp, vers, name = self.presetRows[index] if not self.core.exportPreset(filename, comp, vers, name): self.parent.showMessage( diff --git a/src/video_thread.py b/src/video_thread.py index dd957e5..8cbe8a8 100644 --- a/src/video_thread.py +++ b/src/video_thread.py @@ -225,7 +225,7 @@ class Worker(QtCore.QObject): self.renderThreads = [] try: numCpus = len(os.sched_getaffinity(0)) - except: + except Exception: numCpus = os.cpu_count() for i in range(2 if numCpus <= 2 else 3): @@ -268,7 +268,7 @@ class Worker(QtCore.QObject): try: self.out_pipe.stdin.write(frameBuffer[audioI].tobytes()) self.previewQueue.put([audioI, frameBuffer.pop(audioI)]) - except: + except Exception: break # increase progress bar value @@ -293,7 +293,7 @@ class Worker(QtCore.QObject): print("Export Canceled") try: os.remove(self.outputFile) - except: + except Exception: pass self.progressBarUpdate.emit(0) self.progressBarSetText.emit('Export Canceled') @@ -333,7 +333,7 @@ class Worker(QtCore.QObject): try: self.out_pipe.send_signal(signal.SIGINT) - except: + except Exception: pass def reset(self):