Control: tags -1 + patch
On Thu, Mar 14, 2013 at 06:22:37PM +0100, Helmut Grohne wrote:
> The lastmp package is using the python-libmpdclient (mpdclient2) module.
> This library has been abandoned upstream[1] in favour of python-mpd.
> Would it be possible to switch this tool over to the other library?
I attached a patch for this. Note that this patch is based on the
library documentation and completely untested (due to the lack of a
last.fm account). Could anyone test the patch and report back a result
to me and this bug?
The patch applies to the lastmp python script and you will have to
install python-mpd to make it work.
Thanks
Helmut
--- lastmp 2010-04-19 03:41:31.0 +0200
+++ lastmp.new 2013-03-15 09:48:42.0 +0100
@@ -5,8 +5,9 @@
import time
import getopt
import signal
+import socket
-import mpdclient2
+import mpd
import lastfm
import lastfm.client
import lastfm.config
@@ -26,11 +27,11 @@
class Song:
def __init__(self, sobj):
-self.artist = getattr(sobj, 'artist', '')
-self.title = getattr(sobj, 'title', '')
-self.album = getattr(sobj, 'album', '')
-self.length = int(getattr(sobj, 'time', 0))
-self.file = getattr(sobj, 'file', '')
+self.artist = sobj.get('artist', '')
+self.title = sobj.get('title', '')
+self.album = sobj.get('album', '')
+self.length = int(sobj.get('time', 0))
+self.file = sobj.get('file', '')
def __eq__(self, other):
if other == None:
@@ -64,6 +65,13 @@
else:
return d
+def mpd_connect(mpd_args):
+mpd = mpd.MPDClient()
+mpd.connect(mpd_args["host"], mpd_args["port"])
+if mpd_args["password"]:
+mpd.password(mpd_args["password"])
+return mpd
+
class MPDMonitor:
def __init__(self, cli):
self.cli = cli
@@ -74,25 +82,25 @@
self.mpd = None
def wake(self):
-status = self.mpd.do.status()
-song = Song(self.mpd.do.currentsong())
+status = self.mpd.status()
+song = Song(self.mpd.currentsong())
-if not hasattr(status, 'state'):
+if 'state' not in status:
raise MPDAuthError
-if not self.prevstatus or status.state != self.prevstatus.state:
-self.cli.log.debug('Changed state: %s' % status.state)
+if not self.prevstatus or status["state"] != self.prevstatus["state"]:
+self.cli.log.debug('Changed state: %s' % status["state"])
-if status.state in ('play', 'pause'):
-pos, length = map(float, status.time.split(':'))
+if status["state"] in ('play', 'pause'):
+pos, length = map(float, status["time"].split(':'))
if length == 0: length = lastfm.MAX_LEN
-if status.state == 'play':
+if status["state"] == 'play':
if song != self.prevsong or \
-self.prevstatus.state == 'stop':
+self.prevstatus["state"] == 'stop':
self.cli.log.info(u'New song: %s' % song)
if (self.prevsong and pos > self.sleep +
-FUZZ + int(status.xfade)) or \
+FUZZ + int(status["xfade"])) or \
(self.prevsong is None and
pos/length > lastfm.SUB_PERCENT or
pos > lastfm.SUB_SECONDS):
@@ -141,7 +149,7 @@
while True:
try:
if not self.mpd:
-self.mpd = mpdclient2.connect(**self.mpd_args)
+self.mpd = mpd_connect(self.mpd_args)
self.cli.log.info('Connected to MPD')
self.prevstatus = None
self.prevsong = None
@@ -151,12 +159,12 @@
self.played_enough = False
if self.mpd:
self.wake()
-except (EOFError, mpdclient2.socket.error):
+except (EOFError, socket.error):
if not failed:
self.cli.log.error("Can't connect or lost connection to MPD")
self.mpd = None
failed = True
-except MPDAuthError:
+except (MPDAuthError, mpd.CommandError):
if not failed:
self.cli.log.error("Can't read info from MPD (bad password?)")
failed = True