[mythtv-users] Announcing new program for transcoding recordings.
Claus M. Christiansen
a at skjern-net.dk
Sat Jun 26 13:41:52 EDT 2004
Running now... Looks nice Esben...
Claus
Esben Skov Pedersen wrote:
> For some reason nuvexport didn't work om my system (mdk9.2. myth rpms
> from plf) I decided to write my own. It has a simple interface and
> supports divx and xvid. It is also possible to transcode multiple
> shows in a batch.
>
> If you has changed mysql-settings for mythtv you have to change them
> in the top of the script. You must have mplayer and xvid/divx
> installed for it to work.
>
> Here goes. Paste the code into /usr/local/bin/legend.py. chmod +x
> /usr/local/bin/legend.py. Then just type legend.py in the console.
>
> <---Start--->
>
> #!/usr/bin/python
>
> #You might want to change these settings
>
> #mysql info. Read "man mysql"
> mysql='mysql -umythtv -pmythtv mythconverg'
>
> qualitySet={
> 3: {'bitrate': 1000, 'scale':(400, 320)},
> 6: {'bitrate': 1200, 'scale': (360, 288)},
> 9: {'bitrate': 1200, 'scale': (400, 320)},
> 99: {'bitrate': 0, 'scale': (0, 0)}
> } quality=9
>
> #VBR sound quality (0-9, 0=best)
> lameQuality=4
>
> #2-pass? Takes longer time to encode
> twoPass=True
>
> #Cut some of the edges. -1 means center
> #crop=(420, 326, -1, -1)
> bitrate=qualitySet[quality]['bitrate']
>
> divx="-ovc lavc -lavcopts vbitrate=%d:vcodec=mpeg4 "%( bitrate )
> xvid="-ovc xvid -xvidencopts bitrate=%d "% ( bitrate )
>
> if twoPass:
> divx+="-lavcopts vpass=%n "
> xvid+="-xvidencopts pass=%n "
> #Video codec See http://mplayerhq.hu/DOCS/man/en/manpage.html for
> further options
> videoCodec=divx
>
> #Length of movie (seconds). Go nuts and try the different codecs much
> faster
> #movieLength=20
> #Note The movies will end up i the current directory as title.avi
> ########################################################################
> ##Don't edit anything below this line unless you know what you are doing
> ########################################################################
>
>
> import os
> import sys
> import time
> import re
>
> def skrivStatus(prefix, done, eta):
> status="%3s%% Done ETA:%3sm"%( done, eta )
> sys.stdout.write("\r%-55s %s"%(prefix[:52], status ))
> sys.stdout.flush()
> def parseMencoder(prefix, prog):
> skrivStatus(prefix, 0, "")
> v, encoder=os.popen4(prog)
> findEta=re.compile('Trem:\s*(\d+)min')
> findStatus=re.compile('\(\s*(\d+)%\)')
> c=-1
> status=""
> try:
> while True:
> c+=1
> raw=encoder.read(80)
> if not raw: break
> # sys.stdout.write(raw)
> if c%100!=0 or c<40: continue
> # tail=raw[-1:]
> eta=findEta.search(raw)
> try:
> done=findStatus.search(raw).group(1)
> finish=findEta.search(raw).group(1)
> status="%3s%% Done ETA:%3sm"%( done, finish )
> except AttributeError: continue
> skrivStatus(prefix, done, finish)
> except KeyboardInterrupt:
> print
> sys.exit()
> if c<50:
> print "\r"
> print "Mplayer does seem to be installed correctly"
> sys.exit(1)
> else:
> skrivStatus(prefix, 100, 0)
> print
> scale=qualitySet[quality]['scale']
>
> t=os.popen("echo \"select data from settings where
> value='RecordFilePrefix'\" | %s"%mysql)
> t.readline()
> recDir=t.readline().strip()
>
> shows=os.popen("echo \"SELECT concat('%s/', chanid, '_', starttime,
> '_', endtime, '.nuv') as Filnavn, title from recorded ORDER by
> starttime DESC\" | %s"%(recDir, mysql))
>
> shows.readline()
> showsData=[]
> for show in shows.readlines():
> try:
> f=show.split('\t')
> showsData.append(( unicode(f[1][:-1], 'utf-8'), f[0] ))
> except : continue
> print "Legend.py: Encodes mythtv-recordings to xvid or divx"
> print "Edit top of Legend.py to change resolution, "
> print "bitrate, multi-pass and crop-settings"
> print " Show %57s"%'date'
>
> for key in range(0, len(showsData)):
> try:
> d=int(showsData[key][1][-27:-25])
> m=int(showsData[key][1][-29:-27])
> date="[ %d/%d ]"%(d, m)
> except ValueError:
> date=""
> print " %-2d %-50s %s"%(key+1, showsData[key][0], date )
>
> while True:
> print "Choose shows ( comma separated ) ",
> try:
> choices=[]
> r=raw_input()
> for a in r.split(','):
> # print a
> k=int(a)-1
> ( showName, inFile ) = showsData[k]
> choices.append( ( showName, inFile ) )
> break
> except KeyboardInterrupt:
> print
> sys.exit()
> except ValueError:
> print "Not a number \"%s\""%a
> continue
> except IndexError:
> print "No such show \"%d\""% (k+1)
> continue
>
> count=0
> n=''
> for showName, inFile in choices:
> if count != 0: n=".%d"%count
> outFile="%s%s.avi"%( showName.replace( ",", " - ").replace(':', ' -
> '), n )
> if os.path.isfile(outFile):
> print "%-50s [Y/n]"%( "\"%s\" exists.
> Overwrite?"%os.path.basename(outFile)[:46] ) ,
> try:
> ans=raw_input()
> except KeyboardInterrupt:
> print
> sys.exit()
> if not (ans =='' or ans[0].lower()=='y' ):
> sys.exit()
> count+=1
> count=0
> n=''
> print
> for showName, inFile in choices:
> program="mencoder "
> # program="false "
> if count != 0: n=".%d"%count
> outFile="%s%s.avi"%( showName.replace( ",", " - ").replace(':', ' -
> '), n )
> program+="\"%s\" -o \"%s\" "%( inFile, outFile )
> try:
> program+="-vf crop=%d:%d:%d:%d " %crop
> except NameError: pass
> program+="-vf scale=%d:%d " %scale
> program+=videoCodec
> program+="-oac mp3lame "
> program+="-lameopts q=%d "%lameQuality
> try:
> program+="-endpos %d "%movieLength
> except NameError: pass
> msg="%s First pass of \"%s\""%( time.strftime('%H:%M'), outFile )
> if twoPass:
> parseMencoder(msg, program.replace('%n', '1'))
> msg="%s Second pass of \"%s\""%( time.strftime('%H:%M'), outFile )
> parseMencoder(msg, program.replace('%n', '2'))
> else:
> parseMencoder(msg, program)
> count+=1
> print time.strftime('%H:%M'), "All Done"
>
> <--- legend.py end --- >
>
> Thats it. Enjoy /Esben
> _______________________________________________
> mythtv-users mailing list
> mythtv-users at mythtv.org
> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users
>
More information about the mythtv-users
mailing list