123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- # -*- coding: utf-8 -*-
- #
- from mpd import MPDClient, MPDError, CommandError
- import sys
- import os
- class PollerError(Exception):
- """Fatal error in poller."""
- class MPDPoller(object):
- _host="/tmp/mpd/socket"
- #_host = "localhost"
- _port="6600"
- _client= None
- def __init__(self, host, port="6600"):
- self._host = host
- self._port = port
- self._client = MPDClient(use_unicode=True)
- self._client.timeout = 60*60*1000
- def connect(self):
- try:
- self._client.connect(self._host, self._port)
- # Catch socket errors
- except IOError as err:
- errno, strerror = err
- raise PollerError("Could not connect to '%s': %s" %
- (self._host, strerror))
- # Catch all other possible errors
- except MPDError as e:
- raise PollerError("Could not connect to '%s': %s" %
- (self._host, e))
- def disconnect(self):
- # Try to tell MPD to close the connection first
- try:
- self._client.close()
- # If that fails, ignore it and disconnect
- except (MPDError, IOError):
- pass
- try:
- self._client.disconnect()
- # Disconnecting failed, setup a new client object instead
- # This should never happen. If it does, something is seriously broken,
- # and the client object shouldn't be trusted to be re-used.
- except (MPDError, IOError):
- self._client = MPDClient(use_unicode=True)
- self._client.timeout = 60*60*1000
-
- def general(self,func,*args):
- ret = None
- try:
- ret = func( *args )
- except CommandError:
- return False
- except (MPDError, IOError):
- print("first error")
- self.disconnect()
- try:
- self.connect()
- except PollerError as e:
- raise PollerError("Reconnecting failed: %s" % e)
- try:
- ret = func(*args)
- except (MPDError, IOError) as e:
- raise PollerError("Couldn't retrieve current song: %s" % e)
-
- return ret
-
- def ping(self):
- return self.general(self._client.ping)
-
- def poll(self):
- song = self.general( self._client.status )
- """
- while playing:
- {u'songid': u'4', u'playlistlength': u'4', u'playlist': u'7', u'repeat': u'0', u'consume': u'0', u'mixrampdb': u'0.000000', u'random': u'0', u'state': u'play', u'elapsed': u'148.758', u'volume': u'100', u'single': u'0', u'time': u'149:436', u'duration': u'435.670', u'song': u'3', u'audio': u'44100:24:2', u'bitrate': u'192'}
-
- """
- # print(song)
- return song
-
- def stop(self):
- self.general(self._client.stop)
-
- def addfile(self,url):
- self.general(self._client.add, url)
-
- def delete(self,posid):
- self.general(self._client.delete,posid)
-
- def play(self,posid):
- song = self.poll()
- if "song" in song:
- if int(song["song"]) != posid:
- self.general(self._client.play,posid)
- else:
- if "state" in song:
- if song["state"] == "play":
- self.general(self._client.pause)
- elif song["state"] == "pause":
- self.general(self._client.pause)
- elif song["state"] == "stop":
- self.general(self._client.play,posid)
- else:
- self.general(self._client.play,posid)
-
- self.general(self._client.setvol,100)
-
- return posid
-
- def playlist(self):
- lst = self.general(self._client.playlistinfo)
- return lst
- for i in lst:
- if "title" in i:
- print( i["title"] )
- elif "file" in i:
- print( os.path.basename( i["file"] ) )
-
- def listfiles(self,path):
- files = self.general(self._client.lsinfo,path)
- return files
- for i in sorted(files):
- if "directory" in i:
- print( "D %s" % i["directory"] )
- elif "file" in i:
- print(i["file"])
-
- def rootfiles(self):
- files = self.general(self._client.lsinfo, "/")
- return files
- for i in sorted(files):
- if "directory" in i:
- print( "D %s" % i["directory"] )
- elif "file" in i:
- print(i["file"])
-
- def main():
- from time import sleep
- poller = MPDPoller()
- poller.connect()
- while True:
- print("poll:")
- print( poller.poll() )
- """
- print("playlist:")
- print(poller.playlist())
- print("rootfiles:")
- poller.rootfiles()
- """
- sleep(120)
- if __name__ == "__main__":
- import sys
- try:
- main()
- except PollerError as e:
- print("Fatal poller error: %s" % e)
- sys.exit(1)
- except Exception as e:
- print("Unexpected exception: %s" % e)
- sys.exit(1)
- except:
- sys.exit(0)
|