diff --git a/.pydevproject b/.pydevproject index 756cdbd..e9c3ab1 100644 --- a/.pydevproject +++ b/.pydevproject @@ -6,6 +6,7 @@ /sandbox/src /sandbox/gui /sandbox/mpl +/sandbox/megui python 2.5 Default diff --git a/megui/create_jobs.py b/megui/create_jobs.py new file mode 100644 index 0000000..aa3eec5 --- /dev/null +++ b/megui/create_jobs.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 Andreas Balogh +# See LICENSE for details. + +""" create MeGUI jobs for Panasonic MPG files """ + +# system imports + +import logging +import sys +import os +import getopt +import re +import xml.dom.minidom as xdm +import xml.dom + +# local imports + +# constants + +# globals + +LOG = logging.getLogger() + +logging.basicConfig(level=logging.DEBUG, + format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s", + datefmt="%H:%M:%S") + +# definitions + +class Usage(Exception): + pass + +class Error(Exception): + pass + +def main(argv = [__name__]): + try: + # check for parameters + LOG.info("starting '%s %s'", argv[0], " ".join(argv[1:])) + script_name = os.path.basename(argv[0]) + try: + opts, args = getopt.getopt(argv[1:], "ht:j:z:", \ + ["help", "template", "job_dir", "temp_dir"]) + except getopt.error, err: + raise Usage(err) + LOG.debug("opts: %s, args: %s", opts, args) + template = "job_divx_template.xml" + job_dir = "C:\\Program Files\\megui\\jobs" + temp_dir = "e:\\video" + for o, a in opts: + if o in ("-h", "--help"): + usage(script_name) + return 0 + elif o in ("-t", "--template"): + template = a + elif o in ("-j", "--job_dir"): + job_dir = a + elif o in ("-z", "--temp_dir"): + temp_dir = a + src_dir = "D:\\Documents\\Raw\\Panasonic SDR-S7\\Video" + dest_dir = "D:\\Documents\\My Videos\\Balogh" + if len(args) == 2: + src_dir = args[0] + dest_dir = args[1] + elif len(args) == 1: + src_dir = args[0] + elif len(args) > 2: + raise Usage("too many arguments") + # call method with appropriate arguments + if src_dir and not os.path.exists(src_dir): + raise Error("Source directory not found [%s], aborting" % (src_dir, )) + if dest_dir and not os.path.exists(dest_dir): + LOG.warn("Destination directory not found [%s]", dest_dir) + LOG.info("Creating destination directory [%s]", dest_dir) + os.makedirs(dest_dir) + cli(src_dir, dest_dir, template, job_dir, temp_dir) + LOG.info("Done.") + return 0 + except Error, err: + LOG.error(err) + return 1 + except Usage, err: + LOG.error(err) + LOG.info("for usage use -h or --help") + return 2 + + +def cli(src_dir, dest_dir, template, job_dir, tmp_dir): + """ command line interface """ + if not os.path.exists(dest_dir): + LOG.error("Destination directory not found [%s]", dest_dir) + raise Error() + for mpg_fn in os.listdir(src_dir): + opts = { } + root, ext = os.path.splitext(mpg_fn) + # skip files which are not mpg video + if ext.lower() != ".mpg": + continue + # determine file paths + mpg_fp = os.path.join(src_dir, mpg_fn) + avi_fp = os.path.join(dest_dir, root + ".avi") + d2v_fp = os.path.join(tmp_dir, root + ".d2v") + opts["mpg_input"] = mpg_fp + opts["final_output"] = avi_fp + opts["d2v_output"] = d2v_fp + # if avi_fn older than mpg or doesn't exist + # then create job xml + if not os.path.exists(avi_fp): + create_megui_job(template, job_dir, opts) + +def append_megui_joblist(jobname): + joblist = "c:\\program files\\megui\\joblists.xml" + # load the xml + inf = open(joblist,"r") + dom = xdm.parse(inf) + inf.close() + # add job220 to mainJobList + JobListSerializer = dom.getElementsByTagName("JobListSerializer")[0] + mainJobList = JobListSerializer.getElementsByTagName("mainJobList")[0] + string = dom.createElement("string") + text = dom.createTextNode(jobname) + string.appendChild(text) + mainJobList.appendChild(string) + newline = dom.createTextNode("\n ") + mainJobList.appendChild(newline) + # save xml + outf = open(joblist,"w") + dom.writexml(outf) + outf.close() + + +def create_megui_job(template, job_dir, opts): + # replace in template: mpg_input, d2v_output, final_output, jobnum + jobnum = get_next_jobnumber(job_dir) + LOG.info("creating job %i...", jobnum) + jobfn = "job%i.xml" % (jobnum, ) + jobname = "job%i" % (jobnum, ) + opts["jobname"] = jobname + tplf = open(template, "r") + jobf = open(os.path.join(job_dir, jobfn), "w") + try: + for line in tplf: + # line = raw_line.rstrip("\n\r") + for k, v in opts.items(): + kd = "".join(("$", k, "$")) + line = line.replace(kd, v) + jobf.write(line) + finally: + jobf.close() + tplf.close() + append_megui_joblist(jobname) + +JOB_REO = re.compile("job(\d+)\.xml") + +def get_next_jobnumber(job_dir): + max_jn = 0 + for job_fn in os.listdir(job_dir): + job_mo = JOB_REO.match(job_fn) + if job_mo: + jn = int(job_mo.group(1)) + if jn > max_jn: + max_jn = jn + return max_jn + 1 + + +def usage(script_name): + print + print "usage: %s [-t template] [-j job_dir] [-z temp_dir] [src_dir [dst_dir]]" % (script_name,) + print """ + src_dir source directory of original MPG files + dest_dir destination directory for compressed video +options: + -h, --help show this help message and exit + -t, --template job template file + -j, --job_dir megui job directory + -z, --temp_dir working directory for megui +""" + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) + \ No newline at end of file diff --git a/megui/job_divx_template.xml b/megui/job_divx_template.xml new file mode 100644 index 0000000..78f409a --- /dev/null +++ b/megui/job_divx_template.xml @@ -0,0 +1,154 @@ + + + + + $mpg_input$ + $d2v_output$ + + false + false + 1 + + + + + + + c0 + 192 + MPEG-PS + 0 + MP2 + 2 channels + 48.0 KHz + + + + + + ::192:: + + + 0 + false + false + StereoDownmix + ABR + 128 + true + 0 + false + 100 + 50 + + 0 + 0 + CBR + + + + false + false + true + false + true + false + 640 + AVI + + + + + none + false + + Lanczos + MinimalNoise + false + false + false + false + true + false + + + 4 + 1200 + 250 + 2 + 1 + 31 + true + false + true + true + 15 + + XVID + DIVX + DX50 + MP4V + + .stats + + + 0 + 2 + 1 + 1200 + 6 + 4 + 1 + 31 + 1 + 31 + 162 + 0 + 100 + 1 + 20 + 5 + 5 + 5 + 30 + 15 + 16 + 100 + 0 + 0 + 0 + 0 + 0 + 0 + false + false + true + true + true + true + false + true + false + 0 + H.263 + + 1 + + $final_output$ + + false + + + + + $jobname$ + WAITING + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + \ No newline at end of file diff --git a/src/create_jobs.py b/src/create_jobs.py deleted file mode 100644 index b6629dd..0000000 --- a/src/create_jobs.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2009 Andreas Balogh -# See LICENSE for details. - -""" create MeGUI jobs for Panasonic MPG files """ - -# system imports - -import logging -import sys -import os -import getopt - -# local imports - -# constants - -# globals - -LOG = logging.getLogger() - -logging.basicConfig(level=logging.DEBUG, - format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s", - datefmt="%H:%M:%S") - -# definitions - -class Usage(Exception): - pass - -class Error(Exception): - pass - -def main(argv = [__name__]): - try: - # check for parameters - LOG.debug("starting '%s %s'", argv[0], " ".join(argv[1:])) - script_name = os.path.basename(argv[0]) - try: - opts, args = getopt.getopt(argv[1:], "hfgp", \ - ["help", "force", "gui", "preview"]) - except getopt.error, err: - raise Usage(err) - LOG.debug("opts: %s, args: %s", opts, args) - o_overwrite = False - o_gui = False - o_preview = False - for o, a in opts: - if o in ("-h", "--help"): - usage(script_name) - return 0 - elif o in ("-f", "--force"): - o_overwrite = True - elif o in ("-p", "--preview"): - o_preview = True - elif o in ("-g", "--gui"): - o_gui = True - if len(args) == 2: - src_dir = args[0] - dest_dir = args[1] - elif len(args) == 1 : - src_dir = args[0] - dest_dir = args[0] - elif len(args) == 0 : - src_dir = None - dest_dir = None - o_gui = True - else: - raise Usage("more than two arguments provided") - # call method with appropriate arguments - if src_dir and not os.path.exists(src_dir): - raise Error("Source directory not found [%s], aborting" % (src_dir, )) - if dest_dir and not os.path.exists(dest_dir): - LOG.warn("Destination directory not found [%s]", dest_dir) - if not o_preview: - LOG.info("Creating destination directory [%s]", dest_dir) - os.makedirs(dest_dir) - if o_gui: - gui(src_dir, dest_dir, o_overwrite) - else: - cli(src_dir, dest_dir, o_preview, o_overwrite) - LOG.debug("Done.") - return 0 - except Error, err: - LOG.error(err) - return 1 - except Usage, err: - LOG.error(err) - LOG.info("for usage use -h or --help") - return 2 - - -def gui(src_dir, dest_dir, o_overwrite): - """ graphical user interface """ - print src_dir, dest_dir, o_overwrite - - -def cli(src_dir, dest_dir, o_preview, o_overwrite): - """ command line interface """ - print src_dir, dest_dir, o_preview, o_overwrite - - -def usage(script_name): - print - print "usage: %s [options] [src_dir [dest_dir]]" % (script_name,) - print """ - src_dir source directory to search for MOD/MOI - dest_dir destination directory for MPG files -options: - -h, --help show this help message and exit - -f, --force override files with same name in destination directory - -g, --gui force interactive mode - -p, --preview preview only, don't copy, don't create non-existent directories -""" - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) - \ No newline at end of file