git @ Cat's Eye Technologies kinoje / master src / kinoje / orchestrator.py
master

Tree @master (Download .tar.gz)

orchestrator.py @masterraw · history · blame

from argparse import ArgumentParser
import os
import sys
from tempfile import mkdtemp

try:
    from tqdm import tqdm
except ImportError:
    def tqdm(x, **kwargs): return x

from kinoje.expander import Expander
from kinoje.renderer import Renderer
from kinoje.compiler import Compiler, SUPPORTED_OUTPUT_FORMATS

from kinoje.utils import LoggingExecutor, load_config_files


def main():
    argparser = ArgumentParser()

    argparser.add_argument('configfiles', metavar='FILENAME', type=str, nargs='+',
        help='A YAML file containing the template to render for each frame, '
             'as well as configuration for rendering the template. '
             'If multiple such configuration files are specified, successive '
             'files are applied as overlays.'
    )
    argparser.add_argument('-o', '--output', metavar='FILENAME', type=str, default=None,
        help='The movie file to create. The extension of this filename '
             'determines the output format and must be one of %r.  '
             'If not given, a default name will be chosen based on the '
             'configuration filename with a .mp4 extension added.' % (SUPPORTED_OUTPUT_FORMATS,)
    )
    argparser.add_argument('-d', '--work-dir', metavar='DIRNAME', type=str, default=None,
        help='The directory to store intermediate files in while creating '
             'this movie.  If not given, a directory will be created in '
             'the system temporary directory.'
    )
    argparser.add_argument('--version', action='version', version="%(prog)s 0.8")

    options, _unknown = argparser.parse_known_args(sys.argv[1:])

    if options.output is None:
        (configbase, configext) = os.path.splitext(os.path.basename(options.configfiles[0]))
        output_filename = configbase + '.mp4'
    else:
        output_filename = options.output

    CompilerClass = Compiler.get_class_for(output_filename)

    config = load_config_files(options.configfiles)

    if options.work_dir:
        work_dir = options.work_dir
        if not os.path.isdir(work_dir):
            os.mkdir(work_dir)
    else:
        work_dir =  mkdtemp()

    # TODO: append to this log if it already exists
    log_filename = os.path.join(work_dir, 'kinoje.log')
    exe = LoggingExecutor(log_filename)

    instants_dir = os.path.join(work_dir, 'instants')
    if not os.path.isdir(instants_dir):
        os.mkdir(instants_dir)

    frames_dir = os.path.join(work_dir, 'frames')
    if not os.path.isdir(frames_dir):
        os.mkdir(frames_dir)

    print('expanding template to instants in {}...'.format(instants_dir))
    expander = Expander(config, instants_dir, exe=exe, tqdm=tqdm)
    expander.expand_all()

    print('rendering instants to frames in {}...'.format(frames_dir))
    renderer = Renderer(config, instants_dir, frames_dir, exe=exe, tqdm=tqdm)
    renderer.render_all()

    print('compiling frames to movie file "{}"...'.format(output_filename))
    compiler = CompilerClass(config, frames_dir, output_filename, exe=exe, tqdm=tqdm)
    compiler.compile_all()

    exe.close()