From 5b04063e83b45593f5d65b5b1fb51acd637ccd72 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Fri, 24 May 2024 07:23:10 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20User=20favorites=20(hearted=20items?= =?UTF-8?q?)=20are=20now=20selectable=20from=20the=20left=20pane's=20list.?= =?UTF-8?q?=20Fixes=20#99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/constants.py | 9 ++++++++ tidal_dl_ng/gui.py | 42 ++++++++++++++++++++++++++++--------- tidal_dl_ng/helper/tidal.py | 2 +- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/tidal_dl_ng/constants.py b/tidal_dl_ng/constants.py index 67bab97..979b786 100644 --- a/tidal_dl_ng/constants.py +++ b/tidal_dl_ng/constants.py @@ -50,3 +50,12 @@ class QueueDownloadStatus(StrEnum): Finished: str = "✅" Failed: str = "❌" Skipped: str = "↪️" + + +FAVORITES: {} = { + "fav_videos": {"name": "Videos", "function_name": "videos"}, + "fav_tracks": {"name": "Tracks", "function_name": "tracks"}, + "fav_mixes": {"name": "Mixes & Radio", "function_name": "mixes"}, + "fav_artists": {"name": "Artists", "function_name": "artists"}, + "fav_albums": {"name": "Albums", "function_name": "albums"}, +} diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index d864969..43302e7 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -47,7 +47,7 @@ from tidalapi.artist import Artist from tidalapi.session import SearchTypes from tidal_dl_ng.config import Settings, Tidal -from tidal_dl_ng.constants import QualityVideo, QueueDownloadStatus, TidalLists +from tidal_dl_ng.constants import FAVORITES, QualityVideo, QueueDownloadStatus, TidalLists from tidal_dl_ng.download import Download from tidal_dl_ng.logger import XStream, logger_gui from tidal_dl_ng.model.gui_data import ProgressBars, QueueDownloadItem, ResultItem, StatusbarMessage @@ -279,20 +279,21 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): twi_playlists: QtWidgets.QTreeWidgetItem = self.tr_lists_user.findItems( TidalLists.Playlists, QtCore.Qt.MatchExactly, 0 )[0] - twi_favorites: QtWidgets.QTreeWidgetItem = self.tr_lists_user.findItems( - TidalLists.Favorites, QtCore.Qt.MatchExactly, 0 - )[0] twi_mixes: QtWidgets.QTreeWidgetItem = self.tr_lists_user.findItems( TidalLists.Mixes, QtCore.Qt.MatchExactly, 0 )[0] + twi_favorites: QtWidgets.QTreeWidgetItem = self.tr_lists_user.findItems( + TidalLists.Favorites, QtCore.Qt.MatchExactly, 0 + )[0] # Remove all children if present - for twi in [twi_playlists, twi_mixes, twi_favorites]: + for twi in [twi_playlists, twi_mixes]: for i in reversed(range(twi.childCount())): twi.removeChild(twi.child(i)) + # Populate dynamic user lists for item in user_lists: - if isinstance(item, (UserPlaylist, Playlist)): + if isinstance(item, UserPlaylist | Playlist): twi_child = QtWidgets.QTreeWidgetItem(twi_playlists) name: str = item.name description: str = f" {item.description}" if item.description else "" @@ -306,6 +307,16 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): set_user_list_media(twi_child, item) twi_child.setText(2, info) + # Populate static favorites + for key, favorite in FAVORITES.items(): + twi_child = QtWidgets.QTreeWidgetItem(twi_favorites) + name: str = favorite["name"] + info: str = "" + + twi_child.setText(0, name) + set_user_list_media(twi_child, key) + twi_child.setText(2, info) + # Stop load spinner self.s_spinner_stop.emit() self.s_pb_reload_status.emit(True) @@ -712,12 +723,18 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.tidal.settings_apply() def on_list_items_show(self, item: QtWidgets.QTreeWidgetItem): - media_list: Album | Playlist = get_user_list_media_item(item) + media_list: Album | Playlist | str = get_user_list_media_item(item) # Only if clicked item is not a top level item. if media_list: - self.list_items_show_result(media_list) - self.cover_show(media_list) + if isinstance(media_list, str) and media_list.startswith("fav_"): + function_name: str = FAVORITES[media_list]["function_name"] + function_list = getattr(self.tidal.session.user.favorites, function_name) + + self.list_items_show_result(favorite_function=function_list) + else: + self.list_items_show_result(media_list) + self.cover_show(media_list) def on_result_item_clicked(self, index: QtCore.QModelIndex) -> None: media: Track | Video | Album | Artist = get_results_media_item( @@ -754,13 +771,18 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): media_list: Album | Playlist | Mix | Artist | None = None, point: QtCore.QPoint | None = None, parent: QtGui.QStandardItem = None, + favorite_function: Callable = None, ) -> None: if point: item = self.tr_lists_user.itemAt(point) media_list = get_user_list_media_item(item) # Get all results - media_items: [Track | Video | Album] = items_results_all(media_list) + if favorite_function: + media_items: [Track | Video | Album] = favorite_function() + else: + media_items: [Track | Video | Album] = items_results_all(media_list) + result: [ResultItem] = self.search_result_to_model(media_items) self.populate_tree_results(result, parent=parent) diff --git a/tidal_dl_ng/helper/tidal.py b/tidal_dl_ng/helper/tidal.py index 129592d..2eece35 100644 --- a/tidal_dl_ng/helper/tidal.py +++ b/tidal_dl_ng/helper/tidal.py @@ -127,7 +127,7 @@ def all_artist_album_ids(media_artist: Artist) -> [int | None]: return result -def paginate_media(func_get_items_media) -> [Track | Video | Album]: +def paginate_media(func_get_items_media: [Callable]) -> [Track | Video | Album]: result: [Track | Video | Album] = [] for func_media in func_get_items_media: