diff --git a/GADGETS/audio/__init__.py b/GADGETS/audio/__init__.py index 7496de8..94f4a7d 100644 --- a/GADGETS/audio/__init__.py +++ b/GADGETS/audio/__init__.py @@ -100,7 +100,7 @@ class Gadget(e.Gadget): if obj is None: break # remove the obj from our lists - for name, objs in self.player_objs.items(): + for player, objs in self.player_objs.items(): while obj in objs: objs.remove(obj) # delete the cover image @@ -137,6 +137,21 @@ class Gadget(e.Gadget): for o in self.player_objs.get(player, []): self.player_update(o, player) + def player_added(self, player): + for popup in self._popups: + self.popup_player_add(popup, player) + + def player_removed(self, player): + if player in self.player_objs: + for o in self.player_objs[player]: + # delete the cover image + cover = o.part_swallow_get('cover.swallow') + if cover: cover.delete() + # delete the edje object + o.delete() + # remove the player from our list + del self.player_objs[player] + def player_update(self, obj, player): # player name obj.part_text_set('player_name', player.label or player.name) @@ -241,36 +256,47 @@ class Mpris2_Client(object): self.players = [] self.bus = dbus.SessionBus(mainloop=DBusEcoreMainLoop()) - # update the players list - self.update_players_list() + # build the list of players + for name in self.bus.list_names(): + if name.startswith(self.BASE_PATH): + self.player_add(name) + # and keep the list updated when names changes - self.sig1 = self.bus.add_signal_receiver(self.name_owner_changed_cb, - "NameOwnerChanged") + self.bus.add_signal_receiver(self.name_owner_changed_cb, + "NameOwnerChanged") def name_owner_changed_cb(self, name, old_owner, new_owner): if name.startswith(self.BASE_PATH): - self.update_players_list() + if new_owner: + self.player_add(name) + else: + self.player_del(name) - def update_players_list(self): - names = [ n for n in self.bus.list_names() if n.startswith(self.BASE_PATH) ] - del self.players[:] - for name in names: - self.players.append(Mpris2_Player(self.bus, name[len(self.BASE_PATH):])) + def player_add(self, obj_path): + player = Mpris2_Player(self.bus, obj_path) + self.players.append(player) + _instance.player_added(player) + def player_del(self, obj_path): + for player in self.players: + if player.obj_path == obj_path: + self.players.remove(player) + _instance.player_removed(player) + del player + break class Mpris2_Player(object): MAIN_IFACE = 'org.mpris.MediaPlayer2' PLAYER_IFACE = 'org.mpris.MediaPlayer2.Player' - def __init__(self, bus, name): - self.name = name + def __init__(self, bus, obj_path): + self.obj_path = obj_path self.label = None self.metadata = None # metadata dict as per mpris2 specs self.playback_status = 'Stopped' # or 'Playing' or 'Paused' self.volume = 0.0 # range: 0.0 - 1.0 - self.proxy = bus.get_object('org.mpris.MediaPlayer2.%s' % name, - '/org/mpris/MediaPlayer2') + self.proxy = bus.get_object(self.obj_path, '/org/mpris/MediaPlayer2') # self.prop_iface.GetAll(...) self.prop_iface = dbus.Interface(self.proxy, dbus_interface=dbus.PROPERTIES_IFACE)