def login(self):
     print "Please enter your GMail crendentials (the script doesn't store it)"
     self.userName = raw_input('Username: '******'Password: ')
         self.gChatHelper.connect(passwd)
         tries += 1
         if(tries > 3):
             print "Max retries encountered, exiting"
             sys.exit(1)
class MusicPlayerStatus:
    def __init__(self):
        self.DEBUG = 0       # debug flag
        self.supportedMediaPlayers = ["amarok", "banshee", "clementine", "guayadeque", "rhythmbox"] # Supported Media Players
        self.identity = None # player identity
        self.playerProxy = None
        self.playerProps = None
        self.player = None
        self.currTrackStr = None
        self.login()
    
    #Login
    def login(self):
        print "Please enter your GMail crendentials (the script doesn't store it)"
        self.userName = raw_input('Username: '******'Password: '******'\u266a' + ' ' + newStatus + ' ' + u'\u266a'
        self.debugLog('Setting new GMail Status to %s' % (newStatus))
        print newStatus
        self.gChatHelper.set_status(newStatus)

    # debug function 
    def debugLog(self, str):
        if(self.DEBUG):
            print str

    # debug dump function
    def debugDump(self, data):
        if(self.DEBUG):
            print json.dumps(data)

    # main
    def main(self):
        self.ConnectToBus()
        self.mainloop = glib.MainLoop()
        self.mainloop.run()

    # Connects to the Media Player we detected
    def Connect(self, name):
        self.debugLog("Connect to %s" % (name))
        #Cmd = dbus-monitor "type='signal',interface='org.freedesktop.DBus.Properties',path='/org/mpris/MediaPlayer2',member='PropertiesChanged'"
        self.playerProxy = self.bus.get_object(name, '/org/mpris/MediaPlayer2')
        self.playerProps = dbus.Interface(self.playerProxy, 'org.freedesktop.DBus.Properties')
        self.playerProps.connect_to_signal("PropertiesChanged", self.TrackChanged, dbus_interface="org.freedesktop.DBus.Properties")
        self.identity = name

        #Check if any song is being played
        playbackStatus = self.playerProps.Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus')
        if(playbackStatus == "Playing"):
            #Get current song metadata and call TrackChanged
            initMetadata = self.playerProps.Get('org.mpris.MediaPlayer2.Player', 'Metadata')
            initInterface = 'org.mpris.MediaPlayer2.Player'
            initData = {}
            initData['Metadata'] = initMetadata
            self.TrackChanged(initInterface, initData, [])

    # TrackChanged callback
    def TrackChanged(self, interface, data, sigArray):
        if 'Metadata' not in data:
            return

        #Debug metadata
        #self.debugDump(data) 

        metaData = data['Metadata']
        #Check that artist and title exist, else not return
        if 'xesam:artist' not in metaData or 'xesam:title' not in metaData:
            return

        #Compute newTrackStr
        newTrackStr = ""
        artist = ', '.join(metaData['xesam:artist'])
        title = metaData['xesam:title'] 
        if 'xesam:album' in metaData:
            album = metaData['xesam:album']
            newTrackStr = "%s - %s (%s)" % (title, artist, album)
        else:
            newTrackStr = "%s - %s" % (title, artist)

        #Check if newTrackStr is same as currTrackStr, if 'yes', ignore this signal
        if(newTrackStr != self.currTrackStr):
            self.currTrackStr = copy.deepcopy(newTrackStr)
            self.debugLog("Track Changed -> %s" % (self.currTrackStr))
            self.changeGoogleChatStatus(self.currTrackStr)
        else:
            self.debugLog("Track didn't change, duplicate signal")

    #NameOwnerChanged
    def NameOwnerChanged(self, name, new, old):
        if old != "" and "org.mpris." in name:
            self.Connect(name)

    # check if player is supported
    def isSupportedPlayer(self, playerName):
        for p in self.supportedMediaPlayers:
            if p in playerName:
                return True
        return False

    # connect to the bus
    def ConnectToBus(self):
        self.debugLog("ConnectToBus")
        DBusGMainLoop(set_as_default=True)

        self.bus = dbus.SessionBus()
        dbus_names = self.bus.get_object( "org.freedesktop.DBus", "/org/freedesktop/DBus" )
        dbus_names.connect_to_signal("NameOwnerChanged", self.NameOwnerChanged, dbus_interface="org.freedesktop.DBus") # to detect new Media Players

        dbus_o = self.bus.get_object("org.freedesktop.DBus", "/")
        dbus_intf = dbus.Interface(dbus_o, "org.freedesktop.DBus")
        name_list = dbus_intf.ListNames()

        # connect to the first Media Player found
        for playerName in name_list:
            if "org.mpris." in playerName:
                if self.isSupportedPlayer(playerName):
                    self.Connect(playerName)
                    break
                else:
                    self.debugLog("%s is not supported" % playerName)