From cca44a7e98b5ed28faf63c52fcdb77df799b3902 Mon Sep 17 00:00:00 2001 From: bjschuma Date: Wed, 3 Jun 2009 04:10:00 +0000 Subject: [PATCH] Began using gtk for a gui git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@11 1daee41c-8060-4895-b1f0-2197c00d777a --- trunk/images/media-eject.png | Bin 0 -> 1161 bytes trunk/images/media-playback-pause.png | Bin 0 -> 894 bytes trunk/images/media-playback-start.png | Bin 0 -> 1546 bytes trunk/images/media-playback-stop.png | Bin 0 -> 740 bytes trunk/images/media-record.png | Bin 0 -> 1755 bytes trunk/images/media-seek-backward.png | Bin 0 -> 1641 bytes trunk/images/media-seek-forward.png | Bin 0 -> 1739 bytes trunk/images/media-skip-backward.png | Bin 0 -> 1668 bytes trunk/images/media-skip-forward.png | Bin 0 -> 1845 bytes trunk/images/next.png | Bin 0 -> 1845 bytes trunk/images/ocarina.png | Bin 0 -> 2173 bytes trunk/images/pause.png | Bin 0 -> 894 bytes trunk/images/play.png | Bin 0 -> 1546 bytes trunk/library.py | 15 +-- trunk/ocarina.py | 144 ++++++++++++++++++-------- trunk/playlist.py | 5 +- trunk/song.py | 15 +-- 17 files changed, 120 insertions(+), 59 deletions(-) create mode 100644 trunk/images/media-eject.png create mode 100644 trunk/images/media-playback-pause.png create mode 100644 trunk/images/media-playback-start.png create mode 100644 trunk/images/media-playback-stop.png create mode 100644 trunk/images/media-record.png create mode 100644 trunk/images/media-seek-backward.png create mode 100644 trunk/images/media-seek-forward.png create mode 100644 trunk/images/media-skip-backward.png create mode 100644 trunk/images/media-skip-forward.png create mode 100644 trunk/images/next.png create mode 100644 trunk/images/ocarina.png create mode 100644 trunk/images/pause.png create mode 100644 trunk/images/play.png diff --git a/trunk/images/media-eject.png b/trunk/images/media-eject.png new file mode 100644 index 0000000000000000000000000000000000000000..609f7cc19029b03a91be09614e21ba48160275f4 GIT binary patch literal 1161 zcmV;41a|w0P)}J;8@h~ktg;1Nw?+1OC2Rq+<^WHbJ z^9=yI*u{StRx4$My0wC(J87NHXfzs)MpG$K6h()_<0+TRWkpdGI*xItR)U=sZnFi0 z!C){L4i5|r4knZH^Mn9ENUgTEwzl@`*YI$qQmIrbpFh)hUGGi-w+)u1ymxOlE6d~K zZ{NOq_x}Cj;_u%tUc7wy{5i&F&yJ6uIWsp$VjrKODALmX?;5K70rU5wcn#{Qmvhx36DUR=#|p^BawSUGfbG zLMoL?9Xd2RdgV$kcj=OJ6QU@!TD3~Z`g*-yt5IHGCuC}BdRmt2^=LF6k4BFl zr+Mu5e=Hm!zu)io`x6OSo}8SR`0=AuDwTfzBt+AiO-&=DT2+*Cd5bZ|7-K>Tg+k%u zN7Iz$3m49vTVAGl!eN@%vh5SG%?S(>i^XEGnBRZo$kC&R58uBp%jeI_ax$4n96Xpv zuxzA_gnHLbVTYDI|W7Z*#V zQmIs`)jDni5Q&j*Ugb+disGu!I zh~p3ffZj>~3=R$qq*4&(^Z9%}f8YRw2(j#^Pm<*Ec)cqt#bU8oENa@04dimUTrOv~ zvn(>hl>9i>J_U_s9>Qy8Xi9{l+tA#?LP$(EiD}8PIfXn4_xm*s1 zreWM@3=OHOs;a8pe)Hz+?2Q|(6K@xWVHk!X2zEQqLwM|1C=?2XLd(l^v~}ZaYryOE zdc9r%L{St)@yU~Bv)ODmpFV9BzghXe1<&(5&tpvUZ1$JdXlp={BuSD4VQy}I{@JrP zZ)o$e*>+m-RxnM|G)=>poSc}Lnu^Ei*GlED4bUB6SwaXQq^IZM!v_x@J+fFJgplJp zZ{Xs^%a^C80dTwBZnwMrwc6Hz&*$^`d;pLQ+`4u9_Uvqifk6An zwgv=25CoxK9~;YNv)Q2`)5I9#?n&Q-)9G|No$a3(ZH3UfZ~jaU$HufS8!!xpVHk#~ z*SlS)UF_ojjz6p4k}xG#-vR&t03v!+SaefwW^{L9a%BJjc-kv3FW1Y=%Pvk%EJ)SM bFG>dhHrNJO5L3!r00000NkvXXu0mjfTumJk literal 0 HcmV?d00001 diff --git a/trunk/images/media-playback-pause.png b/trunk/images/media-playback-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..6be708ff727ce00ca620dabc5ac8731e80bee3bd GIT binary patch literal 894 zcmV-^1A+XBP)OH1oO6vtcm@LwKbK zMMQk0O>N2C#bHQI9Idyj3q6~GX3p=N|9?&=L1-DvSjK-H`1{A62dicM4*T)~>tFzD z7{aP)zvDbV!}|Cr+CfAQBuSDa$uQdOPG@to*OO&gmgTiI(SCUT@zLvDU*FuUug7s5 z$MIkQ998Xfwzk^s+gpq=#@H}KoKi_uOQol$i;MH~Zg*pYF~%7C2LY<8s;bHuG!TZD zm)-8w6>l`Z|Mc|i?Bs;fa=BbCmoWwbDTfe32r&%K5yjEb@$uoIZS%Y+ilQhI?-vTt zG)>dAB+34Mf8X!l-64cA#t0$gd9E7-pM{r7jEOklC_?@I!^59HXnv6?7^v%?8-|hkx{>cWx~}U#3l|D7 zP17_@#(2ZL?esqY@N5%V;UFO224iS2PkD}LCV9#0;PolLX=WU zDL>yds?}<>T3tYZ=Xsvz%>tkRrMxf~@VT(#IL@qdzVG|KpC3ieA%u`ZA#a51x~}Uk zFhaFjtyZgX0AsuWcYgMTHe0w-sZ=VJv|-?UJwlYGqckfIV}ybr2!ddNTPO^}Fbwkm z%Q8*d76akvQ|IdSdc9uHJ89dt?KonNsQ%mnn$2dj*-R4nl<4>O_6`nqc1%;WA7(j8 zR##iCR%<%tzc(6>rc~e6vv;o>${^d&W?^_$5bkp%jI&rQIug09AFr=Iv!6Z(0H{R zl>&gGD9T^}fMNXpmKGfMcxalY?e=gu9G;(VZ+E%eZkMa1gk{&(VzGDc5{X12kwB1* zo!RgvkM6DPg~Pz*ufmC1-=It_pzq|<@`fZcAh+3g5&`0$}a zM~>h)MH!70RaFHg*WK-KI2_xy@%*PxtE+2k@883YqNrA@)oQiEXOrb02B2x0rfHMO zYPDJ|mcBj(fae8)=K;Vl6h%=0P!x&;Md3Yyz^Z04nM^tjfU>EptE;NEZ^y9KR)%S5 zA&7W9kw_%GUagiS38JmdY%VUgSY~G-NIY)0+wFF{EJL48!{hrq0K8tW*Xu1PP^$?7 z$4{PA0F(-&D2ifOF7dBDfaLP$(42^&ZU!;BvWKE|(-hf#gh)O3uSdD_#&_ zhtg>XDvF{giU3HGBuNqgJTC~TR4&eDvs!I709spHTMr)8XyCf_^#+5%pwn5cFpter zQso11yWMWLTauQRR#v`j9jr0{2%=ORR#d5MPDF~yvMd9D<2bHX1EAGvG&&sskw`Qe zi2yJ-7zhjwavaO9udl5=c~V+hQc_ZK_H0E(MMZV>n>TQcFL&J*0m{qE%gf6p>DjaA z&!0ZcRRF`_@tNBL8>OUxAP9n>C`=s30T2Y97X$#VU%zqV+BJ@Q`SR7Psi{cBWHK5} zrh$R3uFlS$p2v^jIA85(@Av!t{>4T3 zy)qPjzvTrW2!bGp&Civ}lcY|k*8{+^u~;kyz|hdp(ABFP7mY@vA3nTzv3KvDJ-c_G zIn&qI*Vo^l(=tr_=ZC$#0N(~vtF>AH#>Xcn#>Y7>7<}*`7+hYq*(?@|Wnf@<_~y-# zk;zFI9go9=e|%*4B>=Jvz{7`+9tDG!h(&L-Ga4vMkGT zaWT9@KmYM5QdnPy2`kg(A7~Ijt%m;Jw)0>6Df^f761SM literal 0 HcmV?d00001 diff --git a/trunk/images/media-playback-stop.png b/trunk/images/media-playback-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..1b2515e4d1e1b51150346072bd5f311ec9e8268b GIT binary patch literal 740 zcmV-)cxz;vo@U2oe#`-ZYC z%d)J4gY)x?i?g%4JB%?Vq%2KSR!T~x>iXf~{{Hdt^t5T3rfIhC@0~!N=XsthrHK!R zH#gVUx3>U{F~*p=1V*Fr`0{c%^nKs=eJPD45QbqGhU-1~@>17NPXIzlDP`+NX!kwo z?l?LsisR#Uon={;WlB|5RaKRN1d=34lB7$qC5ljMO(BY+D2mq4TLtbLFplFmj(5Kb zrm#)%RrFTC^E}V&1LSH1fpTWGfe-yCG^QA-6l=X@{#5JCtc)(J|vN?gh=aVfQb6~-^|Y6~r)2U}Zt zDV0K~TiKSlUSZrNjS@0_>C z9{(Ob0rxXR8&(GAIRF3vB6?I2D?NY%?PN(TTo W*alb-Q_5Tb0000xz?tSl$kC%t4lC}~6 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 E3ohRZmH+?% literal 0 HcmV?d00001 diff --git a/trunk/images/media-skip-forward.png b/trunk/images/media-skip-forward.png new file mode 100644 index 0000000000000000000000000000000000000000..e13146f0348f0728598ed8b0c670d230ce4eec9b GIT binary patch literal 1845 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 literal 0 HcmV?d00001 diff --git a/trunk/images/pause.png b/trunk/images/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..6be708ff727ce00ca620dabc5ac8731e80bee3bd GIT binary patch literal 894 zcmV-^1A+XBP)OH1oO6vtcm@LwKbK zMMQk0O>N2C#bHQI9Idyj3q6~GX3p=N|9?&=L1-DvSjK-H`1{A62dicM4*T)~>tFzD z7{aP)zvDbV!}|Cr+CfAQBuSDa$uQdOPG@to*OO&gmgTiI(SCUT@zLvDU*FuUug7s5 z$MIkQ998Xfwzk^s+gpq=#@H}KoKi_uOQol$i;MH~Zg*pYF~%7C2LY<8s;bHuG!TZD zm)-8w6>l`Z|Mc|i?Bs;fa=BbCmoWwbDTfe32r&%K5yjEb@$uoIZS%Y+ilQhI?-vTt zG)>dAB+34Mf8X!l-64cA#t0$gd9E7-pM{r7jEOklC_?@I!^59HXnv6?7^v%?8-|hkx{>cWx~}U#3l|D7 zP17_@#(2ZL?esqY@N5%V;UFO224iS2PkD}LCV9#0;PolLX=WU zDL>yds?}<>T3tYZ=Xsvz%>tkRrMxf~@VT(#IL@qdzVG|KpC3ieA%u`ZA#a51x~}Uk zFhaFjtyZgX0AsuWcYgMTHe0w-sZ=VJv|-?UJwlYGqckfIV}ybr2!ddNTPO^}Fbwkm z%Q8*d76akvQ|IdSdc9uHJ89dt?KonNsQ%mnn$2dj*-R4nl<4>O_6`nqc1%;WA7(j8 zR##iCR%<%tzc(6>rc~e6vv;o>${^d&W?^_$5bkp%jI&rQIug09AFr=Iv!6Z(0H{R zl>&gGD9T^}fMNXpmKGfMcxalY?e=gu9G;(VZ+E%eZkMa1gk{&(VzGDc5{X12kwB1* zo!RgvkM6DPg~Pz*ufmC1-=It_pzq|<@`fZcAh+3g5&`0$}a zM~>h)MH!70RaFHg*WK-KI2_xy@%*PxtE+2k@883YqNrA@)oQiEXOrb02B2x0rfHMO zYPDJ|mcBj(fae8)=K;Vl6h%=0P!x&;Md3Yyz^Z04nM^tjfU>EptE;NEZ^y9KR)%S5 zA&7W9kw_%GUagiS38JmdY%VUgSY~G-NIY)0+wFF{EJL48!{hrq0K8tW*Xu1PP^$?7 z$4{PA0F(-&D2ifOF7dBDfaLP$(42^&ZU!;BvWKE|(-hf#gh)O3uSdD_#&_ zhtg>XDvF{giU3HGBuNqgJTC~TR4&eDvs!I709spHTMr)8XyCf_^#+5%pwn5cFpter zQso11yWMWLTauQRR#v`j9jr0{2%=ORR#d5MPDF~yvMd9D<2bHX1EAGvG&&sskw`Qe zi2yJ-7zhjwavaO9udl5=c~V+hQc_ZK_H0E(MMZV>n>TQcFL&J*0m{qE%gf6p>DjaA z&!0ZcRRF`_@tNBL8>OUxAP9n>C`=s30T2Y97X$#VU%zqV+BJ@Q`SR7Psi{cBWHK5} zrh$R3uFlS$p2v^jIA85(@Av!t{>4T3 zy)qPjzvTrW2!bGp&Civ}lcY|k*8{+^u~;kyz|hdp(ABFP7mY@vA3nTzv3KvDJ-c_G zIn&qI*Vo^l(=tr_=ZC$#0N(~vtF>AH#>Xcn#>Y7>7<}*`7+hYq*(?@|Wnf@<_~y-# zk;zFI9go9=e|%*4B>=Jvz{7`+9tDG!h(&L-Ga4vMkGT zaWT9@KmYM5QdnPy2`kg(A7~Ijt%m;Jw)0>6Df^f761SM literal 0 HcmV?d00001 diff --git a/trunk/library.py b/trunk/library.py index fdd33119..e1366883 100644 --- a/trunk/library.py +++ b/trunk/library.py @@ -6,9 +6,9 @@ from songInfo import SongInfo class Library(): - def __init__(self,prnt): - #def __init__(self): - self.prnt = prnt + #def __init__(self,prnt): + def __init__(self): + #self.prnt = prnt self.data = LibData() self.goodTypes = ["ogg","mp3","wma"] # Build up directory if library save @@ -17,7 +17,8 @@ class Library(): self.save = os.path.join(self.save,"library.pickle") # Load existing library if os.path.exists(self.save): - self.prnt(["Library found, loading..."]) + #self.prnt(["Library found, loading..."]) + print "Library found, loading..." p = pickle.Unpickler(open(self.save)) self.data = p.load() @@ -27,12 +28,14 @@ class Library(): self.data = LibData() self.data.path = os.path.expanduser(dir) if os.path.exists(self.data.path) == False: - self.prnt(["Directory not found: "+dir]) + #self.prnt(["Directory not found: "+dir]) + print "Directory not found: %s" % dir return self.prnt(["Scanning: "+self.data.path]) self.traverse("") num = len(self.data.files) - self.prnt(["Found "+str(num)+" files!"]) + #self.prnt(["Found "+str(num)+" files!"]) + print "Found %s files!" % str(num) self.dump() diff --git a/trunk/ocarina.py b/trunk/ocarina.py index c2de5a2b..f8fb87da 100644 --- a/trunk/ocarina.py +++ b/trunk/ocarina.py @@ -3,24 +3,25 @@ import os import sys import thread +import pygtk +pygtk.require('2.0') +import gtk + from song import Song -from cline import CLine from duration import Duration from library import Library from playlist import Playlist from songInfo import SongInfo -#import cmnds + +#gtk.gdk.threads_init() +gobject.threads_init() class main: def __init__(self,argv): - #if len(argv) == 0: - # print "python ocarina.py /path/to/song/" - # return - self.commands = CLine() - self.registerCmnds() + self.makeWindow() - self.library = Library(self.commands.printLines) - self.plist = Playlist(self.commands.printLines) + self.library = Library() + self.plist = Playlist() self.plist.insert(self.library.nonBanned()) self.song = None @@ -37,43 +38,88 @@ class main: if os.path.exists(file): info = SongInfo() info.filename = file - self.song = Song(info,self.next,self.commands.printLines) - self.next("") + self.song = Song(info,self.next)#,self.commands.printLines) + self.next("","") - # Start main loop as a thread so we can get bus calls and use command line - gobject.threads_init() - mainloop = gobject.MainLoop() - thread.start_new_thread(mainloop.run,()) + #gobject.idle_add(self.markProgress,self.pbar,"progress") - # Register commands for use in command line - def registerCmnds(self): - self.commands.register("quit",self.quit,"Exit ocarina") - self.commands.register("exit",self.quit,"Exit ocarina") - self.commands.register("play",self.play,"Play current song") - self.commands.register("pause",self.pause,"Pause current song") - self.commands.register("time",self.time,"Display running time") - self.commands.register("info",self.info,"Display detailed info about current song") - self.commands.register("this",self.this,"Display basic info about current song") - self.commands.register("lib",self.scanLib,"Create a library based on the directory passed in") - self.commands.register("next",self.next,"Advance to the next song") - self.commands.register("random",self.random,"Toggle shuffle") + # Call gtk main + gtk.main() - # Quit program - def quit(self,unused): - self.commands.quit() - self.library.dump() + + # Make the main window + def makeWindow(self): + # Make window + self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.window.set_title("Ocarina") + self.window.connect("delete_event",self.delete_event) + self.window.set_border_width(0) + self.window.set_icon_from_file("images/ocarina.png") + # Make a control box for buttons + self.control = gtk.HBox(False,0) + self.window.add(self.control) + # Make buttons + self.playButton = self.makeButton("playButton","images/play.png",None,self.play) + self.pauseButton = self.makeButton("pauseButton","images/pause.png",None,self.pause) + self.nextButton = self.makeButton("nextButton","images/next.png",None,self.next) + self.thisButton = self.makeButton("thisButton",None,"This",self.this) + self.infoButton = self.makeButton("infoButton",None,"Info",self.info) + # Add buttons to window + self.control.pack_start(self.playButton,False,False,3) + self.control.pack_start(self.pauseButton,False,False,3) + self.control.pack_start(self.nextButton,False,False,3) + self.control.pack_start(self.thisButton,False,False,3) + self.control.pack_start(self.infoButton,False,False,3) + + self.pbar = gtk.ProgressBar() + self.pbar.set_fraction(0) + self.pbar.show() + # Update the progress bar every 100 ms + gobject.timeout_add(100,self.markProgress,self.pbar,"progress") + self.control.pack_start(self.pbar,False,False,3) + + self.control.show() + self.window.show() + + # Called before exiting + def delete_event(self,widget,event,data=None): print "Quitting..." - sys.exit(0) + self.library.dump() + gtk.main_quit() + return False + + + # Use this to make a button + # Give the name, image path, text, and callback function + def makeButton(self,name,path,text,func): + button = gtk.Button() + box = gtk.HBox(False,0) + box.set_border_width(1) + if path != None: + image = gtk.Image() + image.set_from_file(path) + image.show() + box.pack_start(image,False,False,0) + if text != None: + label = gtk.Label(text) + label.show() + box.pack_start(label,False,False,0) + box.show() + button.add(box) + button.connect("clicked",func,name) + button.show() + return button + # Begin playback - def play(self,unused): - if self.song == None: + def play(self,widget,data): + if self.song == None: return self.song.play() # Pause music - def pause(self,unused): + def pause(self,widget,data): if self.song == None: return self.song.pause() @@ -87,48 +133,49 @@ class main: self.commands.printLine(cur.toStr()+" / "+tot.toStr()) # Show detailed song info - def info(self,unused): + def info(self,widget,data): # Return if no song found if self.song == None: return # Return if no tags found if self.song.info.tags == None: - self.commands.printLine("Could not find any tags") + print "Could not find any tags" return for tag in self.song.info.tags.keys(): - self.commands.printLine(tag+": "+str(self.song.info.tags[tag])) - self.commands.printLine(self.song.info.filename) + print tag+":",self.song.info.tags[tag] + print self.song.info.filename # Show basic song info - def this(self,unused): + #def this(self,unused): + def this(self,widget,data): # Return if no song found if self.song == None: return # Return if no tags found if self.song.info.tags == None: - self.commands.printLine("Could not find any tags") + print "Could not find any tags" return fields = ["title","artist","track-number","track-count","album"] for field in fields: if (field in self.song.info.tags.keys()) == True: - self.commands.printLine(field+": "+str(self.song.info.tags[field])) + print field+":",self.song.info.tags[field] def scanLib(self,dir): if dir == "": - self.commands.printLine("Please include a library directory") + print "Please include a library directory" return self.library.scan(dir) - def next(self,unused): + def next(self,widget,data): if self.song != None: self.song.close() index = self.plist.next() if index > -1: self.song = None info = self.library.data.files[index] - self.song = Song(info,self.next,self.commands.printLines) + self.song = Song(info,self.next)#self.commands.printLines) if index > -2: self.song.play() @@ -136,4 +183,11 @@ class main: def random(self,unused): self.plist.random = not self.plist.random + + def markProgress(self,widget,data): + self.song.curTime() + self.pbar.set_fraction(float(self.song.current)/float(self.song.total)) + #print float(self.song.current)/float(self.song.total) + return True + if __name__=='__main__':main(sys.argv[1:]) diff --git a/trunk/playlist.py b/trunk/playlist.py index 15a99631..2ce67f8a 100644 --- a/trunk/playlist.py +++ b/trunk/playlist.py @@ -2,8 +2,9 @@ import Queue import random class Playlist: - def __init__(self,prnt): - self.prnt = prnt + #def __init__(self,prnt): + def __init__(self): + #self.prnt = prnt self.list = [] self.queue = Queue.Queue() self.curSong = 0 diff --git a/trunk/song.py b/trunk/song.py index 27fa4e14..0f901b35 100644 --- a/trunk/song.py +++ b/trunk/song.py @@ -7,9 +7,10 @@ import gst from duration import Duration class Song(): - def __init__(self,info,exitFunc,prnt): + #def __init__(self,info,exitFunc,prnt): + def __init__(self,info,exitFunc): self.quit=exitFunc - self.prnt=prnt + #self.prnt=prnt self.info = info # initialize player pipeline self.player = gst.Pipeline("player") @@ -38,12 +39,12 @@ class Song(): #print "End of stream" #self.prnt(["End of stream"]) if self.quit != None: - self.quit("") + self.quit("","") elif t == gst.MESSAGE_ERROR: err, debug = message.parse_error() - if self.prnt != None: - self.prnt(["Error: "+ str(err) + " " +str(debug)]) - #print "Error: %s" % err, debug + #if self.prnt != None: + # self.prnt(["Error: "+ str(err) + " " +str(debug)]) + print "Error: %s" % err, debug #if self.quit != None: # self.quit("") elif t == gst.MESSAGE_TAG: @@ -74,6 +75,7 @@ class Song(): def duration(self): self.info.length = Duration() length = self.player.query_duration(self.time_format,None)[0] + self.total = length self.info.length.setTime(length) #self.length.disp(self.prnt) @@ -81,6 +83,7 @@ class Song(): # Print out current running time def curTime(self): length = self.player.query_position(self.time_format,None)[0] + self.current = length dur = Duration() dur.setTime(length) return dur