From 850501430d786d58e60bcbb28ea4c4f17a040883 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Sat, 8 Mar 2014 03:05:01 +0200 Subject: [PATCH 1/5] Don't create new socket for every MPD query --- i3pystatus/mpd.py | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/i3pystatus/mpd.py b/i3pystatus/mpd.py index 78a1ac8..82d8b73 100644 --- a/i3pystatus/mpd.py +++ b/i3pystatus/mpd.py @@ -41,6 +41,8 @@ class MPD(IntervalModule): host = "localhost" port = 6600 + s = socket.create_connection((host, port)) + s.recv(8192) format = "{title} {status}" format_sparse = None status = { @@ -65,33 +67,29 @@ class MPD(IntervalModule): self.format_sparse = self.format def run(self): - with socket.create_connection((self.host, self.port)) as s: - # Skip "OK MPD ..." - s.recv(8192) + fdict = {} - fdict = {} + status = self._mpd_command(self.s, "status") + currentsong = self._mpd_command(self.s, "currentsong") - status = self._mpd_command(s, "status") - currentsong = self._mpd_command(s, "currentsong") + fdict = { + "pos": int(status.get("song", 0)) + 1, + "len": int(status["playlistlength"]), + "status": self.status[status["state"]], + "volume": int(status["volume"]), - fdict = { - "pos": int(status.get("song", 0)) + 1, - "len": int(status["playlistlength"]), - "status": self.status[status["state"]], - "volume": int(status["volume"]), + "title": currentsong.get("Title", ""), + "album": currentsong.get("Album", ""), + "artist": currentsong.get("Artist", ""), + "song_length": TimeWrapper(currentsong.get("Time", 0)), + "song_elapsed": TimeWrapper(float(status.get("elapsed", 0))), + "bitrate": int(status.get("bitrate", 0)), - "title": currentsong.get("Title", ""), - "album": currentsong.get("Album", ""), - "artist": currentsong.get("Artist", ""), - "song_length": TimeWrapper(currentsong.get("Time", 0)), - "song_elapsed": TimeWrapper(float(status.get("elapsed", 0))), - "bitrate": int(status.get("bitrate", 0)), + } - } - - self.output = { - "full_text": formatp(self.format, **fdict).strip(), - } + self.output = { + "full_text": formatp(self.format, **fdict).strip(), + } def on_leftclick(self): with socket.create_connection(("localhost", self.port)) as s: From 380efde0890556760ff9160ca5200c5850293612 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Sat, 8 Mar 2014 04:59:08 +0200 Subject: [PATCH 2/5] Handle MPD connection errors --- i3pystatus/mpd.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/i3pystatus/mpd.py b/i3pystatus/mpd.py index 82d8b73..4f2a6f8 100644 --- a/i3pystatus/mpd.py +++ b/i3pystatus/mpd.py @@ -41,8 +41,11 @@ class MPD(IntervalModule): host = "localhost" port = 6600 - s = socket.create_connection((host, port)) - s.recv(8192) + try: + s = socket.create_connection((host, port)) + s.recv(8192) + except Exception as e: + s = None format = "{title} {status}" format_sparse = None status = { @@ -54,7 +57,13 @@ class MPD(IntervalModule): vol = 100 def _mpd_command(self, sock, command): - sock.send((command + "\n").encode("utf-8")) + try: + sock.send((command + "\n").encode("utf-8")) + except Exception as e: + self.s = socket.create_connection((self.host, self.port)) + sock = self.s + sock.recv(8192) + sock.send((command + "\n").encode("utf-8")) reply = sock.recv(16384).decode("utf-8") replylines = reply.split("\n")[:-2] @@ -69,8 +78,12 @@ class MPD(IntervalModule): def run(self): fdict = {} - status = self._mpd_command(self.s, "status") - currentsong = self._mpd_command(self.s, "currentsong") + try: + status = self._mpd_command(self.s, "status") + currentsong = self._mpd_command(self.s, "currentsong") + except Exception as e: + self.output = {"full_text": "error connecting MPD"} + return fdict = { "pos": int(status.get("song", 0)) + 1, From e525d4fa28fd5160b374effd92ae5260c63dd5a6 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Sat, 8 Mar 2014 05:53:52 +0200 Subject: [PATCH 3/5] Better put fdict construction inside try --- i3pystatus/mpd.py | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/i3pystatus/mpd.py b/i3pystatus/mpd.py index 4f2a6f8..4a824be 100644 --- a/i3pystatus/mpd.py +++ b/i3pystatus/mpd.py @@ -81,28 +81,25 @@ class MPD(IntervalModule): try: status = self._mpd_command(self.s, "status") currentsong = self._mpd_command(self.s, "currentsong") + fdict = { + "pos": int(status.get("song", 0)) + 1, + "len": int(status["playlistlength"]), + "status": self.status[status["state"]], + "volume": int(status["volume"]), + + "title": currentsong.get("Title", ""), + "album": currentsong.get("Album", ""), + "artist": currentsong.get("Artist", ""), + "song_length": TimeWrapper(currentsong.get("Time", 0)), + "song_elapsed": TimeWrapper(float(status.get("elapsed", 0))), + "bitrate": int(status.get("bitrate", 0)), + + } + self.output = { + "full_text": formatp(self.format, **fdict).strip(), + } except Exception as e: self.output = {"full_text": "error connecting MPD"} - return - - fdict = { - "pos": int(status.get("song", 0)) + 1, - "len": int(status["playlistlength"]), - "status": self.status[status["state"]], - "volume": int(status["volume"]), - - "title": currentsong.get("Title", ""), - "album": currentsong.get("Album", ""), - "artist": currentsong.get("Artist", ""), - "song_length": TimeWrapper(currentsong.get("Time", 0)), - "song_elapsed": TimeWrapper(float(status.get("elapsed", 0))), - "bitrate": int(status.get("bitrate", 0)), - - } - - self.output = { - "full_text": formatp(self.format, **fdict).strip(), - } def on_leftclick(self): with socket.create_connection(("localhost", self.port)) as s: From 56822a3cec1c72954ca838cf187f5095923c9875 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Sat, 8 Mar 2014 17:49:45 +0200 Subject: [PATCH 4/5] Clean unused code and fix clicks --- i3pystatus/mpd.py | 43 ++++++++++++++++++++----------------------- i3pystatus/test.py | 6 ++++++ 2 files changed, 26 insertions(+), 23 deletions(-) create mode 100644 i3pystatus/test.py diff --git a/i3pystatus/mpd.py b/i3pystatus/mpd.py index 4a824be..7b7393c 100644 --- a/i3pystatus/mpd.py +++ b/i3pystatus/mpd.py @@ -41,11 +41,7 @@ class MPD(IntervalModule): host = "localhost" port = 6600 - try: - s = socket.create_connection((host, port)) - s.recv(8192) - except Exception as e: - s = None + s = None format = "{title} {status}" format_sparse = None status = { @@ -64,20 +60,21 @@ class MPD(IntervalModule): sock = self.s sock.recv(8192) sock.send((command + "\n").encode("utf-8")) - reply = sock.recv(16384).decode("utf-8") - replylines = reply.split("\n")[:-2] + try: + reply = sock.recv(16384).decode("utf-8") + replylines = reply.split("\n")[:-2] - return dict( - (line.split(": ", 1)[0], line.split(": ", 1)[1]) for line in replylines - ) + return dict( + (line.split(": ", 1)) for line in replylines + ) + except Exception as e: + return None def init(self): if not self.format_sparse: self.format_sparse = self.format def run(self): - fdict = {} - try: status = self._mpd_command(self.s, "status") currentsong = self._mpd_command(self.s, "currentsong") @@ -102,19 +99,19 @@ class MPD(IntervalModule): self.output = {"full_text": "error connecting MPD"} def on_leftclick(self): - with socket.create_connection(("localhost", self.port)) as s: - s.recv(8192) - - self._mpd_command(s, "pause %i" % - (0 if self._mpd_command(s, "status")["state"] == "pause" else 1)) + try: + self._mpd_command(self.s, "pause %i" % + (0 if self._mpd_command(self.s, "status")["state"] == "pause" else 1)) + except Exception as e: + pass def on_rightclick(self): - with socket.create_connection(("localhost", self.port)) as s: - s.recv(8192) - - vol = int(self._mpd_command(s, "status")["volume"]) + try: + vol = int(self._mpd_command(self.s, "status")["volume"]) if vol == 0: - self._mpd_command(s, "setvol %i" % self.vol) + self._mpd_command(self.s, "setvol %i" % self.vol) else: self.vol = vol - self._mpd_command(s, "setvol 0") + self._mpd_command(self.s, "setvol 0") + except Exception as e: + pass diff --git a/i3pystatus/test.py b/i3pystatus/test.py new file mode 100644 index 0000000..318a764 --- /dev/null +++ b/i3pystatus/test.py @@ -0,0 +1,6 @@ +from i3pystatus import Status +status = Status(standalone=True) +import mpd +status.register(mpd.MPD, format="[({song_elapsed}/{song_length})] [{artist} - ]{title} {status} ♪{volume}", status={"pause": "▷", "play": "▶", "stop": "◾",}) +status.run() + From 2889a61060ffb23f6fe766a9eb03ccd99e913f91 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Sat, 8 Mar 2014 17:56:17 +0200 Subject: [PATCH 5/5] test script removed --- i3pystatus/test.py | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 i3pystatus/test.py diff --git a/i3pystatus/test.py b/i3pystatus/test.py deleted file mode 100644 index 318a764..0000000 --- a/i3pystatus/test.py +++ /dev/null @@ -1,6 +0,0 @@ -from i3pystatus import Status -status = Status(standalone=True) -import mpd -status.register(mpd.MPD, format="[({song_elapsed}/{song_length})] [{artist} - ]{title} {status} ♪{volume}", status={"pause": "▷", "play": "▶", "stop": "◾",}) -status.run() -