#!/usr/bin/env python ################### # tscut.py # file cutter for MythTV # cuts transport streams at GOP and reindexes # database cutlist to match updated frame counts ################### from MythTV import Job, Recorded, MythLog, MythError, findfile, MythDB from subprocess import Popen from optparse import OptionParser import sys import os.path LOG = MythLog('tscut.py') DB = MythDB() def cut_video(rec): cutlist = rec.markup.getcutlist() seekdata = iter(rec.seek) newcutlist = [] newcutpoint = [] for left, right in cutlist: while True: seek = seekdata.next() if seek.mark >= left: left = seek.mark leftbyte = seek.offset break while True: lastseek = seek seek = seekdata.next() if seek.mark == right: right = seek.mark rightbyte = seek.offset break elif seek.mark > right: right = lastseek.mark rightbyte = lastseek.offset break newcutlist.append((left,right)) newcutpoint.append((leftbyte,rightbyte)) group = findfile(rec.basename, rec.storagegroup, db=rec._db) if group is None: raise MythError('Could not find recording') recfile = os.path.join(group.dirname, rec.basename) tmpfile = os.path.join(group.dirname, 'temp.mpg') finfile = recfile.rsplit('.') finfile.insert(1,'new') finfile = '.'.join(finfile) fi = open(recfile) fo = open(tmpfile,'w') for left,right in newcutpoint: cur = fi.tell() fo.write(fi.read(left-cur)) fi.seek(right) fo.write(fi.read()) print 'mythtranscode --mpeg2 --video --infile %s --outfile %s' \ % (tmpfile, finfile) proc = Popen('mythtranscode --mpeg2 --video --infile %s --outfile %s' \ % (tmpfile, finfile), shell=True) proc.wait() def main(): parser = OptionParser(usage="usage: %prog [options] [jobid]") parser.add_option("--chanid", action="store", type="int", dest="chanid", help="Use chanid for manual operation") parser.add_option("--starttime", action="store", type="int", dest="starttime", help="Use starttime for manual operation") parser.add_option('-o', '--overwrite', action='store_true', dest='overwrite', help="Overwrite the old recording in the database, and update seek and cut tables.") parser.add_option('-v', '--verbose', action='store', type='string', dest='verbose', help='Verbosity level') opts, args = parser.parse_args() if opts.verbose: if opts.verbose == 'help': print MythLog.helptext sys.exit(0) MythLog._setlevel(opts.verbose) if opts.chanid and opts.starttime: rec = Recorded((opts.chanid, opts.starttime), db=DB) elif len(args) == 1: job = Job(args[0], db=DB) rec = Recorded((job.chanid, job.starttime), db=DB) else: parser.print_help() sys.exit(2) cut_video(rec) if opts.overwrite: print 'not yet supported' if __name__ == "__main__": main()