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

Subscribers

People subscribed via source and target branches

to status/vote changes: