-import optparse, subprocess, sys
-
-codecs = {
-"x264":
-[
- "mencoder", "%(input)s", "-o", "%(output)s",
- "-vf", "%(filters)s",
- "-ovc", "x264", "-x264encopts", "pass=%(pass)d:bitrate=%(vbitrate)d:me=umh:partitions=all:trellis=1:subq=7:bframes=1:direct_pred=auto",
- "-oac", "faac", "-faacopts", "br=%(abitrate)d:mpeg=4:object=2", "-channels", "2", "-srate", "48000",
-],
-
-"xvid":
-[
- "mencoder", "%(input)s", "-o", "%(output)s",
- "-ffourcc", "DX50",
- "-vf", "%(filters)s",
- "-ovc", "xvid", "-xvidencopts", "pass=%(pass)d:bitrate=%(vbitrate)d:vhq=4",
- "-oac", "mp3lame", "-lameopts", "abr:br=%(abitrate)d",
-],
+import commands
+import optparse
+import subprocess
+import sys
+import os
+import tempfile
+import shutil
+
+class MencoderCommand(object):
+ codec2opts = {
+ "lavc": "-lavcopts",
+ "xvid": "-xvidencopts",
+ "x264": "-x264encopts",
+ "faac": "-faacopts",
+ "mp3lame": "-lameopts",
+ }
+
+ def __init__(self, profile, opts):
+ self.profile = profile
+ self.opts = opts
+
+ def insert_options(self, cmd):
+ def try_opt(opt, var):
+ if var is not None:
+ cmd.append(opt)
+ cmd.append(var)
+ if self.opts.deinterlace:
+ cmd += ["-vf-add", "pp=ci"]
+ try_opt("-ss", self.opts.startpos)
+ try_opt("-endpos", self.opts.endpos)
+ try_opt("-dvd-device", self.opts.dvd)
+ try_opt("-chapter", self.opts.chapter)
+ try_opt("-aid", self.opts.audioid)
+ try_opt("-sid", self.opts.subtitleid)
+ try_opt("-vf-add", self.opts.vfilters)
+ try_opt("-af", self.opts.afilters)
+
+ def subst_values(self, cmd, vpass):
+ subst = {
+ "vbitrate": self.opts.vbitrate,
+ "abitrate": self.opts.abitrate,
+ "input": self.opts.input,
+ "output": self.opts.output,
+ "vpass": vpass,
+ }
+
+ return [x % subst for x in cmd]
+
+ def pass1(self):
+ p = self.profile
+ cmd = []
+ cmd += ["mencoder", "%(input)s", "-o", "/dev/null"]
+ self.insert_options(cmd)
+ cmd += ["-ovc", p.vcodec, self.codec2opts[p.vcodec], p.vopts]
+ cmd += ["-oac", "copy"]
+ cmd = self.subst_values(cmd, vpass=1)
+ return cmd
+
+ def pass2(self):
+ p = self.profile
+ cmd = []
+ cmd += ["mencoder", "%(input)s", "-o", "%(output)s"]
+ self.insert_options(cmd)
+ cmd += ["-ovc", p.vcodec, self.codec2opts[p.vcodec], p.vopts]
+ cmd += ["-oac", p.acodec, self.codec2opts[p.acodec], p.aopts]
+ if self.opts.episode_name:
+ cmd += ["-info", "name='%s'" % self.opts.episode_name]
+ cmd += self.profile.extra
+ cmd = self.subst_values(cmd, vpass=2)
+ return cmd
+
+class Profile(object):
+ def __init__(self, CommandClass, **kwargs):
+ self.extra = []
+
+ self.CommandClass = CommandClass
+ self.__dict__.update(kwargs)
+ def __contains__(self, keyname):
+ return hasattr(self, keyname)
+
+profiles = {
+ "qt7" :
+ Profile(
+ CommandClass=MencoderCommand,
+ vcodec="x264",
+ vopts="pass=%(vpass)d:bitrate=%(vbitrate)d:me=umh:partitions=all:trellis=1:subq=7:bframes=1:direct_pred=auto",
+ acodec="faac",
+ aopts="br=%(abitrate)d:mpeg=4:object=2",
+ ),
+
+ "xvid" :
+ Profile(
+ CommandClass=MencoderCommand,
+ vcodec="xvid",
+ vopts="pass=%(vpass)d:bitrate=%(vbitrate)d:vhq=4:autoaspect",
+ acodec="mp3lame",
+ aopts="abr:br=%(abitrate)d",
+ extra=["-ffourcc", "DX50"],
+ ),
+
+ "ipodxvid" :
+ Profile(
+ CommandClass=MencoderCommand,
+ vcodec="xvid",
+ vopts="pass=%(vpass)d:bitrate=%(vbitrate)d:vhq=4:autoaspect:max_bframes=0",
+ acodec="faac",
+ aopts="br=%(abitrate)d:mpeg=4:object=2",
+ ),
+
+ "ipod264" :
+ Profile(
+ CommandClass=MencoderCommand,
+ vcodec="x264",
+ vopts="pass=%(vpass)d:bitrate=%(vbitrate)d:vbv_maxrate=1500:vbv_bufsize=2000:nocabac:me=umh:partitions=all:trellis=1:subq=7:bframes=0:direct_pred=auto:level_idc=30:global_header:turbo",
+ acodec="faac",
+ aopts="br=%(abitrate)d:mpeg=4:object=2:raw",
+ extra=["-of", "lavf", "-lavfopts", "format=mp4", "-channels", "2", "-srate", "48000"]
+ ),