From 9967966747b075d25e8be72d16f591b69a0f4efa Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Sun, 21 Mar 2021 15:23:56 +0100 Subject: [PATCH] allow adding whole artists to the playlist via middle click --- bin/mpdevil | 52 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/bin/mpdevil b/bin/mpdevil index 4d29693..4d3df13 100755 --- a/bin/mpdevil +++ b/bin/mpdevil @@ -29,6 +29,7 @@ import datetime import os import sys import re +import operator from gettext import gettext as _, ngettext, textdomain, bindtextdomain textdomain("mpdevil") if os.path.isfile("/.flatpak-info"): # test for flatpak environment @@ -623,6 +624,14 @@ class Client(MPDClient): songs=self.find("album", album, "date", year, self._settings.get_artist_type(), artist) self.files_to_playlist([song["file"] for song in songs], mode) + def artist_to_playlist(self, artist, genre, mode="default"): + albums=self.get_albums(artist, genre) + if self._settings.get_boolean("sort-albums-by-year"): + albums.sort(key=operator.itemgetter('year')) + else: + albums.sort(key=operator.itemgetter('album')) + self.files_to_playlist([song["file"] for album in albums for song in album["songs"]], mode) + def comp_list(self, *args): # simulates listing behavior of python-mpd2 1.0 native_list=self.list(*args) if len(native_list) > 0: @@ -653,6 +662,20 @@ class Client(MPDClient): else: return None + def get_albums(self, artist, genre): + albums=[] + artist_type=self._settings.get_artist_type() + if genre is None: + album_candidates=self.comp_list("album", artist_type, artist) + else: + album_candidates=self.comp_list("album", artist_type, artist, "genre", genre) + for album in album_candidates: + years=self.comp_list("date", "album", album, artist_type, artist) + for year in years: + songs=self.find("album", album, "date", year, artist_type, artist) + albums.append({"artist": artist, "album": album, "year": year, "songs": songs}) + return albums + def toggle_play(self): status=self.status() if status["state"] == "play": @@ -1996,6 +2019,7 @@ class ArtistWindow(FocusFrame): scroll.add(self._treeview) # connect + self._treeview.connect("button-release-event", self._on_button_release_event) self._treeview.connect("row-activated", self._on_row_activated) self._settings.connect("changed::use-album-artist", self._refresh) self._settings.connect("changed::show-initials", self._on_show_initials_changed) @@ -2061,6 +2085,19 @@ class ArtistWindow(FocusFrame): self._store.append([artist, Pango.Weight.BOOK, "", Pango.Weight.BOOK]) self._selection.set_mode(Gtk.SelectionMode.SINGLE) + def _on_button_release_event(self, widget, event): + path_re=widget.get_path_at_pos(int(event.x), int(event.y)) + if path_re is not None: + path=path_re[0] + if event.button == 2 and event.type == Gdk.EventType.BUTTON_RELEASE: + genre=self._genre_select.get_selected_genre() + if path == Gtk.TreePath(0): + for row in self._store: + self._client.wrapped_call("artist_to_playlist", row[0], genre, "append") + else: + artist=self._store[path][0] + self._client.wrapped_call("artist_to_playlist", artist, genre, "append") + def _on_row_activated(self, widget, path, view_column): for row in self._store: # reset bold text row[1]=Pango.Weight.BOOK @@ -2190,7 +2227,6 @@ class AlbumWindow(FocusFrame): self._iconview.set_markup_column(1) # prepare albmus list (run all mpd related commands) albums=[] - artist_type=self._settings.get_artist_type() for i, artist in enumerate(artists): try: # client cloud meanwhile disconnect if self._stop_flag: @@ -2199,19 +2235,7 @@ class AlbumWindow(FocusFrame): else: if i > 0: # more than one artist to show (all artists) self._progress_bar.pulse() - if genre is None: - album_candidates=self._client.wrapped_call("comp_list", "album", artist_type, artist) - else: - album_candidates=self._client.wrapped_call( - "comp_list", "album", artist_type, artist, "genre", genre - ) - for album in album_candidates: - years=self._client.wrapped_call("comp_list", "date", "album", album, artist_type, artist) - for year in years: - songs=self._client.wrapped_call( - "find", "album", album, "date", year, artist_type, artist - ) - albums.append({"artist": artist, "album": album, "year": year, "songs": songs}) + albums.extend(self._client.wrapped_call("get_albums", artist, genre)) while Gtk.events_pending(): Gtk.main_iteration_do(True) except MPDBase.ConnectionError: