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,info,exitFunc): self.quit=exitFunc #self.prnt=prnt self.info = info self.info.tags = dict() # 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: tags = message.parse_tag() for tag in tags.keys(): self.info.tags[tag] = tags[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) while self.duration() == False: time.sleep(0.1) # 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): 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)