[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