2017-06-18 14:46:08 -04:00
|
|
|
from PyQt4 import QtCore
|
|
|
|
from PyQt4.QtCore import QSettings
|
|
|
|
import argparse
|
|
|
|
import os
|
2017-06-22 22:23:04 -04:00
|
|
|
import sys
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
import core
|
|
|
|
import video_thread
|
|
|
|
from main import LoadDefaultSettings
|
|
|
|
|
|
|
|
|
2017-06-06 11:14:39 -04:00
|
|
|
class Command(QtCore.QObject):
|
|
|
|
|
2017-06-18 14:46:08 -04:00
|
|
|
videoTask = QtCore.pyqtSignal(str, str, list)
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
QtCore.QObject.__init__(self)
|
|
|
|
self.core = core.Core()
|
|
|
|
self.dataDir = self.core.dataDir
|
2017-06-22 19:59:31 -04:00
|
|
|
self.canceled = False
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
self.parser = argparse.ArgumentParser(
|
2017-06-18 21:49:00 -04:00
|
|
|
description='Create a visualization for an audio file',
|
|
|
|
epilog='EXAMPLE COMMAND: main.py myvideotemplate.avp '
|
|
|
|
'-i ~/Music/song.mp3 -o ~/video.mp4 '
|
2017-06-22 22:23:04 -04:00
|
|
|
'-c 0 image path=~/Pictures/thisWeeksPicture.jpg '
|
|
|
|
'-c 1 video "preset=My Logo" -c 2 vis layout=classic')
|
2017-06-18 14:46:08 -04:00
|
|
|
self.parser.add_argument(
|
2017-06-18 21:49:00 -04:00
|
|
|
'-i', '--input', metavar='SOUND',
|
2017-06-22 22:23:04 -04:00
|
|
|
help='input audio file')
|
2017-06-18 14:46:08 -04:00
|
|
|
self.parser.add_argument(
|
2017-06-18 21:49:00 -04:00
|
|
|
'-o', '--output', metavar='OUTPUT',
|
2017-06-22 22:23:04 -04:00
|
|
|
help='output video file')
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
# optional arguments
|
|
|
|
self.parser.add_argument(
|
|
|
|
'projpath', metavar='path-to-project',
|
|
|
|
help='open a project file (.avp)', nargs='?')
|
2017-06-18 21:49:00 -04:00
|
|
|
self.parser.add_argument(
|
2017-06-22 20:31:04 -04:00
|
|
|
'-c', '--comp', metavar=('LAYER', 'ARG'),
|
|
|
|
help='first arg must be component NAME to insert at LAYER.'
|
|
|
|
'"help" for information about possible args for a component.',
|
|
|
|
nargs='*', action='append')
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
self.args = self.parser.parse_args()
|
|
|
|
self.settings = QSettings(
|
|
|
|
os.path.join(self.dataDir, 'settings.ini'), QSettings.IniFormat)
|
|
|
|
LoadDefaultSettings(self)
|
|
|
|
|
|
|
|
if self.args.projpath:
|
|
|
|
self.core.openProject(self, self.args.projpath)
|
2017-06-22 19:59:31 -04:00
|
|
|
self.core.selectedComponents = list(
|
|
|
|
reversed(self.core.selectedComponents))
|
|
|
|
self.core.componentListChanged()
|
2017-06-18 14:46:08 -04:00
|
|
|
|
2017-06-18 21:49:00 -04:00
|
|
|
if self.args.comp:
|
|
|
|
for comp in self.args.comp:
|
2017-06-22 20:31:04 -04:00
|
|
|
pos = comp[0]
|
|
|
|
name = comp[1]
|
|
|
|
args = comp[2:]
|
2017-06-22 18:40:34 -04:00
|
|
|
try:
|
|
|
|
pos = int(pos)
|
|
|
|
except ValueError:
|
|
|
|
print(pos, 'is not a layer number.')
|
|
|
|
quit(1)
|
2017-06-18 21:49:00 -04:00
|
|
|
realName = self.parseCompName(name)
|
|
|
|
if not realName:
|
|
|
|
print(name, 'is not a valid component name.')
|
2017-06-22 18:40:34 -04:00
|
|
|
quit(1)
|
2017-06-18 21:49:00 -04:00
|
|
|
modI = self.core.moduleIndexFor(realName)
|
2017-06-22 18:40:34 -04:00
|
|
|
i = self.core.insertComponent(pos, modI, self)
|
2017-06-22 20:31:04 -04:00
|
|
|
for arg in args:
|
|
|
|
self.core.selectedComponents[i].command(arg)
|
2017-06-18 21:49:00 -04:00
|
|
|
|
2017-06-22 22:23:04 -04:00
|
|
|
if self.args.input and self.args.output:
|
|
|
|
self.createAudioVisualisation()
|
|
|
|
elif 'help' not in sys.argv:
|
|
|
|
self.parser.print_help()
|
|
|
|
quit(1)
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
def createAudioVisualisation(self):
|
|
|
|
self.videoThread = QtCore.QThread(self)
|
|
|
|
self.videoWorker = video_thread.Worker(self)
|
|
|
|
self.videoWorker.moveToThread(self.videoThread)
|
|
|
|
self.videoWorker.videoCreated.connect(self.videoCreated)
|
|
|
|
|
|
|
|
self.videoThread.start()
|
|
|
|
self.videoTask.emit(
|
|
|
|
self.args.input,
|
|
|
|
self.args.output,
|
2017-06-22 18:40:34 -04:00
|
|
|
list(reversed(self.core.selectedComponents))
|
|
|
|
)
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
def videoCreated(self):
|
|
|
|
self.videoThread.quit()
|
|
|
|
self.videoThread.wait()
|
2017-06-22 19:59:31 -04:00
|
|
|
quit(0)
|
2017-06-18 14:46:08 -04:00
|
|
|
|
|
|
|
def showMessage(self, **kwargs):
|
|
|
|
print(kwargs['msg'])
|
|
|
|
if 'detail' in kwargs:
|
|
|
|
print(kwargs['detail'])
|
|
|
|
|
|
|
|
def drawPreview(self, *args):
|
|
|
|
pass
|
|
|
|
|
2017-06-18 21:49:00 -04:00
|
|
|
def parseCompName(self, name):
|
|
|
|
'''Deduces a proper component name out of a commandline arg'''
|
|
|
|
|
|
|
|
if name.title() in self.core.compNames:
|
|
|
|
return name.title()
|
|
|
|
for compName in self.core.compNames:
|
|
|
|
if name.capitalize() in compName:
|
|
|
|
return compName
|
2017-06-22 18:40:34 -04:00
|
|
|
|
|
|
|
compFileNames = [ \
|
|
|
|
os.path.splitext(os.path.basename(
|
|
|
|
mod.__file__))[0] \
|
|
|
|
for mod in self.core.modules \
|
|
|
|
]
|
2017-06-18 21:49:00 -04:00
|
|
|
for i, compFileName in enumerate(compFileNames):
|
|
|
|
if name.lower() in compFileName:
|
|
|
|
return self.core.compNames[i]
|
|
|
|
return
|
|
|
|
|
|
|
|
return None
|