#!/usr/bin/env python '''Videoremote version 3.3 This program is a video mplayer selector for an infreared remote. (c) 2003 Jan ONDREJ (SAL) This program is licensed under GPL. ''' import gobject import gtk from gtk import TRUE, FALSE import os, re, sys, locale, string, math from sdict import sdict COLUMN_SHOW = 0 GDK=gtk.keysyms command_line=[] files_menu = 1 dirname=os.path.dirname(sys.argv[0]) programs_menu = sdict([ {'TV': ['TV']}, {'FILM': ['FILM']}, {'MP3': ['exec','xmms']}, {'RECORD': ['RECORD']}, {'MIXER': ['MIXER']}, {'CLOCK': ['exec',dirname+'/clock.py']}, {'PICTURES': ['exec',sys.argv[0],'--path',os.environ['HOME']+'/sal/pictures']}, {'HELP': ['HELP']} ]) mplayer_menu = sdict([ {'PLAY': ['run','mplayer']}, {'NEXTFILE': ['NEXTFILE']}, {'WITHOUT/WITH EXIT': ['WEXIT']}, {'TIMER': ['TIMER']}, {'seek 00:30:00': ['arg','-ss','00:30:00']}, {'seek 01:00:00': ['arg','-ss','01:00:00']}, {'broken': ['arg','-ni','-nocache','-mc','0','-forceidx','-nobps']}, {'Video out: x11': ['arg','-vo','x11']}, {'no index': ['arg','-noidx']}, {'channels1': ['arg','-channels','1']}, {'aspect 4:3': ['arg','-aspect','4:3']}, {'forced index': ['arg','-forceidx']}, {'subfps 29.970': ['arg','-subfps','29.970']} ]) help_menu = sdict([ {'HELP JVC': ['exec',dirname+'/showrem.py','--remote','JVCs']}, {'HELP NEC': ['exec',dirname+'/showrem.py','--remote','NEC']} ]) download_prog=['xterm','-e','(date;wget -T 10 -U mozilla -O - http://www.salstar.sk/wap/tv.php?channel=all )>/tmp/tv.html; sleep 2s'] tv_menu = sdict([ {'START': ['exec','tvtime']}, {'TV program': ['TVPROG']}, {'Download program': ['exec']+download_prog}, {'CANCEL': ['exec','killall','sleep']}, {'0:15 OFF': ['exec',dirname+'/poweroff.sh','15m']}, {'1:00 OFF': ['exec',dirname+'/poweroff.sh','60m']}, {'1:30 OFF': ['exec',dirname+'/poweroff.sh','90m']}, {'2:00 OFF': ['exec',dirname+'/poweroff.sh','2h']}, {'0:01 OFF': ['exec',dirname+'/poweroff.sh','1m']} ]) record_menu = sdict([ {'RECORD MOVIE': ['run',dirname+'/tvrec']}, {'PLAY IT': ['arg','--play']}, {'SNAPSHOT': ['exec',dirname+'/tvrec','--snapshot']}, {'STEREO': ['arg','-tv','amode=1']}, {'LANG1': ['arg','-tv','amode=2']}, {'TIME 00:30:00': ['arg','--mins','30']}, {'TIME 01:00:00': ['arg','--mins','60']}, {'TIME 01:30:00': ['arg','--mins','90']}, {'TIME 02:00:00': ['arg','--mins','120']}, {'TIME 03:00:00': ['arg','--mins','180']}, {'POWEROFF': ['arg','--poweroff']}, {'TIME 00:01:00': ['arg','--mins','1']} ]) mixer_menu = sdict([ {'VIDEO': ['exec','amixer','sset','Line','mute']}, {'TV': ['exec','amixer','sset','Line','unmute']}, {'NO MIC': ['exec','amixer','sset','Mic','mute']} ]) prog_progs = { 1:"Mark", 2:"JOJ", 3:"TA3", 4:"Prima", 5:".*esk.* telev.* 1", 6:".*esk.* telev.* 2", 7:"Hallmark", 8:"Spektrum", 9:"Discovery", 10:"Fox kids", 11:"MTV 1", 12:"TV 2", 13:"Music box", 14:"VH1", 15:"Slovensk.* 1", 16:"Slovensk.* 2", 17:"Galexie Sport", 18:"EuroSport", 19:"HBO" } def ls(path): l=os.listdir(path) l.sort() l.append('..') for i in ['.x']: try: l.remove(i) except: pass return l def tv_prog(file=None): if file: l=[open(file,'rt').readline().strip()] if l[0][:10]!=os.popen('date','r').readline().strip()[:10]: # download new program if os.fork()==0: os.execvp(download_prog[0],download_prog) os.wait() l=[open(file,'rt').readline().strip()] f=os.popen("lynx -dump "+file,"r") else: f=os.popen("lynx -dump http://www.salstar.sk/wap/tv.php?channel=all","r") l=[] for i in range(4): f.readline() while 1: d=f.readline() if not d: break if d.strip()=="": continue if d[0:3]=="TV:": l.append("") l.append(d.strip()) return l def recode(s,charset='iso8859-2'): try: return unicode(s,charset) except UnicodeError: return s shlist=[] def set_model(store,list,path=""): global sw,shlist shlist=list sw.get_vadjustment().set_value(0) sw.get_hadjustment().set_value(0) store.clear() store.d={} if path=="": for item in list.keys(): iter = store.append() store.d[item]=list.get(item) store.set(iter, COLUMN_SHOW, recode(item)) else: for item in list: iter = store.append() if os.path.isdir(path+"/"+item): item2=item+"/" else: item2=item store.d[item2]=[item] store.set(iter, COLUMN_SHOW, recode(item2,locale.getlocale()[1])) def keyf(treeview, event): global path, menu_type, lastpath if event.keyval == GDK.Escape: gtk.main_quit() if event.keyval == ord('x'): npath=os.path.join(path,'.x') if os.path.isdir(npath): lastpath=path path=npath set_model(model,ls(path),path) treeview.set_cursor(0,None,0) if event.keyval in [ord('t'),ord('v')]: line=treeview.get_cursor()[0][0]+1 # cursor position try: for i in shlist[line:]: if ((event.keyval==ord('t')) and (i[:2]=='TV') \ or (event.keyval==ord('v')) and (i[:2]=='20')): for y in [9,8,7,6,5,4,3,2,1]: treeview.set_cursor(line+y,None,line+y) if event.keyval==ord('v'): treeview.set_cursor(line-1,None,line-1) treeview.set_cursor(line,None,line) #print i break line+=1 except: print "exception?" def row_activated(self, row, column): global path, command_line, menutype, lastpath treeview=self model=treeview.get_model() iter = model.get_iter(row) try: arg = model.d[model.get_value(iter, COLUMN_SHOW)] val = arg[0] except KeyError: arg = [] val = '' oldpath=path if (val=='..'): path = os.path.dirname(path) elif (val=='arg'): command_line.extend(arg[1:]) treeview.set_cursor(0,column,0) elif (val=='exec'): os.execvp(arg[1],arg[1:]) else: path = path + '/' + val if menutype==programs_menu: if val=='RECORD': menutype=record_menu set_model(model,menutype) treeview.set_cursor(0,column,0) if val=='MIXER': menutype=mixer_menu set_model(model,menutype) treeview.set_cursor(0,column,0) if val=='TV': menutype=tv_menu set_model(model,menutype) treeview.set_cursor(0,column,0) if val=='FILM': path = os.environ['HOME']+'/ln/video' lastpath=path menutype = files_menu set_model(model,ls(path),path) treeview.set_cursor(0,column,0) if val=='HELP': menutype=help_menu set_model(model,menutype) treeview.set_cursor(0,column,0) elif menutype==tv_menu: if val=='TVPROG': menutype=tv_prog set_model(model,tv_prog('/tmp/tv.html'),'TV') treeview.set_cursor(0,column,0) elif menutype==tv_prog: line=treeview.get_cursor()[0][0]+1 # cursor position for i in shlist[:line]: if i[:4]=='TV: ': prg=i for ch,p in prog_progs.items(): print p,prg if re.search('^TV: '+p,prg,re.IGNORECASE): break os.system("tvtime-command CHANNEL_"+str(int(math.floor(ch/10)))) os.system("tvtime-command CHANNEL_"+str(ch%10)) elif menutype==record_menu: if val=='run': os.execvp(arg[1],[arg[1]]+command_line) elif menutype==mplayer_menu: if val=='run': try: f=open(os.path.join(os.path.dirname(oldpath),'mplayer.config')) mpx_args=string.split(string.rstrip(f.read()),'\n') f.close() except: mpx_args=[] if self.exit==TRUE: os.execvp(arg[1],[arg[1]]+mpx_args+command_line) else: if os.fork()==0: os.execvp(arg[1],[arg[1]]+mpx_args+command_line) else: path=lastpath menutype=files_menu set_model(model,ls(path),path) command_line=[] if self.cursor_pos.has_key(path): treeview.set_cursor(self.cursor_pos[path],column,0) elif val=='NEXTFILE': path=lastpath menutype=files_menu set_model(model,ls(path),path) if self.cursor_pos.has_key(path): treeview.set_cursor(self.cursor_pos[path],column,0) elif val=='TIMER': command_line=[dirname+'/clock.py']+command_line os.execvp(arg[1],[arg[1]]+command_line) elif val=='WEXIT': self.exit=~self.exit treeview.set_cursor((0,),column,0) else: # menutype=files_menu self.cursor_pos[oldpath]=row if os.path.isdir(path): lastpath=path set_model(model,ls(path),path) if self.cursor_pos.has_key(path) & (val=='..'): treeview.set_cursor(self.cursor_pos[path],column,0) else: if re.search('\.(txt|sub|srt|ssa|utf|smi|rt|aqt|jss)$', path,re.IGNORECASE): command_line.append('-sub') command_line.append(path) path=oldpath set_model(model,ls(path),path) if self.cursor_pos.has_key(path) & (val=='..'): treeview.set_cursor(self.cursor_pos[path],column,0) elif (re.search('.(gif|jpg|png|bmp)$',path,re.IGNORECASE)): cl=['gqview','-f',path] if os.fork()==0: os.execvp(cl[0],cl) else: path=os.path.dirname(oldpath) set_model(model,ls(path),path) if self.cursor_pos.has_key(path): treeview.set_cursor(self.cursor_pos[path],column,0) else: command_line.append(path) menutype=mplayer_menu set_model(model,mplayer_menu) treeview.grab_focus() def main(): global model, treeview, win, sw, path win = gtk.Window() win.connect('destroy', lambda win: gtk.main_quit()) win.set_title('VideoRemote') win.set_border_width(8) vbox = gtk.VBox(FALSE, 8) win.add(vbox) #label = gtk.Label('DIR') #vbox.pack_start(label, FALSE, FALSE) sw = gtk.ScrolledWindow() sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) vbox.pack_start(sw) model = gtk.ListStore(gobject.TYPE_STRING) if menutype==files_menu: set_model(model,ls(path),path) else: set_model(model,menutype) treeview = gtk.TreeView(model) treeview.exit=TRUE treeview.cursor_pos={} treeview.set_rules_hint(TRUE) treeview.set_search_column(COLUMN_SHOW) treeview.connect('key_press_event', keyf); treeview.connect('row-activated', row_activated) sw.add(treeview) # column for fixed toggles renderer = gtk.CellRendererToggle() cell = gtk.CellRendererText() cell.set_property('font', 'Sans 40') column = gtk.TreeViewColumn('Filename', cell, text=COLUMN_SHOW) treeview.append_column(column) treeview.set_cursor(0,column,0) #win.set_default_size(800,600) win.maximize() #win.fullscreen() win.show_all() gtk.main() if __name__ == '__main__': path = os.environ['HOME']+'/ln/video' menutype = programs_menu line = 0 n=1 while n