files/dvdrip

75 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import getopt
import re
opts, args = getopt.getopt(sys.argv[1:], 'ald:t:m:')
_all = False
_list = False
_titlenumber = 0
_minsize = 0
_dvddev = "/dev/cdrom"
for opt, val in opts:
if opt == '-a':
_all = True
elif opt == '-l':
_list = True
elif opt == '-d':
_dvddev = val
elif opt == '-t':
_titlenumber = val
elif opt == '-m':
_minsize = int(val)
if (not _list and len(args) != 1) or (not _all and not _list and _titlenumber == 0):
sys.stderr.write('''Usage: %s [-l|-a|-t tn] [-m minsize] <name>
-l List titles
-a rip all titles
-d DVD device (default /dev/cdrom)
-t tn rip title number <titlenumber>
-m minsize remove produced files less than minsize
<name> DVD name
''' % sys.argv[0])
sys.exit(2)
p = Popen(['vobcopy', '-I', '-i', _dvddev], stderr=PIPE)
vobcopy_out = p.communicate()[1]
if _list:
for line in vobcopy_out.split('\n'):
if re.search(r'Title\s\d+\shas.*chapter', line):
sys.stdout.write(line + '\n')
sys.exit(0)
titles = []
if _all:
for line in vobcopy_out.split('\n'):
m = re.search(r'Title\s(\d+)\shas.*chapter', line)
if m is not None:
titles.append(m.group(1))
else:
titles.append(_titlenumber)
dvdname = args[0]
try:
os.makedirs(dvdname)
except:
pass
for tn in titles:
ofname = '%s/title%s.avi' % (dvdname, tn)
Popen(['mencoder', 'dvd://%s' % tn, '-ovc', 'lavc',
'-dvd-device', _dvddev,
'-af', 'volnorm=1', '-alang', 'en', '-oac', 'mp3lame',
'-lameopts', 'cbr:preset=128',
'-lavcopts', 'threads=4:vbitrate=2000:v4mv:vhq:vcodec=mpeg4',
'-vf', 'pp=de,scale=720:-2', '-nosub', '-forceidx',
'-o', ofname]).wait()
if _minsize != 0:
size = os.stat(ofname).st_size
if size < _minsize:
os.unlink(ofname)