34
37
DBUS_NAME = 'org.exaile.Exaile'
35
38
DBUS_OBJECT = '/org/exaile/Exaile'
41
Initializes class, begins dbus listening if DBUS_NAME is provided
42
@param d: dbus.Interface
44
if self.DBUS_NAME in self.dbus.ListNames():
42
capabilities = ('rating', 'time', 'seek', 'volume')
52
46
@return: boolean, True if successful, False if not
54
self.session_bus = dbus.SessionBus()
55
self.dbus_object = self.session_bus.get_object(self.DBUS_NAME,
48
session_bus = dbus.SessionBus()
49
self.iface = session_bus.get_object(self.DBUS_NAME, self.DBUS_OBJECT)
57
50
if not self.connected:
58
# this is for MPRIS plugin:
59
#self.session_bus.add_signal_receiver(self.playing_changed_handler,
60
# "StatusChange", 'org.freedesktop.MediaPlayer',
61
# self.DBUS_NAME, '/Player')
62
#self.session_bus.add_signal_receiver(self.song_changed_handler,
63
# "TrackChange", 'org.freedesktop.MediaPlayer',
64
# self.DBUS_NAME, '/Player')
65
# and this is for latest changes in Exaile dbus:
66
self.session_bus.add_signal_receiver(self.state_changed_handler,
67
"StateChanged", self.DBUS_NAME,
68
self.DBUS_NAME, self.DBUS_OBJECT)
69
self.session_bus.add_signal_receiver(self.track_changed_handler,
70
"TrackChanged", self.DBUS_NAME,
71
self.DBUS_NAME, self.DBUS_OBJECT)
51
session_bus.add_signal_receiver(self.state_changed_handler,
52
"StateChanged", self.DBUS_NAME, self.DBUS_NAME, self.DBUS_OBJECT)
53
session_bus.add_signal_receiver(self.track_changed_handler,
54
"TrackChanged", self.DBUS_NAME, self.DBUS_NAME, self.DBUS_OBJECT)
72
55
self.connected = True
75
58
def disconnect(self):
80
#self.session_bus.remove_signal_receiver(self.playing_changed_handler,
81
# "StatusChange", 'org.freedesktop.MediaPlayer',
82
# self.DBUS_NAME, '/Player')
83
#self.session_bus.remove_signal_receiver(self.song_changed_handler,
84
# "TrackChange", 'org.freedesktop.MediaPlayer',
85
# self.DBUS_NAME, '/Player')
86
#self.connected = False
87
self.session_bus.remove_signal_receiver(self.playing_changed_handler,
88
"StatusChange", self.DBUS_NAME,
89
self.DBUS_NAME, self.DBUS_OBJECT)
90
self.session_bus.remove_signal_receiver(self.song_changed_handler,
91
"TrackChange", self.DBUS_NAME,
92
self.DBUS_NAME, self.DBUS_OBJECT)
62
session_bus = dbus.SessionBus()
63
session_bus.remove_signal_receiver(self.state_changed_handler,
64
"StatusChange", self.DBUS_NAME, self.DBUS_NAME, self.DBUS_OBJECT)
65
session_bus.remove_signal_receiver(self.track_changed_handler,
66
"TrackChange", self.DBUS_NAME, self.DBUS_NAME, self.DBUS_OBJECT)
93
67
self.connected = False
97
@return: string, title of current playing song
100
return self.dbus_object.GetTrackAttr('title')
106
@return: string, album name of current playing song
109
return self.dbus_object.GetTrackAttr('album')
113
def get_artist(self):
115
@return: string, artist name of current playing song
118
return self.dbus_object.GetTrackAttr('artist')
122
69
def get_rating(self):
124
71
@return: integer, [0-5] value, representing rating of current
129
76
# so 3 out of 5 starts returns "60.0"
130
77
#this code works assuming that the rating that get_rating should return is "number of stars out of 5"
132
return int((float(self.dbus_object.GetTrackAttr('__rating')) * 5) / 100)
79
return int((float(self.iface.GetTrackAttr('__rating')) * 5) / 100)
136
def get_cover_path(self, data=None):
138
@param data: dictionary, contains info about current playing song.
140
@return: string, path to the album art image of current playing
143
return '' #GetCoverData() send real image data and not cover path
145
cover = str(self.dbus_object.GetCoverData())
147
cover = urllib.unquote(cover.encode('utf-8'))
148
if cover[:7] == "file://":
155
def get_state(self,data=None):
157
Returns players actual state.
158
@return: string - playing, paused, stopped
160
#this is bad, uses MPRIS :(
162
# data = self.dbus_object.GetStatus()
170
#this is good uses core dbus methods
171
return str(self.dbus_object.GetState())
173
def is_playing(self):
175
@return: boolean, True if player is playing, False if not
177
return self.dbus_object.IsPlaying()
179
def previous(self, widget, event):
181
Changes song to previous
184
self.dbus_object.Prev()
186
def play(self, widget, event):
188
Plays or pauses the player
191
self.dbus_object.PlayPause()
193
def next(self, widget, event):
198
self.dbus_object.Next()
200
def get_track(self, data=None):
202
Prepares a Track object with current playing song data
204
@param data: dictionary, contains info about current playing song.
206
@return: Track, object with current playing song data
210
'title' : self.get_title(),
211
'album' : self.get_album(),
212
'artist': self.get_artist(),
84
return State.get(self.iface.GetState())
88
'title' : self.iface.GetTrackAttr('title'),
89
'album' : self.iface.GetTrackAttr('album'),
90
'artist': self.iface.GetTrackAttr('artist'),
213
91
'rating': self.get_rating(),
214
'genre' : self.dbus_object.GetTrackAttr('genre'),
215
'tracknumber' : self.dbus_object.GetTrackAttr('tracknumber'),
216
'year' : self.dbus_object.GetTrackAttr('date'),
217
'location' : self.dbus_object.GetTrackAttr('__loc')
92
'genre' : self.iface.GetTrackAttr('genre'),
93
'tracknumber' : self.iface.GetTrackAttr('tracknumber'),
94
'year' : self.iface.GetTrackAttr('date'),
95
'location' : urllib.unquote(self.iface.GetTrackAttr('__loc').encode('utf-8')),
96
'rating' : self.get_rating(),
97
'length' : int(float(self.iface.GetTrackAttr('__length')))
220
data['rating'] = self.get_rating()
222
#vals = ('title','album','artist', 'genre', 'year', 'tracknumber',
223
# 'location', 'rating')
224
#for key in [key for key in vals if key not in data]:
225
# c.warning('EXAILE3: '+ key +' not found in current track')
229
title = data['title'],
230
album = data['album'],
231
artist = data['artist'],
232
genre = data['genre'],
234
rating = data['rating'],
235
tracknumber = data['tracknumber'],
236
location = urllib.unquote(data['location'].encode('utf-8')),
237
cover = self.get_cover_path()
241
def can_set_rating(self):
243
Returns True if players D-Bus interface supports setting rating,
244
return False otherwise
248
def set_rating(self,rating):
101
def set_rating(self, rating):
249
102
if 0 <= rating and rating <= 5:
251
self.dbus_object.SetTrackAttr('__rating', rating)
104
self.iface.SetTrackAttr('__rating', rating)
106
def get_position(self):
107
data = str(self.iface.CurrentPosition()).split(':')
110
time = time * 60 + int(t)
113
def set_position(self, time):
114
self.iface.Seek(float(time))
116
def get_volume(self):
117
return int(float(self.iface.GetVolume()))
119
def set_volume(self, volume):
120
self.iface.ChangeVolume(volume)
124
Changes song to previous
131
Plays or pauses the player
134
self.iface.PlayPause()
253
143
# ================================= HANDLERS ================================= #
255
def playing_changed_handler(self, message):
258
Handles StatusChanged dbus signal, calls state_handler()
262
self.state_handler(state=self.get_state(message))
264
def song_changed_handler(self, message):
267
Handles TrackChanged dbus signal, calls state_handler()
269
@param message: dictionary with current playing song stats
271
track = self.get_track(message)
272
self.state_handler(track=track)
274
145
def state_changed_handler(self):
276
Handles StateChanged dbus signal, calls state_handler()
278
self.state_handler(state=self.get_state())
146
self.cg.update(STATE, self.get_state())
280
148
def track_changed_handler(self):
282
Handles TrackChanged dbus signal, calls state_handler()
284
track = self.get_track()
285
self.state_handler(track=track)
149
self.cg.update(TRACK, self.get_track())