flake8 code cleanup, minor fixes

This commit is contained in:
derchris 2019-01-20 06:15:57 +01:00
parent b9eb2d234e
commit 43f08547f0
4 changed files with 606 additions and 583 deletions

View file

@ -1,4 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab
import subprocess import subprocess
import renderlib import renderlib
@ -8,10 +9,7 @@ import shlex
import time import time
import sys import sys
import os import os
import re
import platform import platform
from xml.sax.saxutils import escape as xmlescape
from shutil import copyfile from shutil import copyfile
# Parse arguments # Parse arguments
@ -69,17 +67,20 @@ parser.add_argument('--bgloop', action="store_true", default=False, help='''
args = parser.parse_args() args = parser.parse_args()
def headline(str): def headline(str):
print("##################################################") print("##################################################")
print(str) print(str)
print("##################################################") print("##################################################")
print() print()
def error(str): def error(str):
headline(str) headline(str)
parser.print_help() parser.print_help()
sys.exit(1) sys.exit(1)
if not args.project: if not args.project:
error("The Path to your project with After Effect Files is a required argument") error("The Path to your project with After Effect Files is a required argument")
@ -118,15 +119,19 @@ elif args.bgloop:
else: else:
events = list(renderlib.events(args.schedule)) events = list(renderlib.events(args.schedule))
def describe_event(event): def describe_event(event):
return "#{}: {}".format(event['id'], event['title']) return "#{}: {}".format(event['id'], event['title'])
def event_print(event, message): def event_print(event, message):
print("{} {}".format(describe_event(event), message)) print("{} {}".format(describe_event(event), message))
tempdir = tempfile.TemporaryDirectory() tempdir = tempfile.TemporaryDirectory()
print('working in ' + tempdir.name) print('working in ' + tempdir.name)
def fmt_command(command, **kwargs): def fmt_command(command, **kwargs):
args = {} args = {}
for key, value in kwargs.items(): for key, value in kwargs.items():
@ -135,6 +140,7 @@ def fmt_command(command, **kwargs):
command = command.format(**args) command = command.format(**args)
return shlex.split(command) return shlex.split(command)
def run_once(command, **kwargs): def run_once(command, **kwargs):
DETACHED_PROCESS = 0x00000008 DETACHED_PROCESS = 0x00000008
return subprocess.Popen( return subprocess.Popen(
@ -146,12 +152,14 @@ def run_once(command, **kwargs):
close_fds=True, close_fds=True,
creationflags=DETACHED_PROCESS) creationflags=DETACHED_PROCESS)
def run(command, **kwargs): def run(command, **kwargs):
return subprocess.check_call( return subprocess.check_call(
fmt_command(command, **kwargs), fmt_command(command, **kwargs),
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL) stdout=subprocess.DEVNULL)
def enqueue_job(event): def enqueue_job(event):
event_id = str(event['id']) event_id = str(event['id'])
if os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov')) and not args.force: if os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov')) and not args.force:
@ -165,13 +173,13 @@ def enqueue_job(event):
if event_id == 'pause' or event_id == 'outro' or event_id == 'bgloop': if event_id == 'pause' or event_id == 'outro' or event_id == 'bgloop':
copyfile(args.project + event_id + '.aep', work_doc) copyfile(args.project + event_id + '.aep', work_doc)
if platform.system() == 'Darwin': if platform.system() == 'Darwin':
run('/Applications/Adobe\ After\ Effects\ CC\ 2018/aerender -project {jobpath} -comp {comp} -output {locationpath}', run(r'/Applications/Adobe\ After\ Effects\ CC\ 2018/aerender -project {jobpath} -comp {comp} -output {locationpath}',
jobpath=work_doc, jobpath=work_doc,
comp=event_id, comp=event_id,
locationpath=intermediate_clip) locationpath=intermediate_clip)
if platform.system() == 'Windows': if platform.system() == 'Windows':
run('C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/aerender.exe -project {jobpath} -comp {comp} -output {locationpath}', run(r'C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/aerender.exe -project {jobpath} -comp {comp} -output {locationpath}',
jobpath=work_doc, jobpath=work_doc,
comp=event_id, comp=event_id,
locationpath=intermediate_clip) locationpath=intermediate_clip)
@ -196,25 +204,26 @@ def enqueue_job(event):
scriptpath=script_doc, scriptpath=script_doc,
ascript_path=ascript_doc) ascript_path=ascript_doc)
run('/Applications/Adobe\ After\ Effects\ CC\ 2018/aerender -project {jobpath} -comp "intro" -output {locationpath}', run(r'/Applications/Adobe\ After\ Effects\ CC\ 2018/aerender -project {jobpath} -comp "intro" -output {locationpath}',
jobpath=work_doc, jobpath=work_doc,
locationpath=intermediate_clip) locationpath=intermediate_clip)
if platform.system() == 'Windows': if platform.system() == 'Windows':
run_once('C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/AfterFX.exe -noui {jobpath}', run_once(r'C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/AfterFX.exe -noui {jobpath}',
jobpath=work_doc) jobpath=work_doc)
time.sleep(15) time.sleep(15)
run_once('C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/AfterFX.exe -noui -r {scriptpath}', run_once(r'C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/AfterFX.exe -noui -r {scriptpath}',
scriptpath=script_doc) scriptpath=script_doc)
time.sleep(5) time.sleep(5)
run('C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/aerender.exe -project {jobpath} -comp "intro" -output {locationpath}', run(r'C:/Program\ Files/Adobe/Adobe\ After\ Effects\ CC\ 2018/Support\ Files/aerender.exe -project {jobpath} -comp "intro" -output {locationpath}',
jobpath=work_doc, jobpath=work_doc,
locationpath=intermediate_clip) locationpath=intermediate_clip)
return event_id return event_id
def finalize_job(job_id, event): def finalize_job(job_id, event):
event_id = str(event['id']) event_id = str(event['id'])
intermediate_clip = os.path.join(tempdir.name, event_id + '.mov') intermediate_clip = os.path.join(tempdir.name, event_id + '.mov')

View file

@ -1,4 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab
import subprocess import subprocess
import renderlib import renderlib
@ -47,17 +48,20 @@ parser.add_argument('--exclude-id', dest='exclude_ids', nargs='+', action="store
args = parser.parse_args() args = parser.parse_args()
def headline(str): def headline(str):
print("##################################################") print("##################################################")
print(str) print(str)
print("##################################################") print("##################################################")
print() print()
def error(str): def error(str):
headline(str) headline(str)
parser.print_help() parser.print_help()
sys.exit(1) sys.exit(1)
if not args.motn: if not args.motn:
error("The Motion-File is a rquired argument") error("The Motion-File is a rquired argument")
@ -78,12 +82,15 @@ if args.debug:
else: else:
events = list(renderlib.events(args.schedule)) events = list(renderlib.events(args.schedule))
def describe_event(event): def describe_event(event):
return "#{}: {}".format(event['id'], event['title']) return "#{}: {}".format(event['id'], event['title'])
def event_print(event, message): def event_print(event, message):
print("{} {}".format(describe_event(event), message)) print("{} {}".format(describe_event(event), message))
tempdir = tempfile.TemporaryDirectory() tempdir = tempfile.TemporaryDirectory()
print('working in ' + tempdir.name) print('working in ' + tempdir.name)
@ -96,10 +103,12 @@ def fmt_command(command, **kwargs):
command = command.format(**args) command = command.format(**args)
return shlex.split(command) return shlex.split(command)
def run(command, **kwargs): def run(command, **kwargs):
return subprocess.check_call( return subprocess.check_call(
fmt_command(command, **kwargs)) fmt_command(command, **kwargs))
def run_output(command, **kwargs): def run_output(command, **kwargs):
return subprocess.check_output( return subprocess.check_output(
fmt_command(command, **kwargs), fmt_command(command, **kwargs),
@ -127,16 +136,17 @@ def enqueue_job(event):
jobpath=work_doc, jobpath=work_doc,
locationpath=intermediate_clip) locationpath=intermediate_clip)
match = re.search("<jobID ([A-Z0-9\-]+) ?\/>", compressor_info) match = re.search(r"<jobID ([A-Z0-9\-]+) ?\/>", compressor_info)
if not match: if not match:
event_print(event, "unexpected output from compressor: \n" + compressor_info) event_print(event, "unexpected output from compressor: \n" + compressor_info)
return return
return match.group(1) return match.group(1)
def fetch_job_status(): def fetch_job_status():
compressor_status = run_output('/Applications/Compressor.app/Contents/MacOS/Compressor -monitor') compressor_status = run_output('/Applications/Compressor.app/Contents/MacOS/Compressor -monitor')
job_status_matches = re.finditer("<jobStatus (.*) \/jobStatus>", compressor_status) job_status_matches = re.finditer(r"<jobStatus (.*) \/jobStatus>", compressor_status)
status_dict = {} status_dict = {}
for match in job_status_matches: for match in job_status_matches:
@ -150,8 +160,6 @@ def fetch_job_status():
return status_dict return status_dict
def filter_finished_jobs(active_jobs): def filter_finished_jobs(active_jobs):
job_status = fetch_job_status() job_status = fetch_job_status()
@ -182,14 +190,13 @@ def finalize_job(job_id, event):
shutil.copy(intermediate_clip, copy_clip) shutil.copy(intermediate_clip, copy_clip)
run('ffmpeg -y -hide_banner -loglevel error -i "{input}" -map 0:v -c:v mpeg2video -q:v 0 -aspect 16:9 -map 0:a -map 0:a -map 0:a -map 0:a -shortest -f mpegts "{output}"', run('ffmpeg -y -hide_banner -loglevel error -i {input} -f lavfi -i anullsrc -ar 48000 -ac 2 -map 0:v -c:v mpeg2video -q:v 0 -aspect 16:9 -map 1:a -map 1:a -map 1:a -map 1:a -shortest -f mpegts {output}',
input=intermediate_clip, input=intermediate_clip,
output=final_clip) output=final_clip)
event_print(event, "finalized intro to " + final_clip) event_print(event, "finalized intro to " + final_clip)
active_jobs = [] active_jobs = []
filtered_events = events filtered_events = events

21
make.py
View file

@ -1,10 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab
import sys import sys
import os import os
import time import time
import shutil import shutil
from lxml import etree
import tempfile import tempfile
import threading import threading
import multiprocessing import multiprocessing
@ -55,14 +55,14 @@ if len(sys.argv) < 2:
args = parser.parse_args() args = parser.parse_args()
if not (args.debug==False or args.id==None): if not (args.debug is False or args.id is None):
print("##################################################") print("##################################################")
print("Error! You must not use --debug and --id together!") print("Error! You must not use --debug and --id together!")
print("##################################################") print("##################################################")
parser.print_help() parser.print_help()
sys.exit(1) sys.exit(1)
if not (args.debug==False or args.skip==None): if not (args.debug is False or args.skip is None):
print("####################################################") print("####################################################")
print("Error! You must not use --debug and --skip together!") print("Error! You must not use --debug and --skip together!")
print("####################################################") print("####################################################")
@ -88,10 +88,12 @@ renderlib.debug = args.debug
renderlib.args = args renderlib.args = args
# sys.exit(1) # sys.exit(1)
def render(infile, outfile, sequence, parameters={}, workdir=os.path.join(projectname, 'artwork')): def render(infile, outfile, sequence, parameters={}, workdir=os.path.join(projectname, 'artwork')):
task = renderlib.Rendertask(infile=infile, outfile=outfile, sequence=sequence, parameters=parameters, workdir=workdir) task = renderlib.Rendertask(infile=infile, outfile=outfile, sequence=sequence, parameters=parameters, workdir=workdir)
return renderlib.rendertask(task) return renderlib.rendertask(task)
# debug-mode selected by --debug switch # debug-mode selected by --debug switch
if renderlib.debug: if renderlib.debug:
print("!!! DEBUG MODE !!!") print("!!! DEBUG MODE !!!")
@ -105,16 +107,14 @@ if renderlib.debug:
# exit early # exit early
sys.exit(0) sys.exit(0)
# threaded task queue # threaded task queue
tasks = Queue() tasks = Queue()
# initialize args.id and args.skip, if they are not given by the user # initialize args.id and args.skip, if they are not given by the user
if (args.id==None): if (args.id is None):
args.id = [] args.id = []
if (args.skip==None): if (args.skip is None):
args.skip = [] args.skip = []
# call into project which generates the tasks # call into project which generates the tasks
@ -131,6 +131,8 @@ for _ in range(num_worker_threads):
# this lock ensures, that only one thread at a time is writing to stdout # this lock ensures, that only one thread at a time is writing to stdout
# and avoids output from multiple threads intermixing # and avoids output from multiple threads intermixing
printLock = Lock() printLock = Lock()
def tprint(str): def tprint(str):
# aquire lock # aquire lock
printLock.acquire() printLock.acquire()
@ -163,7 +165,7 @@ def worker():
task = renderlib.Rendertask.ensure(tasks.get()) task = renderlib.Rendertask.ensure(tasks.get())
# if it is a stop-sentinal break out of the loop # if it is a stop-sentinal break out of the loop
if task == None: if task is None:
break break
# print that we're about to render a task # print that we're about to render a task
@ -192,6 +194,7 @@ def worker():
# mark the sentinal as done # mark the sentinal as done
tasks.task_done() tasks.task_done()
# List of running threads # List of running threads
threads = [] threads = []
@ -206,7 +209,7 @@ for i in range(num_worker_threads):
# we're doing it the manual way because tasks.join() would wait until all tasks are done, # we're doing it the manual way because tasks.join() would wait until all tasks are done,
# even if the worker threads crash due to broken svgs, Ctrl-C termination or whatnot # even if the worker threads crash due to broken svgs, Ctrl-C termination or whatnot
while True: while True:
if tasks.empty() == True: if tasks.empty() is True:
break break
# sleep while the workers work # sleep while the workers work

View file

@ -1,10 +1,10 @@
#!/usr/bin/python3 #!/usr/bin/python3
# vim: tabstop=4 shiftwidth=4 expandtab
import os import os
import sys import sys
import re import re
import glob import glob
import math
import shutil import shutil
import errno import errno
from lxml import etree from lxml import etree
@ -22,10 +22,12 @@ args = None
cssutils.ser.prefs.lineSeparator = ' ' cssutils.ser.prefs.lineSeparator = ' '
cssutils.log.setLevel(logging.FATAL) cssutils.log.setLevel(logging.FATAL)
def loadProject(projectname): def loadProject(projectname):
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), projectname)) sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), projectname))
return __import__(projectname) return __import__(projectname)
def easeDelay(easer, delay, t, b, c, d, *args): def easeDelay(easer, delay, t, b, c, d, *args):
if t < delay: if t < delay:
return b return b
@ -35,6 +37,7 @@ def easeDelay(easer, delay, t, b, c, d, *args):
return easer(t - delay, b, c, d, *args) return easer(t - delay, b, c, d, *args)
class Rendertask: class Rendertask:
def __init__(self, infile, sequence, parameters={}, outfile=None, workdir='.'): def __init__(self, infile, sequence, parameters={}, outfile=None, workdir='.'):
if isinstance(infile, list): if isinstance(infile, list):
@ -59,6 +62,7 @@ class Rendertask:
else: else:
return None return None
# try to create all folders needed and skip, they already exist # try to create all folders needed and skip, they already exist
def ensurePathExists(path): def ensurePathExists(path):
try: try:
@ -67,18 +71,20 @@ def ensurePathExists(path):
if exception.errno != errno.EEXIST: if exception.errno != errno.EEXIST:
raise raise
# remove the files matched by the pattern # remove the files matched by the pattern
def ensureFilesRemoved(pattern): def ensureFilesRemoved(pattern):
for f in glob.glob(pattern): for f in glob.glob(pattern):
os.unlink(f) os.unlink(f)
def rendertask(task): def rendertask(task):
global args global args
# in debug mode we have no thread-worker which prints its progress # in debug mode we have no thread-worker which prints its progress
if debug: if debug:
print("generating {0} from {1}".format(task.outfile, task.infile)) print("generating {0} from {1}".format(task.outfile, task.infile))
if not args.skip_frames and not 'only_rerender_frames_after' in task.parameters: if args.skip_frames and 'only_rerender_frames_after' not in task.parameters:
if os.path.isdir(os.path.join(task.workdir, '.frames')): if os.path.isdir(os.path.join(task.workdir, '.frames')):
shutil.rmtree(os.path.join(task.workdir, '.frames')) shutil.rmtree(os.path.join(task.workdir, '.frames'))
@ -172,12 +178,9 @@ def rendertask(task):
# increment frame-number # increment frame-number
frameNr += 1 frameNr += 1
if args.only_frame: if args.only_frame:
task.outfile = '{0}.frame{1:04d}.png'.format(task.outfile, args.only_frame) task.outfile = '{0}.frame{1:04d}.png'.format(task.outfile, args.only_frame)
# remove the dv/ts we are about to (re-)generate # remove the dv/ts we are about to (re-)generate
ensureFilesRemoved(os.path.join(task.workdir, task.outfile)) ensureFilesRemoved(os.path.join(task.workdir, task.outfile))
@ -220,12 +223,12 @@ def rendertask(task):
if not debug: if not debug:
print("cleanup") print("cleanup")
# remove the generated svg # remove the generated svg
ensureFilesRemoved(os.path.join(task.workdir, '.gen.svg')) ensureFilesRemoved(os.path.join(task.workdir, '.gen.svg'))
# Download the Events-Schedule and parse all Events out of it. Yield a tupel for each Event # Download the Events-Schedule and parse all Events out of it. Yield a tupel for each Event
def events(scheduleUrl, titlemap={}): def events(scheduleUrl, titlemap={}):
print("downloading schedule") print("downloading schedule")
@ -249,7 +252,7 @@ def events(scheduleUrl, titlemap={}):
personnames = [] personnames = []
if event.find('persons') is not None: if event.find('persons') is not None:
for person in event.find('persons').iter('person'): for person in event.find('persons').iter('person'):
personname = re.sub( '\s+', ' ', person.text ).strip() personname = re.sub(r'\s+', ' ', person.text).strip()
personnames.append(personname) personnames.append(personname)
id = int(event.get('id')) id = int(event.get('id'))
@ -257,12 +260,12 @@ def events(scheduleUrl, titlemap={}):
if id in titlemap: if id in titlemap:
title = titlemap[id] title = titlemap[id]
elif event.find('title') is not None and event.find('title').text is not None: elif event.find('title') is not None and event.find('title').text is not None:
title = re.sub( '\s+', ' ', event.find('title').text ).strip() title = re.sub(r'\s+', ' ', event.find('title').text).strip()
else: else:
title = '' title = ''
if event.find('subtitle') is not None and event.find('subtitle').text is not None: if event.find('subtitle') is not None and event.find('subtitle').text is not None:
subtitle = re.sub( '\s+', ' ', event.find('subtitle').text ).strip() subtitle = re.sub(r'\s+', ' ', event.find('subtitle').text).strip()
else: else:
subtitle = '' subtitle = ''
@ -277,6 +280,7 @@ def events(scheduleUrl, titlemap={}):
'track': event.find('track').text 'track': event.find('track').text
} }
try: try:
from termcolor import colored from termcolor import colored
except ImportError: except ImportError: