aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortassaron2017-06-25 10:36:32 -0400
committertassaron2017-06-25 10:36:32 -0400
commita2838a0c3898f999e71f76e6e8d5691155438aea (patch)
treec65d2d5c908f472389dee4d1e03f8fe88e88dacf /src
parent45b55d8e2fbffceefc9a1cd50b9bdb3e7ec9da78 (diff)
disable some hotkeys while encoding, more friendly error messages
Diffstat (limited to 'src')
-rw-r--r--src/components/video.py28
-rw-r--r--src/main.py9
-rw-r--r--src/mainwindow.py111
-rw-r--r--src/preview_thread.py9
-rw-r--r--src/video_thread.py9
5 files changed, 107 insertions, 59 deletions
diff --git a/src/components/video.py b/src/components/video.py
index 3e87d2e..44f88a5 100644
--- a/src/components/video.py
+++ b/src/components/video.py
@@ -86,12 +86,14 @@ class Video:
continue
except AttributeError as e:
self.parent.showMessage(
- msg='%s couldn\'t be loaded.' % os.path.basename(
+ msg='%s couldn\'t be loaded. '
+ 'This is a fatal error.' % os.path.basename(
self.videoPath
),
detail=str(e)
)
self.parent.stopVideo()
+ break
self.currentFrame = pipe.stdout.read(self.chunkSize)
if len(self.currentFrame) != 0:
@@ -258,20 +260,24 @@ def scale(scale, width, height, returntype=None):
def finalizeFrame(self, imageData, width, height):
- if self.distort:
- try:
+ try:
+ if self.distort:
image = Image.frombytes(
'RGBA',
(width, height),
imageData)
- except ValueError:
- print('#### ignored invalid data caused by distortion ####')
- image = self.blankFrame(width, height)
- else:
- image = Image.frombytes(
- 'RGBA',
- scale(self.scale, width, height, int),
- imageData)
+ else:
+ image = Image.frombytes(
+ 'RGBA',
+ scale(self.scale, width, height, int),
+ imageData)
+
+ except ValueError:
+ print(
+ '### BAD VIDEO SELECTED ###\n'
+ 'Video will not export with these settings'
+ )
+ return self.blankFrame(width, height)
if self.scale != 100 \
or self.xPosition != 0 or self.yPosition != 0:
diff --git a/src/main.py b/src/main.py
index a8dd562..5b54fc7 100644
--- a/src/main.py
+++ b/src/main.py
@@ -7,6 +7,15 @@ import preview_thread
import video_thread
+def disableWhenEncoding(func):
+ def decorator(*args):
+ if args[0].encoding:
+ return
+ else:
+ return func(*args)
+ return decorator
+
+
def LoadDefaultSettings(self):
self.resolutions = [
'1920x1080',
diff --git a/src/mainwindow.py b/src/mainwindow.py
index 7fae4ea..76c2b62 100644
--- a/src/mainwindow.py
+++ b/src/mainwindow.py
@@ -12,7 +12,7 @@ import core
import preview_thread
import video_thread
from presetmanager import PresetManager
-from main import LoadDefaultSettings
+from main import LoadDefaultSettings, disableWhenEncoding
class PreviewWindow(QtWidgets.QLabel):
@@ -54,6 +54,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.pages = [] # widgets of component settings
self.lastAutosave = time.time()
+ self.encoding = False
# Create data directory, load/create settings
self.dataDir = self.core.dataDir
@@ -149,16 +150,18 @@ class MainWindow(QtWidgets.QMainWindow):
for i, comp in enumerate(self.core.modules):
action = self.compMenu.addAction(comp.Component.__doc__)
action.triggered.connect(
- lambda _, item=i: self.core.insertComponent(0, item, self))
+ lambda _, item=i: self.core.insertComponent(0, item, self)
+ )
self.window.pushButton_addComponent.setMenu(self.compMenu)
componentList.dropEvent = self.dragComponent
componentList.itemSelectionChanged.connect(
- self.changeComponentWidget)
-
+ self.changeComponentWidget
+ )
self.window.pushButton_removeComponent.clicked.connect(
- lambda _: self.removeComponent())
+ lambda: self.removeComponent()
+ )
componentList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
componentList.customContextMenuRequested.connect(
@@ -173,7 +176,8 @@ class MainWindow(QtWidgets.QMainWindow):
currentRes = i
window.comboBox_resolution.setCurrentIndex(currentRes)
window.comboBox_resolution.currentIndexChanged.connect(
- self.updateResolution)
+ self.updateResolution
+ )
self.window.pushButton_listMoveUp.clicked.connect(
lambda: self.moveComponent(-1)
@@ -185,14 +189,17 @@ class MainWindow(QtWidgets.QMainWindow):
# Configure the Projects Menu
self.projectMenu = QMenu()
self.window.menuButton_newProject = self.projectMenu.addAction(
- "New Project")
+ "New Project"
+ )
self.window.menuButton_newProject.triggered.connect(
- self.createNewProject)
-
+ lambda: self.createNewProject()
+ )
self.window.menuButton_openProject = self.projectMenu.addAction(
- "Open Project")
+ "Open Project"
+ )
self.window.menuButton_openProject.triggered.connect(
- self.openOpenProjectDialog)
+ lambda: self.openOpenProjectDialog()
+ )
action = self.projectMenu.addAction("Save Project")
action.triggered.connect(self.saveCurrentProject)
@@ -207,6 +214,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.openPresetManager
)
+ self.updateWindowTitle()
window.show()
if project and project != self.autosavePath:
@@ -282,12 +290,15 @@ class MainWindow(QtWidgets.QMainWindow):
def updateWindowTitle(self):
appName = 'Audio Visualizer'
- if self.currentProject:
- appName += ' - %s' % \
- os.path.splitext(
- os.path.basename(self.currentProject))[0]
- if self.autosaveExists(identical=False):
- appName += '*'
+ try:
+ if self.currentProject:
+ appName += ' - %s' % \
+ os.path.splitext(
+ os.path.basename(self.currentProject))[0]
+ if self.autosaveExists(identical=False):
+ appName += '*'
+ except AttributeError:
+ pass
self.window.setWindowTitle(appName)
@QtCore.pyqtSlot(int, dict)
@@ -347,7 +358,7 @@ class MainWindow(QtWidgets.QMainWindow):
if not self.currentProject:
if os.path.exists(self.autosavePath):
os.remove(self.autosavePath)
- elif force or time.time() - self.lastAutosave >= 2.0:
+ elif force or time.time() - self.lastAutosave >= 0.1:
self.core.createProjectFile(self.autosavePath)
self.lastAutosave = time.time()
@@ -393,7 +404,7 @@ class MainWindow(QtWidgets.QMainWindow):
"Video Files (%s);; All Files (*)" % " ".join(
self.core.videoFormats))
- if not fileName == "":
+ if fileName:
self.settings.setValue("outputDir", os.path.dirname(fileName))
self.window.lineEdit_outputFile.setText(fileName)
@@ -404,33 +415,50 @@ class MainWindow(QtWidgets.QMainWindow):
def createAudioVisualisation(self):
# create output video if mandatory settings are filled in
- if self.window.lineEdit_audioFile.text() and \
- self.window.lineEdit_outputFile.text():
- self.canceled = False
- self.progressBarUpdated(-1)
- self.videoThread = QtCore.QThread(self)
- self.videoWorker = video_thread.Worker(self)
- self.videoWorker.moveToThread(self.videoThread)
- self.videoWorker.videoCreated.connect(self.videoCreated)
- self.videoWorker.progressBarUpdate.connect(self.progressBarUpdated)
- self.videoWorker.progressBarSetText.connect(
- self.progressBarSetText)
- self.videoWorker.imageCreated.connect(self.showPreviewImage)
- self.videoWorker.encoding.connect(self.changeEncodingStatus)
- self.videoThread.start()
- outputPath = self.window.lineEdit_outputFile.text()
+ audioFile = self.window.lineEdit_audioFile.text()
+ outputPath = self.window.lineEdit_outputFile.text()
+
+ if audioFile and outputPath and self.core.selectedComponents:
if not os.path.dirname(outputPath):
outputPath = os.path.join(
os.path.expanduser("~"), outputPath)
- self.videoTask.emit(
- self.window.lineEdit_audioFile.text(),
- outputPath,
- self.core.selectedComponents)
+ if outputPath and os.path.isdir(outputPath):
+ self.showMessage(
+ msg='Chosen filename matches a directory, which '
+ 'cannot be overwritten. Please choose a different '
+ 'filename or move the directory.'
+ )
+ return
else:
- self.showMessage(
- msg="You must select an audio file and output filename.")
+ if not audioFile or not outputPath:
+ self.showMessage(
+ msg="You must select an audio file and output filename."
+ )
+ elif not self.core.selectedComponents:
+ self.showMessage(
+ msg="Not enough components."
+ )
+ return
+
+ self.canceled = False
+ self.progressBarUpdated(-1)
+ self.videoThread = QtCore.QThread(self)
+ self.videoWorker = video_thread.Worker(self)
+ self.videoWorker.moveToThread(self.videoThread)
+ self.videoWorker.videoCreated.connect(self.videoCreated)
+ self.videoWorker.progressBarUpdate.connect(self.progressBarUpdated)
+ self.videoWorker.progressBarSetText.connect(
+ self.progressBarSetText)
+ self.videoWorker.imageCreated.connect(self.showPreviewImage)
+ self.videoWorker.encoding.connect(self.changeEncodingStatus)
+ self.videoThread.start()
+ self.videoTask.emit(
+ audioFile,
+ outputPath,
+ self.core.selectedComponents)
def changeEncodingStatus(self, status):
+ self.encoding = status
if status:
self.window.pushButton_createVideo.setEnabled(False)
self.window.pushButton_Cancel.setEnabled(True)
@@ -598,6 +626,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.window.stackedWidget.removeWidget(widget)
self.pages = []
+ @disableWhenEncoding
def createNewProject(self):
self.openSaveChangesDialog('starting a new project')
@@ -644,6 +673,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.core.createProjectFile(filename)
self.updateWindowTitle()
+ @disableWhenEncoding
def openOpenProjectDialog(self):
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self.window, "Open Project File",
@@ -669,6 +699,7 @@ class MainWindow(QtWidgets.QMainWindow):
if self.window.listWidget_componentList.count() == 0:
self.drawPreview()
self.autosave(True)
+ self.updateWindowTitle()
def showMessage(self, **kwargs):
parent = kwargs['parent'] if 'parent' in kwargs else self.window
diff --git a/src/preview_thread.py b/src/preview_thread.py
index ac5751d..769656b 100644
--- a/src/preview_thread.py
+++ b/src/preview_thread.py
@@ -50,16 +50,15 @@ class Worker(QtCore.QObject):
components = nextPreviewInformation["components"]
for component in reversed(components):
try:
- newFrame = component.previewRender(self)
frame = Image.alpha_composite(
- frame, newFrame)
- except ValueError:
+ frame, component.previewRender(self)
+ )
+ except ValueError as e:
self.parent.showMessage(
msg="Bad frame returned by %s's previewRender method. "
"This is a fatal error." %
str(component),
- detail="bad frame: w%s, h%s" % (
- newFrame.width, newFrame.height)
+ detail=str(e)
)
quit(1)
diff --git a/src/video_thread.py b/src/video_thread.py
index b45381c..9b0bf56 100644
--- a/src/video_thread.py
+++ b/src/video_thread.py
@@ -2,7 +2,6 @@ from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PIL import Image, ImageDraw, ImageFont
from PIL.ImageQt import ImageQt
-import core
import numpy
import subprocess as sp
import sys
@@ -13,6 +12,8 @@ import time
from copy import copy
import signal
+import core
+
class Worker(QtCore.QObject):
@@ -87,8 +88,10 @@ class Worker(QtCore.QObject):
self.encoding.emit(True)
self.components = components
self.outputFile = outputFile
- self.bgI = 0 # tracked video frame
+
self.reset()
+
+ self.bgI = 0 # tracked video frame
self.width = int(self.core.settings.value('outputWidth'))
self.height = int(self.core.settings.value('outputHeight'))
progressBarValue = 0
@@ -171,7 +174,7 @@ class Worker(QtCore.QObject):
self.staticComponents = {}
numComps = len(self.components)
for compNo, comp in enumerate(self.components):
- pStr = "Analyzing audio..."
+ pStr = "Starting components..."
self.progressBarSetText.emit(pStr)
properties = None
properties = comp.preFrameRender(