def restore_state(self): """ Restore player state """ try: if App().settings.get_value("save-state"): current_track_id = load(open(LOLLYPOP_DATA_PATH + "/track_id.bin", "rb")) self.set_queue(load(open(LOLLYPOP_DATA_PATH + "/queue.bin", "rb"))) albums = load(open(LOLLYPOP_DATA_PATH + "/Albums.bin", "rb")) playlist_ids = load(open(LOLLYPOP_DATA_PATH + "/playlist_ids.bin", "rb")) (is_playing, was_party) = load(open(LOLLYPOP_DATA_PATH + "/player.bin", "rb")) if playlist_ids and playlist_ids[0] == Type.RADIOS: radios = Radios() track = Track() name = radios.get_name(current_track_id) url = radios.get_url(name) track.set_radio(name, url) self.load(track, is_playing) elif App().tracks.get_uri(current_track_id) != "": if albums: if was_party: App().lookup_action("party").change_state( GLib.Variant("b", True)) else: self._albums = load(open( LOLLYPOP_DATA_PATH + "/Albums.bin", "rb")) # Load track from player albums current_track = Track(current_track_id) index = self.album_ids.index(current_track.album.id) for track in self._albums[index].tracks: if track.id == current_track_id: self._load_track(track) break else: for playlist_id in playlist_ids: tracks = App().playlists.get_tracks(playlist_id) App().player.populate_playlist_by_tracks( tracks, playlist_ids) for track in tracks: if track.id == current_track_id: self._load_track(track) break if is_playing: self.play() else: self.pause() position = load(open(LOLLYPOP_DATA_PATH + "/position.bin", "rb")) self.seek(position / Gst.SECOND) else: Logger.info("Player::restore_state(): track missing") self.emit("playlist-changed") except Exception as e: Logger.error("Player::restore_state(): %s" % e)
def restore_state(self): """ Restore player state """ try: if Lp().settings.get_value('save-state'): track_id = load(open(DataPath + "/track_id.bin", "rb")) playlist_ids = load(open(DataPath + "/playlist_ids.bin", "rb")) if playlist_ids and playlist_ids[0] == Type.RADIOS: radios = Radios() track = Track() name = radios.get_name(track_id) url = radios.get_url(name) track.set_radio(name, url) self.load(track) elif Lp().tracks.get_uri(track_id) != "": track = Track(track_id) if Lp().notify is not None: Lp().notify.inhibit() self._load_track(track) # We set this initial state # because seek while failed otherwise self.pause() if playlist_ids: pids = [] for playlist_id in playlist_ids: pids.append(int(playlist_id)) track_ids = [] for playlist_id in playlist_ids: if playlist_id == Type.POPULARS: tracks = Lp().tracks.get_populars() elif playlist_id == Type.RECENTS: tracks = Lp().tracks.get_recently_listened_to() elif playlist_id == Type.NEVER: tracks = Lp().tracks.get_never_listened_to() elif playlist_id == Type.RANDOMS: tracks = Lp().tracks.get_randoms() else: tracks = Lp().playlists.get_track_ids( playlist_id) for track_id in tracks: if track_id not in track_ids: track_ids.append(track_id) self.populate_user_playlist_by_tracks( track_ids, pids) else: self._albums = load( open(DataPath + "/albums.bin", "rb")) self.shuffle_albums(True) self._context.genre_ids = load( open(DataPath + "/genre_ids.bin", "rb")) self._context.artist_ids = load( open(DataPath + "/artist_ids.bin", "rb")) self.set_next() self.set_prev() else: print("Player::restore_state(): track missing") except Exception as e: print("Player::restore_state()", e)
def restore_state(self): """ Restore player state """ if Lp().settings.get_value('save-state'): track_id = Lp().settings.get_value('track-id').get_int32() playlist_ids = Lp().settings.get_value('playlist-ids') if playlist_ids and playlist_ids[0] == Type.RADIOS: radios = Radios() track = Track() name = radios.get_name(track_id) url = radios.get_url(name) track.set_radio(name, url) self.load(track) elif Lp().tracks.get_path(track_id) != "": track = Track(track_id) self._load_track(track) if playlist_ids: try: pids = [] for playlist_id in playlist_ids: pids.append(int(playlist_id)) track_ids = [] for playlist_id in playlist_ids: if playlist_id == Type.POPULARS: tracks = Lp().tracks.get_populars() elif playlist_id == Type.RECENTS: tracks = Lp().tracks.get_recently_listened_to() elif playlist_id == Type.NEVER: tracks = Lp().tracks.get_never_listened_to() elif playlist_id == Type.RANDOMS: tracks = Lp().tracks.get_randoms() else: tracks = Lp().playlists.get_tracks_ids( playlist_id) for track_id in tracks: if track_id not in track_ids: track_ids.append(track_id) self.populate_user_playlist_by_tracks(track_ids, pids) except: pass # User set non int in gsettings else: self._albums = Lp().artists.get_albums( track.album_artist_ids) for album_id in self._albums: self.context.genre_ids[album_id] = [] self.context.artist_ids[album_id] = [] self.set_next() self.set_prev() if Lp().settings.get_value('repeat'): self.context.next = NextContext.NONE else: self.context.next = NextContext.STOP_ALL self.emit('current-changed') else: print("Player::restore_state(): track missing")
class RadiosView(View): """ Show radios in a grid """ def __init__(self): """ Init view """ View.__init__(self) self._signal = Lp().art.connect('radio-artwork-changed', self._on_logo_changed) self._radios_manager = Radios() self._radios_manager.connect('radios-changed', self._on_radios_changed) builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/RadiosView.ui') builder.connect_signals(self) widget = builder.get_object('widget') self._empty = builder.get_object('empty') self._pop_tunein = TuneinPopover(self._radios_manager) self._pop_tunein.set_relative_to(builder.get_object('search_btn')) self._sizegroup = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.BOTH) self._radiobox = Gtk.FlowBox() self._radiobox.set_selection_mode(Gtk.SelectionMode.NONE) self._radiobox.connect("child-activated", self._on_album_activated) self._radiobox.set_property('column-spacing', 5) self._radiobox.set_property('row-spacing', 5) self._radiobox.set_homogeneous(True) self._radiobox.set_max_children_per_line(1000) self._radiobox.show() self._stack = Gtk.Stack() self._stack.set_transition_duration(500) self._stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self._stack.add(self._scrolled) self._stack.add(self._empty) self._stack.show() self._viewport.set_property("valign", Gtk.Align.START) self._viewport.set_property('margin', 5) self._viewport.add(self._radiobox) self._scrolled.set_property('expand', True) self.add(widget) self.add(self._stack) def populate(self): """ Populate view with tracks from playlist Thread safe """ Lp().player.set_radios(self._radios_manager.get()) if Lp().player.current_track.id == Type.RADIOS: Lp().player.set_next() # We force next update Lp().player.set_prev() # We force prev update t = Thread(target=self._populate) t.daemon = True t.start() ####################### # PRIVATE # ####################### def _populate(self): """ Populate view with tracks from playlist Thread safe """ radios = [] # Get radios name for (name, url) in self._radios_manager.get(): radios.append(name) GLib.idle_add(self._show_stack, radios) def _get_children(self): """ Return view children @return [RadioWidget] """ children = [] for child in self._radiobox.get_children(): widget = child.get_child() children.append(widget) return children def _on_destroy(self, widget): """ Disconnect signals @param widget as Gtk.Widget """ if self._signal is not None: Lp().art.disconnect(self._signal) def _on_new_clicked(self, widget): """ Show popover for adding a new radio @param widget as Gtk.Widget """ popover = RadioPopover('', self._radios_manager) popover.set_relative_to(widget) popover.show() def _on_search_clicked(self, widget): """ Show popover for searching radios @param widget as Gtk.Widget """ self._pop_tunein.populate() self._pop_tunein.show() def _on_radios_changed(self, manager): """ Update radios @param manager as PlaylistManager """ radios_name = [] currents = [] new_name = None old_widget = None old_child = None # Get radios name for (name, url) in manager.get(): radios_name.append(name) # Get currents widget less removed for child in self._radiobox.get_children(): widget = child.get_child() if widget.get_name() not in radios_name: old_widget = widget old_child = child else: currents.append(widget.get_name()) # Add the new radio for name in radios_name: if name not in currents: new_name = name break # Rename widget if new_name is not None: if old_widget is not None: old_widget.set_name(new_name) else: radios = [new_name] self._show_stack(radios) # Delete widget elif old_widget is not None: self._radiobox.remove(old_child) old_widget.destroy() if not self._radiobox.get_children(): self._show_stack([]) # Update player state based on current view radios = [] for child in self._radiobox.get_children(): widget = child.get_child() name = widget.get_name() url = manager.get_url(name) radios.append((name, url)) Lp().player.set_radios(radios) if Lp().player.current_track.id == Type.RADIOS: Lp().player.set_next() # We force next update Lp().player.set_prev() # We force prev update def _on_logo_changed(self, player, name): """ Update radio logo @param player as Plyaer @param name as string """ for child in self._radiobox.get_children(): widget = child.get_child() if widget.get_name() == name: widget.update_cover() def _show_stack(self, radios): """ Switch empty/radios view based on radios @param [radio names as string] """ if radios: self._stack.set_visible_child(self._scrolled) self._add_radios(radios, True) else: self._stack.set_visible_child(self._empty) def _add_radios(self, radios, first=False): """ Pop a radio and add it to the view, repeat operation until radio list is empty @param [radio names as string] @param first as bool """ if radios and not self._stop: radio = radios.pop(0) widget = RadioWidget(radio, self._radios_manager) widget.show() self._sizegroup.add_widget(widget) if first: self._radiobox.insert(widget, 0) else: self._radiobox.insert(widget, -1) GLib.idle_add(self._add_radios, radios) else: self._stop = False return None def _on_album_activated(self, flowbox, child): """ Play album @param flowbox as Gtk.Flowbox @child as Gtk.FlowboxChild """ name = child.get_child().get_name() url = self._radios_manager.get_url(name) if url: track = Track() track.set_radio(name, url) Lp().player.load(track)
def restore_state(self): """ Restore player state """ try: if Lp().settings.get_value('save-state'): track_id = load(open(DataPath + "/track_id.bin", "rb")) playlist_ids = load(open(DataPath + "/playlist_ids.bin", "rb")) if playlist_ids and playlist_ids[0] == Type.RADIOS: radios = Radios() track = Track() name = radios.get_name(track_id) url = radios.get_url(name) track.set_radio(name, url) self.load(track) elif Lp().tracks.get_path(track_id) != "": track = Track(track_id) if Lp().notify is not None: Lp().notify.inhibit() self._load_track(track) # We set this initial state # because seek while failed otherwise self.pause() if playlist_ids: pids = [] for playlist_id in playlist_ids: pids.append(int(playlist_id)) track_ids = [] for playlist_id in playlist_ids: if playlist_id == Type.POPULARS: tracks = Lp().tracks.get_populars() elif playlist_id == Type.RECENTS: tracks = Lp().tracks.get_recently_listened_to() elif playlist_id == Type.NEVER: tracks = Lp().tracks.get_never_listened_to() elif playlist_id == Type.RANDOMS: tracks = Lp().tracks.get_randoms() else: tracks = Lp().playlists.get_track_ids( playlist_id) for track_id in tracks: if track_id not in track_ids: track_ids.append(track_id) self.populate_user_playlist_by_tracks(track_ids, pids) else: self._albums = load(open( DataPath + "/albums.bin", "rb")) self.shuffle_albums(True) self._context.genre_ids = load(open( DataPath + "/genre_ids.bin", "rb")) self._context.artist_ids = load(open( DataPath + "/artist_ids.bin", "rb")) self.set_next() self.set_prev() if Lp().settings.get_value('repeat'): self._context.next = NextContext.NONE else: self._context.next = NextContext.STOP_ALL else: print("Player::restore_state(): track missing") except Exception as e: print("Player::restore_state()", e)
class RadiosView(View): """ Show radios in a grid """ def __init__(self): """ Init view """ View.__init__(self) self._signal = Lp().art.connect('radio-artwork-changed', self._on_logo_changed) self._radios_manager = Radios() self._radios_manager.connect('radios-changed', self._on_radios_changed) builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/RadiosView.ui') builder.connect_signals(self) widget = builder.get_object('widget') self._empty = builder.get_object('empty') self._pop_tunein = TuneinPopover(self._radios_manager) self._pop_tunein.set_relative_to(builder.get_object('search_btn')) self._sizegroup = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.BOTH) self._radiobox = Gtk.FlowBox() self._radiobox.set_selection_mode(Gtk.SelectionMode.NONE) self._radiobox.connect("child-activated", self._on_album_activated) self._radiobox.set_property('column-spacing', 5) self._radiobox.set_property('row-spacing', 5) self._radiobox.set_homogeneous(True) self._radiobox.set_max_children_per_line(1000) self._radiobox.show() self._stack = Gtk.Stack() self._stack.set_transition_duration(500) self._stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self._stack.add(self._scrolledWindow) self._stack.add(self._empty) self._stack.show() self._viewport.set_property("valign", Gtk.Align.START) self._viewport.set_property('margin', 5) self._viewport.add(self._radiobox) self._scrolledWindow.set_property('expand', True) self.add(widget) self.add(self._stack) def populate(self): """ Populate view with tracks from playlist Thread safe """ t = Thread(target=self._populate) t.daemon = True t.start() ####################### # PRIVATE # ####################### def _populate(self): """ Populate view with tracks from playlist Thread safe """ radios = [] # Get radios name for (name, url) in self._radios_manager.get(): radios.append(name) GLib.idle_add(self._show_stack, radios) def _get_children(self): """ Return view children @return [RadioWidget] """ children = [] for child in self._radiobox.get_children(): widget = child.get_child() children.append(widget) return children def _on_destroy(self, widget): """ Disconnect signals @param widget as Gtk.Widget """ if self._signal is not None: Lp().art.disconnect(self._signal) def _on_new_clicked(self, widget): """ Show popover for adding a new radio @param widget as Gtk.Widget """ popover = RadioPopover('', self._radios_manager) popover.set_relative_to(widget) popover.show() def _on_search_clicked(self, widget): """ Show popover for searching radios @param widget as Gtk.Widget """ self._pop_tunein.populate() self._pop_tunein.show() def _on_radios_changed(self, manager): """ Update radios @param manager as PlaylistManager """ radios_name = [] currents = [] new_name = None old_widget = None old_child = None # Get radios name for (name, url) in manager.get(): radios_name.append(name) # Get currents widget less removed for child in self._radiobox.get_children(): widget = child.get_child() if widget.get_name() not in radios_name: old_widget = widget old_child = child else: currents.append(widget.get_name()) # Add the new radio for name in radios_name: if name not in currents: new_name = name break # Rename widget if new_name is not None: if old_widget is not None: old_widget.set_name(new_name) else: radios = [new_name] self._show_stack(radios) # Delete widget elif old_widget is not None: self._radiobox.remove(old_child) old_widget.destroy() if not self._radiobox.get_children(): self._show_stack([]) def _on_logo_changed(self, player, name): """ Update radio logo @param player as Plyaer @param name as string """ for child in self._radiobox.get_children(): widget = child.get_child() if widget.get_name() == name: widget.update_cover() def _show_stack(self, radios): """ Switch empty/radios view based on radios @param [radio names as string] """ if radios: self._stack.set_visible_child(self._scrolledWindow) self._add_radios(radios, True) else: self._stack.set_visible_child(self._empty) def _add_radios(self, radios, first=False): """ Pop a radio and add it to the view, repeat operation until radio list is empty @param [radio names as string] @param first as bool """ if radios and not self._stop: radio = radios.pop(0) widget = RadioWidget(radio, self._radios_manager) widget.show() self._sizegroup.add_widget(widget) if first: self._radiobox.insert(widget, 0) else: self._radiobox.insert(widget, -1) GLib.idle_add(self._add_radios, radios) else: self._stop = False return None def _on_album_activated(self, flowbox, child): """ Play album @param flowbox as Gtk.Flowbox @child as Gtk.FlowboxChild """ name = child.get_child().get_name() url = self._radios_manager.get_url(name) if url: track = Track() track.set_radio(name, url) Lp().player.load(track)