import sys import time import pygst pygst.require("0.10") import gst from duration import Duration class Song(): def __init__(self,info,exitFunc,prnt): self.quit=exitFunc self.prnt=prnt self.info = info # initialize player pipeline self.player = gst.Pipeline("player") bin = gst.element_factory_make("playbin",None) bin.set_property("uri","file://"+self.info.filename) self.player.add(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)]) #print "Error: %s" % err, debug #if self.quit != None: # self.quit("") elif t == gst.MESSAGE_TAG: self.info.tags = message.parse_tag() #self.taglist = message.parse_tag() return # Change state to "playing" def play(self): self.player.set_state(gst.STATE_PLAYING) # Start main loop and find duration (if this hasn't been done yet) if self.info.length == None: time.sleep(0.5) self.duration() # Change state to "paused" def pause(self): self.player.set_state(gst.STATE_PAUSED) def close(self): self.player.set_state(gst.STATE_NULL) # Find the duration of the pipeline def duration(self): self.info.length = Duration() length = self.player.query_duration(self.time_format,None)[0] self.info.length.setTime(length) #self.length.disp(self.prnt) # Print out current running time def curTime(self): length = self.player.query_position(self.time_format,None)[0] dur = Duration() dur.setTime(length) return dur