diff options
| author | exislow <exislow@users.noreply.github.com> | 2025-11-12 15:06:18 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-12 15:06:18 +0100 |
| commit | be59cf1684405fcef475fb8b774ff86e2a8df042 (patch) | |
| tree | 7df1f6eb74b2896808d800ef94d0b24358e81456 /tidal_dl_ng/helper | |
| parent | 554a42860e666f85ac99df6c08c10b3a6f16a5be (diff) | |
| parent | 9baea9b82c539eae693b11416aeb74db434b86ee (diff) | |
| download | tidal-dl-ng-be59cf1684405fcef475fb8b774ff86e2a8df042.tar.gz | |
Merge pull request #644 from exislow:folders
feat(gui): ✨ enhance user media handling with folder support
Diffstat (limited to 'tidal_dl_ng/helper')
| -rw-r--r-- | tidal_dl_ng/helper/gui.py | 12 | ||||
| -rw-r--r-- | tidal_dl_ng/helper/tidal.py | 40 |
2 files changed, 43 insertions, 9 deletions
diff --git a/tidal_dl_ng/helper/gui.py b/tidal_dl_ng/helper/gui.py index d680b19..35a517f 100644 --- a/tidal_dl_ng/helper/gui.py +++ b/tidal_dl_ng/helper/gui.py @@ -5,6 +5,7 @@ from PySide6 import QtCore, QtGui, QtWidgets from tidalapi import Album, Mix, Playlist, Track, UserPlaylist, Video from tidalapi.artist import Artist from tidalapi.media import Quality +from tidalapi.playlist import Folder from tidal_dl_ng.constants import QualityVideo @@ -33,8 +34,8 @@ def get_results_media_item( return result -def get_user_list_media_item(item: QtWidgets.QTreeWidgetItem) -> Mix | Playlist | UserPlaylist: - result: Mix | Playlist | UserPlaylist = get_table_data(item, 1) +def get_user_list_media_item(item: QtWidgets.QTreeWidgetItem) -> Mix | Playlist | UserPlaylist | Folder | str: + result: Mix | Playlist | UserPlaylist | Folder | str = get_table_data(item, 1) return result @@ -73,7 +74,9 @@ def get_queue_download_quality_video( def set_table_data( - item: QtWidgets.QTreeWidgetItem, data: Track | Video | Album | Artist | Mix | Playlist | UserPlaylist, column: int + item: QtWidgets.QTreeWidgetItem, + data: Track | Video | Album | Artist | Mix | Playlist | UserPlaylist | Folder | str, + column: int, ): item.setData(column, QtCore.Qt.ItemDataRole.UserRole, data) @@ -83,7 +86,8 @@ def set_results_media(item: QtWidgets.QTreeWidgetItem, media: Track | Video | Al def set_user_list_media( - item: QtWidgets.QTreeWidgetItem, media: Track | Video | Album | Artist | Mix | Playlist | UserPlaylist + item: QtWidgets.QTreeWidgetItem, + media: Track | Video | Album | Artist | Mix | Playlist | UserPlaylist | Folder | str, ): set_table_data(item, media, 1) diff --git a/tidal_dl_ng/helper/tidal.py b/tidal_dl_ng/helper/tidal.py index 458af49..586e196 100644 --- a/tidal_dl_ng/helper/tidal.py +++ b/tidal_dl_ng/helper/tidal.py @@ -193,12 +193,42 @@ def paginate_results(func_get_items_media: [Callable]) -> [Track | Video | Album return result -def user_media_lists(session: Session) -> [Playlist | UserPlaylist | Mix]: - user_playlists: [Playlist | UserPlaylist] = paginate_results([session.user.playlist_and_favorite_playlists]) - user_mixes: [Mix] = session.mixes().categories[0].items - result: [Playlist | UserPlaylist | Mix] = user_playlists + user_mixes +def user_media_lists(session: Session) -> dict[str, list]: + """Fetch user media lists using tidalapi's built-in pagination where available. - return result + Returns a dictionary with 'playlists' and 'mixes' keys containing lists of media items. + For playlists, includes both Folder and Playlist objects at the root level. + + Args: + session (Session): TIDAL session object. + + Returns: + dict[str, list]: Dictionary with 'playlists' (includes Folder and Playlist) and 'mixes' lists. + """ + # Use built-in pagination for playlists (root level only) + playlists = session.user.favorites.playlists_paginated() + + # Fetch root-level folders manually (no paginated version available) + folders = [] + offset = 0 + limit = 50 + + while True: + batch = session.user.favorites.playlist_folders(limit=limit, offset=offset, parent_folder_id="root") + if not batch: + break + folders.extend(batch) + if len(batch) < limit: + break + offset += limit + + # Combine folders and playlists + all_playlists = folders + playlists + + # Get mixes + user_mixes = session.mixes().categories[0].items + + return {"playlists": all_playlists, "mixes": user_mixes} def instantiate_media( |
