mirror of
https://github.com/clockworkpi/launcher.git
synced 2025-12-12 17:58:50 +01:00
191 lines
5.1 KiB
Python
191 lines
5.1 KiB
Python
# -*- 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)
|
|
|
|
|