Merge lp:~parherman/dockmanager/spotify into lp:dockmanager

Proposed by Pär Eriksson
Status: Needs review
Proposed branch: lp:~parherman/dockmanager/spotify
Merge into: lp:dockmanager
Diff against target: 176 lines (+145/-0)
4 files modified
metadata/Makefile.am (+1/-0)
metadata/spotify_control.py.info (+6/-0)
scripts/Makefile.am (+1/-0)
scripts/spotify_control.py (+137/-0)
To merge this branch: bzr merge lp:~parherman/dockmanager/spotify
Reviewer Review Type Date Requested Status
Dockers Pending
Review via email: mp+47752@code.launchpad.net

Description of the change

I have written/hacked together a simple Spotify Helper (with much inspiration from banshee_control.py)

Right now it only supports Next/Previous and Play/Pause menu options, but i hope to extend it in the future..

Feel free to give me constructive criticism, as i have no idea what im doing!

To post a comment you must log in.
lp:~parherman/dockmanager/spotify updated
84. By Pär Eriksson <email address hidden>

a simple Spotify Helper

85. By Pär Eriksson <email address hidden>

updated Makefiles for spotify_control

Unmerged revisions

85. By Pär Eriksson <email address hidden>

updated Makefiles for spotify_control

84. By Pär Eriksson <email address hidden>

a simple Spotify Helper

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'metadata/Makefile.am'
2--- metadata/Makefile.am 2010-10-19 18:14:46 +0000
3+++ metadata/Makefile.am 2011-01-27 23:54:12 +0000
4@@ -13,6 +13,7 @@
5 pithos_control.py.info \
6 rhythmbox_control.py.info \
7 skype_control.py.info \
8+ spotify_control.py.info \
9 tomboy_menus.py.info \
10 transmission_badge.py.info \
11 tsclient_menus.py.info \
12
13=== added file 'metadata/spotify_control.py.info'
14--- metadata/spotify_control.py.info 1970-01-01 00:00:00 +0000
15+++ metadata/spotify_control.py.info 2011-01-27 23:54:12 +0000
16@@ -0,0 +1,6 @@
17+[DockmanagerHelper]
18+Name=Spotify Controls
19+Description=Control Spotify media playback
20+Icon=spotify-linux-512x512
21+AppName=spotify
22+DBusName=org.mpris.MediaPlayer2.spotify
23
24=== modified file 'scripts/Makefile.am'
25--- scripts/Makefile.am 2010-10-19 18:14:46 +0000
26+++ scripts/Makefile.am 2011-01-27 23:54:12 +0000
27@@ -13,6 +13,7 @@
28 pithos_control.py \
29 rhythmbox_control.py \
30 skype_control.py \
31+ spotify_control.py \
32 tomboy_menus.py \
33 transmission_badge.py \
34 tsclient_menus.py \
35
36=== added file 'scripts/spotify_control.py'
37--- scripts/spotify_control.py 1970-01-01 00:00:00 +0000
38+++ scripts/spotify_control.py 2011-01-27 23:54:12 +0000
39@@ -0,0 +1,137 @@
40+#!/usr/bin/env python
41+
42+#
43+# Copyright (C) 2010 Jason Smith, Rico Tzschichholz, Robert Dyer, Par Eriksson
44+#
45+# This program is free software: you can redistribute it and/or modify
46+# it under the terms of the GNU General Public License as published by
47+# the Free Software Foundation, either version 3 of the License, or
48+# (at your option) any later version.
49+#
50+# This program is distributed in the hope that it will be useful,
51+# but WITHOUT ANY WARRANTY; without even the implied warranty of
52+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53+# GNU General Public License for more details.
54+#
55+# You should have received a copy of the GNU General Public License
56+# along with this program. If not, see <http://www.gnu.org/licenses/>.
57+#
58+
59+import atexit
60+import gobject
61+import glib
62+import dbus
63+import dbus.glib
64+import sys
65+import os
66+
67+try:
68+ import gtk
69+ from dockmanager.dockmanager import DockManagerItem, DockManagerSink, DOCKITEM_IFACE
70+ from dockmanager.dockmanager import RESOURCESDIR
71+ from signal import signal, SIGTERM
72+ from sys import exit
73+except ImportError, e:
74+ print e
75+ exit()
76+
77+spotifybus = "org.mpris.MediaPlayer2.spotify"
78+playerpath = "/org/mpris/MediaPlayer2"
79+playeriface = "org.mpris.MediaPlayer2.Player"
80+playerproperties = "org.freedesktop.DBus.Properties"
81+
82+class SpotifyItem(DockManagerItem):
83+ def __init__(self, sink, path):
84+ DockManagerItem.__init__(self, sink, path)
85+ self.player = None
86+ self.properties = None
87+
88+ self.bus.add_signal_receiver(self.name_owner_changed_cb,
89+ dbus_interface='org.freedesktop.DBus',
90+ signal_name='NameOwnerChanged')
91+
92+ obj = self.bus.get_object ("org.freedesktop.DBus", "/org/freedesktop/DBus")
93+ self.bus_interface = dbus.Interface(obj, "org.freedesktop.DBus")
94+
95+ self.bus_interface.ListNames (reply_handler=self.list_names_handler, error_handler=self.list_names_error_handler)
96+
97+ def list_names_handler(self, names):
98+ if spotifybus in names:
99+ self.init_spotify_objects()
100+ self.set_menu_buttons()
101+
102+ def list_names_error_handler(self, error):
103+ print "error getting bus names - %s" % str(error)
104+
105+ def name_owner_changed_cb(self, name, old_owner, new_owner):
106+ if name == spotifybus:
107+ if new_owner:
108+ self.init_spotify_objects()
109+ self.set_menu_buttons()
110+ else:
111+ self.player = None
112+ self.properties = None
113+ self.set_menu_buttons()
114+
115+ def init_spotify_objects(self):
116+ obj = self.bus.get_object(spotifybus, playerpath)
117+ self.player = dbus.Interface(obj, playeriface)
118+ obj = self.bus.get_object(spotifybus, playerpath)
119+ self.properties = dbus.Interface(obj, playerproperties)
120+
121+ def menu_pressed(self, menu_id):
122+ if not self.player:
123+ return False
124+
125+ if self.id_map[menu_id] == "Play":
126+ self.player.PlayPause()
127+ elif self.id_map[menu_id] == "Pause":
128+ self.player.PlayPause()
129+ elif self.id_map[menu_id] == "Next":
130+ self.player.Next()
131+ elif self.id_map[menu_id] == "Previous":
132+ self.player.Previous()
133+ self.set_menu_buttons()
134+
135+ def spotify_is_playing(self):
136+ if self.properties:
137+ try:
138+ return self.properties.Get("org.mpris.MediaPlayer2.Player", "PlaybackStatus") == "Playing"
139+ except dbus.DBusException, e:
140+ return False
141+ return False
142+
143+ def clear_menu_buttons(self):
144+ for k in self.id_map.keys():
145+ self.remove_menu_item(k)
146+
147+ def set_menu_buttons(self):
148+ self.clear_menu_buttons()
149+
150+ if not self.player:
151+ return
152+
153+ self.add_menu_item("Previous", "media-skip-backward")
154+ if self.spotify_is_playing():
155+ self.add_menu_item("Pause", "media-playback-pause")
156+ else:
157+ self.add_menu_item("Play", "media-playback-start")
158+ self.add_menu_item("Next", "media-skip-forward")
159+
160+class SpotifySink(DockManagerSink):
161+ def item_path_found(self, pathtoitem, item):
162+ if item.Get(DOCKITEM_IFACE, "DesktopFile", dbus_interface="org.freedesktop.DBus.Properties").endswith ("spotify.desktop"):
163+ self.items[pathtoitem] = SpotifyItem(self, pathtoitem)
164+
165+spotifysink = SpotifySink()
166+
167+def cleanup ():
168+ spotifysink.dispose ()
169+
170+if __name__ == "__main__":
171+ mainloop = gobject.MainLoop(is_running=True)
172+
173+ atexit.register (cleanup)
174+ signal(SIGTERM, lambda signum, stack_frame: exit(1))
175+
176+ mainloop.run()

Subscribers

People subscribed via source and target branches

to status/vote changes: