This repository has been archived on 2020-08-22. You can view files and clone it, but cannot push or open issues or pull requests.
pyaudviz/src/command.py

156 lines
5.1 KiB
Python
Raw Normal View History

from PyQt5 import QtCore
import argparse
import os
import sys
import core
import video_thread
from toolkit import LoadDefaultSettings
2017-06-06 11:14:39 -04:00
class Command(QtCore.QObject):
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
self.parser = argparse.ArgumentParser(
description='Create a visualization for an audio file',
epilog='EXAMPLE COMMAND: main.py myvideotemplate.avp '
2017-06-23 23:00:24 -04:00
'-i ~/Music/song.mp3 -o ~/video.mp4 '
'-c 0 image path=~/Pictures/thisWeeksPicture.jpg '
'-c 1 video "preset=My Logo" -c 2 vis layout=classic'
)
self.parser.add_argument(
'-i', '--input', metavar='SOUND',
help='input audio file'
)
self.parser.add_argument(
'-o', '--output', metavar='OUTPUT',
help='output video file'
)
self.parser.add_argument(
'-e', '--export', action='store_true',
help='use input and output files from project file'
)
# optional arguments
self.parser.add_argument(
'projpath', metavar='path-to-project',
help='open a project file (.avp)', nargs='?')
self.parser.add_argument(
'-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')
self.args = self.parser.parse_args()
self.settings = self.core.settings
LoadDefaultSettings(self)
if self.args.projpath:
projPath = self.args.projpath
if not os.path.dirname(projPath):
projPath = os.path.join(
self.settings.value("projectDir"),
projPath
)
if not projPath.endswith('.avp'):
projPath += '.avp'
self.core.openProject(self, projPath)
2017-06-22 19:59:31 -04:00
self.core.selectedComponents = list(
reversed(self.core.selectedComponents))
self.core.componentListChanged()
if self.args.comp:
for comp in self.args.comp:
pos = comp[0]
name = comp[1]
args = comp[2:]
try:
pos = int(pos)
except ValueError:
print(pos, 'is not a layer number.')
quit(1)
realName = self.parseCompName(name)
if not realName:
print(name, 'is not a valid component name.')
quit(1)
modI = self.core.moduleIndexFor(realName)
i = self.core.insertComponent(pos, modI, self)
for arg in args:
self.core.selectedComponents[i].command(arg)
if self.args.export and self.args.projpath:
errcode, data = self.core.parseAvFile(projPath)
2017-06-25 15:50:31 -04:00
for key, value in data['WindowFields']:
if 'outputFile' in key:
output = value
if not os.path.dirname(value):
output = os.path.join(
os.path.expanduser('~'),
output
)
2017-06-25 15:50:31 -04:00
if 'audioFile' in key:
input = value
self.createAudioVisualisation(input, output)
elif self.args.input and self.args.output:
self.createAudioVisualisation(self.args.input, self.args.output)
elif 'help' not in sys.argv:
self.parser.print_help()
quit(1)
def createAudioVisualisation(self, input, output):
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(
input,
output,
list(reversed(self.core.selectedComponents))
)
def videoCreated(self):
self.videoThread.quit()
self.videoThread.wait()
2017-06-22 19:59:31 -04:00
quit(0)
def showMessage(self, **kwargs):
print(kwargs['msg'])
if 'detail' in kwargs:
print(kwargs['detail'])
def drawPreview(self, *args):
pass
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-23 23:00:24 -04:00
compFileNames = [
os.path.splitext(
os.path.basename(mod.__file__)
)[0]
for mod in self.core.modules
]
for i, compFileName in enumerate(compFileNames):
if name.lower() in compFileName:
return self.core.compNames[i]
return
return None