~ubuntu-branches/ubuntu/saucy/radiotray/saucy

« back to all changes in this revision

Viewing changes to src/mpris2.py

  • Committer: Bazaar Package Importer
  • Author(s): Elías Alejandro Año Mendoza
  • Date: 2011-08-02 13:14:39 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20110802131439-hocmcxtnb9xyyo5d
Tags: 0.6.4-1
* New upstream release
* Removed debian/pyversions
* Bump debhelper to 8
* Use dh_python2 instead of pysupport
* Upstream fixed fails to load bookmarks
  from version 0.6 (Closes: #604898)
* debian/control
  + Bump Standard-Version to 3.9.2
  + Added python-glade2 under Depends
* debian/rules
  + Set HOME to /nonexistent to avoid build fails 
    under some architectures
* debian/copyright
  + Updated to DEP-5 rev 174
  + Update copyright years

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##########################################################################
 
2
# Copyright 2009 Carlos Ribeiro
 
3
#
 
4
# This file is part of Radio Tray
 
5
#
 
6
# Radio Tray 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 1 of the License, or
 
9
# (at your option) any later version.
 
10
#
 
11
# Radio Tray 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 Radio Tray.  If not, see <http://www.gnu.org/licenses/>.
 
18
#
 
19
##########################################################################
 
20
import dbus
 
21
 
 
22
import logging
 
23
import time
 
24
import tempfile
 
25
 
 
26
ORG_MPRIS_MEDIAPLAYER2="org.mpris.MediaPlayer2"
 
27
ORG_MPRIS_MEDIAPLAYER2_PLAYER="org.mpris.MediaPlayer2.Player"
 
28
ORG_MPRIS_MEDIAPLAYER2_TRACKLIST="org.mpris.MediaPlayer2.TrackList"
 
29
class Mpris2Adapter(dbus.service.Object):
 
30
    """ interface defined by org.mpris.MediaPlayer2"""
 
31
    def __init__(self, provider, mediator, bus):
 
32
 
 
33
        dbus.service.Object.__init__(self, bus, '/org/mpris/MediaPlayer2')
 
34
        self.exaile = exaile
 
35
 
 
36
        self.cover_cache = {}
 
37
 
 
38
    def populate(self, interface, *prop_names):
 
39
        props = {}
 
40
        for p in prop_names:
 
41
            props[p] = getattr(self, p)()
 
42
        self.PropertiesChanged(interface, props, [])
 
43
 
 
44
    @dbus.service.method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v')
 
45
    def Get(self, interface, prop):
 
46
        logger.info('dbus get prop: ' + prop)
 
47
        if hasattr(self, prop):
 
48
            result = getattr(self, prop)()
 
49
            return result
 
50
        return None
 
51
 
 
52
    @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as')
 
53
    def PropertiesChanged(self, interface, updated, invalid):
 
54
        #logger.info("fired")
 
55
        pass
 
56
 
 
57
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2)
 
58
    def Raise(self):
 
59
        self.exaile.gui.main.toggle_visible(True)
 
60
 
 
61
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2)
 
62
    def Quit(self):
 
63
        self.exaile.quit()
 
64
 
 
65
    def CanQuit(self):
 
66
        return True
 
67
 
 
68
    def CanRaise(self):
 
69
        return True
 
70
 
 
71
    def HasTrackList(self):
 
72
        return False
 
73
 
 
74
    def Identity(self):
 
75
        return "Exaile"
 
76
    
 
77
    def DesktopEntry(self):
 
78
        return "exaile"
 
79
 
 
80
    def SupportedUriSchemes(self):
 
81
        ##TODO
 
82
        return ['http', 'https', 'file']
 
83
 
 
84
    def SupportedMimeTypes(self):
 
85
        ##TODO
 
86
        return ['audio/mpeg', 'application/ogg']
 
87
 
 
88
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER)
 
89
    def Next(self):
 
90
        self.exaile.queue.next()
 
91
 
 
92
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER)
 
93
    def Previous(self):
 
94
        self.exaile.queue.prev()
 
95
 
 
96
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER)
 
97
    def Pause(self):
 
98
        self.exaile.player.pause()
 
99
 
 
100
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER)
 
101
    def PlayPause(self):
 
102
        if self.exaile.player.is_stopped():
 
103
            self.exaile.queue.play()
 
104
        else:
 
105
            self.exaile.player.toggle_pause()
 
106
 
 
107
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER)
 
108
    def Stop(self):
 
109
        self.exaile.player.stop()
 
110
 
 
111
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER)
 
112
    def Play(self):
 
113
        self.exaile.queue.play()
 
114
 
 
115
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER, in_signature='x')
 
116
    def Seek(self, offset):
 
117
        self.exaile.player.seek(offset)
 
118
 
 
119
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER, in_signature='ox')
 
120
    def SetPosition(self, track_id, position):
 
121
        pass
 
122
 
 
123
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_PLAYER, in_signature='s')
 
124
    def OpenUri(self, uri):
 
125
        pass
 
126
 
 
127
    def PlaybackStatus(self):
 
128
        if self.exaile.player.is_playing():
 
129
            return 'Playing'
 
130
        elif self.exaile.player.is_paused():
 
131
            return 'Paused'
 
132
        else:
 
133
            return 'Stopped'
 
134
 
 
135
    def LoopStatus(self):
 
136
        playlist = self.exaile.queue.current_playlist
 
137
        if playlist.repeat_enabled:
 
138
            if playlist.repeat_mode == 'playlist':
 
139
                return 'Playlist'
 
140
            else:
 
141
                return 'Track'
 
142
        else:
 
143
            return 'None'
 
144
        
 
145
 
 
146
    def Rate(self):
 
147
        pass
 
148
 
 
149
    def Metadata(self):
 
150
        current_track = self.exaile.player.current
 
151
        if current_track is not None:
 
152
            return self._get_metadata(current_track)
 
153
        else:
 
154
            return {}
 
155
 
 
156
    def Volume(self):
 
157
        pass
 
158
 
 
159
    def Position(self):
 
160
        pass
 
161
 
 
162
    def MinimumRate(self):
 
163
        pass
 
164
 
 
165
    def MaximumRate(self):
 
166
        pass
 
167
 
 
168
    def CanGoNext(self):
 
169
        track = self.exaile.player.current
 
170
        playlist = self.exaile.queue.current_playlist
 
171
        return not ((len(playlist)-1) == playlist.index(track))
 
172
 
 
173
    def CanGoPrevious(self):
 
174
        track = self.exaile.player.current
 
175
        playlist = self.exaile.queue.current_playlist
 
176
        return not (playlist.index(track) == 0)
 
177
 
 
178
    def CanPlay(self):
 
179
        return not self.exaile.player.is_playing()
 
180
 
 
181
    def CanPause(self):
 
182
        return self.exaile.player.is_playing()
 
183
 
 
184
    def CanSeek(self):
 
185
        return False
 
186
 
 
187
    def CanControl(self):
 
188
        return True
 
189
 
 
190
    def Shuffle(self):
 
191
        return settings.get_option('playback/shuffle', False)
 
192
 
 
193
    def GetTracksMetadata(self, track_ids):
 
194
        pass
 
195
        
 
196
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_TRACKLIST, in_signature='sob')
 
197
    def AddTrack(self, uri, after_track, set_as_current):
 
198
        pass
 
199
 
 
200
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_TRACKLIST, in_signature='o')
 
201
    def RemoveTrack(self, trackId):
 
202
        pass
 
203
 
 
204
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_TRACKLIST, in_signature='o')
 
205
    def Goto(self, trackId):
 
206
        pass
 
207
 
 
208
    @dbus.service.method(ORG_MPRIS_MEDIAPLAYER2_TRACKLIST, out_signature='ao')
 
209
    def Tracks(self):
 
210
        pass
 
211
 
 
212
    def CanEditTracks(self):
 
213
        return False
 
214
 
 
215
 
 
216
    def _get_metadata(self, track):
 
217
        ## mpris2.0 meta map, defined at http://xmms2.org/wiki/MPRIS_Metadata
 
218
        meta = {}
 
219
 
 
220
        title = track.get_tag_raw('title')[0] if track.get_tag_raw('title') else ""
 
221
        meta['xesam:title'] = unicode(title)
 
222
        album = track.get_tag_raw('album')[0] if track.get_tag_raw('album') else ""
 
223
        meta['xesam:album'] = unicode(album)
 
224
        artist = track.get_tag_raw('artist')[0] if track.get_tag_raw('artist') else ""
 
225
        meta['xesam:artist'] = dbus.types.Array([unicode(artist)], signature='s')
 
226
    
 
227
        meta['mpris:length'] = dbus.types.Int64(int(track.get_tag_raw('__length') or 0)*1000)
 
228
 
 
229
        ## this is a workaround, write data to a tmp file and return name
 
230
        cover_temp = self._get_cover_url(track)
 
231
        if cover_temp is not None:
 
232
            meta['mpris:artUrl'] = cover_temp
 
233
 
 
234
        meta['mpris:trackid'] = track.get_tag_raw('__loc')
 
235
        meta['xesam:url'] = track.get_tag_raw('__loc')
 
236
    
 
237
        return dbus.types.Dictionary(meta, signature='sv', variant_level=1)
 
238
 
 
239
    def _get_cover_url(self, track):
 
240
        trackid = track.get_tag_raw('__loc')
 
241
        if trackid not in self.cover_cache:
 
242
            cover_data = cover_manager.get_cover(track)
 
243
            if cover_data is not None:
 
244
                cover_temp = tempfile.NamedTemporaryFile(prefix='exaile-soundmenu', delete=False)
 
245
                cover_temp.write(cover_data)
 
246
                cover_temp.close()
 
247
                self.cover_cache[trackid] = "file://"+cover_temp.name
 
248
            else:
 
249
                return None
 
250
        return self.cover_cache[trackid]