diff --git a/.pydevproject b/.pydevproject index 0bbc0db..4b6e256 100644 --- a/.pydevproject +++ b/.pydevproject @@ -6,9 +6,6 @@ python 2.5 Default -/sandbox/mpg2xvid -/sandbox/megui -/sandbox/gui /sandbox/src diff --git a/src/misc/tv-archiv.py b/src/misc/tv-archiv.py new file mode 100644 index 0000000..b953ec3 --- /dev/null +++ b/src/misc/tv-archiv.py @@ -0,0 +1,137 @@ +# (c) 2009 Andreas Balogh +# see LICENCE for details + +import os +import subprocess as sp +import logging +import re +import datetime +import sys +import shutil + +LOG = logging.getLogger() + +logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(levelname).4s %(process)d:%(thread)d %(message)s', + datefmt='%H:%M:%S') + +TV_REC_DIR = r"C:\Dokumente und Einstellungen\All Users\Dokumente\TV-Aufzeichnungen" +MPG_DIR = r"C:\Dokumente und Einstellungen\Andreas\Eigene Dateien\Archiv" +ARCHIV_DIR = r"C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Videos\Archiv" +VIDEO_DIR = r"C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Videos" + +DVRMS2MPG = r"C:\Programme\DVRMSToolbox\DVRMStoMPEG.exe" +VIRTUALDUB = r"C:\Apps\VirtualDub\VirtualDub.exe" + +ARCHIVE_DELAY = datetime.timedelta(days = 30) +SERIES_DELAY = datetime.timedelta(days = 3) + +def main(): + """ compress files older than n days """ + # select files and sort by creation datetime + find_archive("Pettersson und Findus") + find_archive("Die Sendung mit der Maus") + find_archive("Die Sendung mit dem Elefanten") + files = find_dvrms(min_age = ARCHIVE_DELAY) + archive(files) + +def find_archive(glob): + LOG.info("find & archive '%s'...", glob) + re = "(%s.*)\.dvr-ms" % (glob, ) + files = find_dvrms(pattern = re, min_age = SERIES_DELAY) + archive(files, target = glob) + +def find_dvrms(pattern = "(.*)\.dvr-ms", min_age = None): + files = [] + dvrms_reo = re.compile(pattern) + for dvrms_fn in os.listdir(TV_REC_DIR): + dvrms_fp = os.path.join(TV_REC_DIR, dvrms_fn) + if not os.path.isfile(dvrms_fp): + continue + # file is a dvr-ms + mo = dvrms_reo.match(dvrms_fn) + if not mo: + continue + unix_ctime = os.stat(dvrms_fp).st_ctime + dt_ctime = datetime.datetime.fromtimestamp(int(unix_ctime)) + # file older than min_age + if min_age is not None: + if datetime.datetime.now() < dt_ctime + min_age: + continue + files.append((dt_ctime, dvrms_fn)) + return files + +def archive(files, target = "Archiv"): + # archive now + dvrms_reo = re.compile("(.*)\.dvr-ms") + files.sort(cmp=lambda x,y: cmp(x[0], y[0]), reverse=False) + for dt_ctime, dvrms_fn in files: + print dt_ctime.isoformat(" "), dvrms_fn.decode("latin") + dvrms_fp = os.path.join(TV_REC_DIR, dvrms_fn) + file_root = dvrms_reo.match(dvrms_fn).group(1) + mpg_fp = os.path.join(MPG_DIR, file_root + ".mpg") + archiv_dir = os.path.join(VIDEO_DIR, target) + divx_fp = os.path.join(archiv_dir, file_root + ".avi") + if not os.path.isfile(divx_fp): + # convert + if not os.path.isfile(mpg_fp): + tmp_fp = os.path.join(MPG_DIR, file_root + "_tmp.mpg") + dtb_mpg(dvrms_fp, tmp_fp) + os.rename(tmp_fp, mpg_fp) + # compress and archive + tmp_fp = os.path.join(MPG_DIR, file_root + "_tmp.avi") + vdub(mpg_fp, tmp_fp) + # os.rename work on same drive, use shutil.move otherwise + shutil.move(tmp_fp, divx_fp) + # touch divx_fp with dvrms_fp + shutil.copystat(dvrms_fp, divx_fp) + # clean up + os.remove(mpg_fp) + # os.remove(dvrms_fp) + LOG.info("done") + +def dtb_mpg(dvrms_fp, mpg_fp): + _if = "/if=%s" % (dvrms_fp, ) + _of = "/of=%s" % (mpg_fp, ) + args = [DVRMS2MPG, ] + args.append(_if) + args.append(_of) + args.append("/act=dvrmstompg") + LOG.info("\n\r".join(args).decode("latin")) + proc = sp.Popen(args) + proc.wait() + LOG.info("%i", proc.returncode) + return proc.returncode + +def dtb_xvid(dvrms_fp, xvid_fp): + _if = "/if=%s" % (dvrms_fp, ) + _of = "/of=%s" % (xvid_fp, ) + args = [DVRMS2MPG, ] + args.append(_if) + args.append(_of) + args.append("/act=mencoder") + LOG.info("\n\r".join(args).decode("latin")) + proc = sp.Popen(args) + proc.wait() + LOG.info("%i", proc.returncode) + return proc.returncode + +def vdub(mpg_fp, divx_fp): + # c:\apps\virtualdub\virtualdub.exe /s "archiv.vcf" /c /p %SRC% %DEST% /r /x + args = [VIRTUALDUB, ] + args.append('/s') + args.append(r"c:\Dokumente und Einstellungen\Andreas\Eigene Dateien\archiv.vcf") + args.append('/c') + args.append('/p') + args.append(mpg_fp) + args.append(divx_fp) + args.append('/r') + args.append('/x') + LOG.info("\n\r".join(args).decode("latin")) + proc = sp.Popen(args) + proc.wait() + LOG.info("%i", proc.returncode) + return proc.returncode + +if __name__ == "__main__": + main()