Began using gtk for a gui

git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@11 1daee41c-8060-4895-b1f0-2197c00d777a
This commit is contained in:
bjschuma 2009-06-03 04:10:00 +00:00
parent ce60dbdc4f
commit cca44a7e98
17 changed files with 120 additions and 59 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
trunk/images/next.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
trunk/images/ocarina.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
trunk/images/pause.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

BIN
trunk/images/play.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -6,9 +6,9 @@ from songInfo import SongInfo
class Library(): class Library():
def __init__(self,prnt): #def __init__(self,prnt):
#def __init__(self): def __init__(self):
self.prnt = prnt #self.prnt = prnt
self.data = LibData() self.data = LibData()
self.goodTypes = ["ogg","mp3","wma"] self.goodTypes = ["ogg","mp3","wma"]
# Build up directory if library save # Build up directory if library save
@ -17,7 +17,8 @@ class Library():
self.save = os.path.join(self.save,"library.pickle") self.save = os.path.join(self.save,"library.pickle")
# Load existing library # Load existing library
if os.path.exists(self.save): 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)) p = pickle.Unpickler(open(self.save))
self.data = p.load() self.data = p.load()
@ -27,12 +28,14 @@ class Library():
self.data = LibData() self.data = LibData()
self.data.path = os.path.expanduser(dir) self.data.path = os.path.expanduser(dir)
if os.path.exists(self.data.path) == False: 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 return
self.prnt(["Scanning: "+self.data.path]) self.prnt(["Scanning: "+self.data.path])
self.traverse("") self.traverse("")
num = len(self.data.files) 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() self.dump()

View File

@ -3,24 +3,25 @@ import os
import sys import sys
import thread import thread
import pygtk
pygtk.require('2.0')
import gtk
from song import Song from song import Song
from cline import CLine
from duration import Duration from duration import Duration
from library import Library from library import Library
from playlist import Playlist from playlist import Playlist
from songInfo import SongInfo from songInfo import SongInfo
#import cmnds
#gtk.gdk.threads_init()
gobject.threads_init()
class main: class main:
def __init__(self,argv): def __init__(self,argv):
#if len(argv) == 0: self.makeWindow()
# print "python ocarina.py /path/to/song/"
# return
self.commands = CLine()
self.registerCmnds()
self.library = Library(self.commands.printLines) self.library = Library()
self.plist = Playlist(self.commands.printLines) self.plist = Playlist()
self.plist.insert(self.library.nonBanned()) self.plist.insert(self.library.nonBanned())
self.song = None self.song = None
@ -37,43 +38,88 @@ class main:
if os.path.exists(file): if os.path.exists(file):
info = SongInfo() info = SongInfo()
info.filename = file info.filename = file
self.song = Song(info,self.next,self.commands.printLines) self.song = Song(info,self.next)#,self.commands.printLines)
self.next("") self.next("","")
# Start main loop as a thread so we can get bus calls and use command line #gobject.idle_add(self.markProgress,self.pbar,"progress")
gobject.threads_init()
mainloop = gobject.MainLoop()
thread.start_new_thread(mainloop.run,())
# Register commands for use in command line # Call gtk main
def registerCmnds(self): gtk.main()
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")
# Quit program
def quit(self,unused): # Make the main window
self.commands.quit() def makeWindow(self):
self.library.dump() # 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..." 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 # Begin playback
def play(self,unused): def play(self,widget,data):
if self.song == None: if self.song == None:
return return
self.song.play() self.song.play()
# Pause music # Pause music
def pause(self,unused): def pause(self,widget,data):
if self.song == None: if self.song == None:
return return
self.song.pause() self.song.pause()
@ -87,48 +133,49 @@ class main:
self.commands.printLine(cur.toStr()+" / "+tot.toStr()) self.commands.printLine(cur.toStr()+" / "+tot.toStr())
# Show detailed song info # Show detailed song info
def info(self,unused): def info(self,widget,data):
# Return if no song found # Return if no song found
if self.song == None: if self.song == None:
return return
# Return if no tags found # Return if no tags found
if self.song.info.tags == None: if self.song.info.tags == None:
self.commands.printLine("Could not find any tags") print "Could not find any tags"
return return
for tag in self.song.info.tags.keys(): for tag in self.song.info.tags.keys():
self.commands.printLine(tag+": "+str(self.song.info.tags[tag])) print tag+":",self.song.info.tags[tag]
self.commands.printLine(self.song.info.filename) print self.song.info.filename
# Show basic song info # Show basic song info
def this(self,unused): #def this(self,unused):
def this(self,widget,data):
# Return if no song found # Return if no song found
if self.song == None: if self.song == None:
return return
# Return if no tags found # Return if no tags found
if self.song.info.tags == None: if self.song.info.tags == None:
self.commands.printLine("Could not find any tags") print "Could not find any tags"
return return
fields = ["title","artist","track-number","track-count","album"] fields = ["title","artist","track-number","track-count","album"]
for field in fields: for field in fields:
if (field in self.song.info.tags.keys()) == True: 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): def scanLib(self,dir):
if dir == "": if dir == "":
self.commands.printLine("Please include a library directory") print "Please include a library directory"
return return
self.library.scan(dir) self.library.scan(dir)
def next(self,unused): def next(self,widget,data):
if self.song != None: if self.song != None:
self.song.close() self.song.close()
index = self.plist.next() index = self.plist.next()
if index > -1: if index > -1:
self.song = None self.song = None
info = self.library.data.files[index] 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: if index > -2:
self.song.play() self.song.play()
@ -136,4 +183,11 @@ class main:
def random(self,unused): def random(self,unused):
self.plist.random = not self.plist.random 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:]) if __name__=='__main__':main(sys.argv[1:])

View File

@ -2,8 +2,9 @@ import Queue
import random import random
class Playlist: class Playlist:
def __init__(self,prnt): #def __init__(self,prnt):
self.prnt = prnt def __init__(self):
#self.prnt = prnt
self.list = [] self.list = []
self.queue = Queue.Queue() self.queue = Queue.Queue()
self.curSong = 0 self.curSong = 0

View File

@ -7,9 +7,10 @@ import gst
from duration import Duration from duration import Duration
class Song(): class Song():
def __init__(self,info,exitFunc,prnt): #def __init__(self,info,exitFunc,prnt):
def __init__(self,info,exitFunc):
self.quit=exitFunc self.quit=exitFunc
self.prnt=prnt #self.prnt=prnt
self.info = info self.info = info
# initialize player pipeline # initialize player pipeline
self.player = gst.Pipeline("player") self.player = gst.Pipeline("player")
@ -38,12 +39,12 @@ class Song():
#print "End of stream" #print "End of stream"
#self.prnt(["End of stream"]) #self.prnt(["End of stream"])
if self.quit != None: if self.quit != None:
self.quit("") self.quit("","")
elif t == gst.MESSAGE_ERROR: elif t == gst.MESSAGE_ERROR:
err, debug = message.parse_error() err, debug = message.parse_error()
if self.prnt != None: #if self.prnt != None:
self.prnt(["Error: "+ str(err) + " " +str(debug)]) # self.prnt(["Error: "+ str(err) + " " +str(debug)])
#print "Error: %s" % err, debug print "Error: %s" % err, debug
#if self.quit != None: #if self.quit != None:
# self.quit("") # self.quit("")
elif t == gst.MESSAGE_TAG: elif t == gst.MESSAGE_TAG:
@ -74,6 +75,7 @@ class Song():
def duration(self): def duration(self):
self.info.length = Duration() self.info.length = Duration()
length = self.player.query_duration(self.time_format,None)[0] length = self.player.query_duration(self.time_format,None)[0]
self.total = length
self.info.length.setTime(length) self.info.length.setTime(length)
#self.length.disp(self.prnt) #self.length.disp(self.prnt)
@ -81,6 +83,7 @@ class Song():
# Print out current running time # Print out current running time
def curTime(self): def curTime(self):
length = self.player.query_position(self.time_format,None)[0] length = self.player.query_position(self.time_format,None)[0]
self.current = length
dur = Duration() dur = Duration()
dur.setTime(length) dur.setTime(length)
return dur return dur