summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/helper
diff options
context:
space:
mode:
authorexislow <exislow@users.noreply.github.com>2025-11-12 15:06:18 +0100
committerGitHub <noreply@github.com>2025-11-12 15:06:18 +0100
commitbe59cf1684405fcef475fb8b774ff86e2a8df042 (patch)
tree7df1f6eb74b2896808d800ef94d0b24358e81456 /tidal_dl_ng/helper
parent554a42860e666f85ac99df6c08c10b3a6f16a5be (diff)
parent9baea9b82c539eae693b11416aeb74db434b86ee (diff)
downloadtidal-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.py12
-rw-r--r--tidal_dl_ng/helper/tidal.py40
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(