import sys import time import pygst pygst.require("0.10") import gst from duration import Duration class Song(): #def __init__(self,info,exitFunc,prnt): def __init__(self,exitFunc): self.quit=exitFunc #self.prnt=prnt #self.info = info #self.info.tags = dict() #self.setInfo = None #self.getNext = None #self.current = 0 # initialize player pipeline self.next = None self.player = gst.Pipeline("player") self.bin = gst.element_factory_make("playbin",None) #bin.set_property("uri","file://"+self.info.filename) self.player.add(self.bin) # initialize bus bus = self.player.get_bus() bus.add_signal_watch() bus.connect("message",self.onMessage) # Pause song #self.pause() # Initialize stuff for finding duration self.time_format = gst.Format(gst.FORMAT_TIME) #self.length = None #self.taglist = None # Called on bus messages def onMessage(self,bus,message): t = message.type if t == gst.MESSAGE_EOS: #print "End of stream" #self.prnt(["End of stream"]) if self.quit != None: self.quit("","") elif t == gst.MESSAGE_ERROR: err, debug = message.parse_error() #if self.prnt != None: # self.prnt(["Error: "+ str(err) + " " +str(debug)]) self.close() print "Error: %s" % err, debug print "Trying next song" self.next() #self.getNext(None,None) #if self.quit != None: # self.quit("") #elif t == gst.MESSAGE_TAG: # tags = message.parse_tag() # for tag in tags.keys(): # self.info.tags[tag] = tags[tag] # if tag=="title": # self.info.title = tags[tag] # elif tag=="album": # self.info.album = tags[tag] # elif tag=="artist": # self.info.artist = tags[tag] # self.setInfo(tags) #self.taglist = message.parse_tag() # return # Change state to "playing" def play(self,widgit,data): self.player.set_state(gst.STATE_PLAYING) # Start main loop and find duration (if this hasn't been done yet) #while self.duration() == False: # time.sleep(0.1) # Change state to "paused" def pause(self,widgit,data): self.player.set_state(gst.STATE_PAUSED) # Stop playback def stop(self): self.player.set_state(gst.STATE_PAUSED) self.current = 0 self.player.seek_simple(self.time_format,gst.SEEK_FLAG_FLUSH,self.current) # Close the song def close(self): self.player.set_state(gst.STATE_NULL) # Find the duration of the pipeline #def duration(self): # try: # self.info.length = Duration() # length = self.player.query_duration(self.time_format,None)[0] # self.total = length # self.info.length.setTime(length) # return True #except: # return False #self.length.disp(self.prnt) # Print out current running time def curTime(self): try: length = self.player.query_position(self.time_format,None)[0] self.current = length dur = Duration() dur.setTime(length) return (True,dur) except: return (False,None) def passInfo(self,info): self.info = info self.bin.set_property("uri","file://"+self.info.filename)