Skip to content

Commit 1c6f166

Browse files
committed
Implement sorting for remaining favourites + playlists
1 parent d22cd16 commit 1c6f166

File tree

3 files changed

+163
-22
lines changed

3 files changed

+163
-22
lines changed

tidalapi/playlist.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from typing import TYPE_CHECKING, List, Optional, Sequence, Union, cast
2424

2525
from tidalapi.exceptions import ObjectNotFound, TooManyRequests
26-
from tidalapi.types import JsonObj
26+
from tidalapi.types import JsonObj, ItemOrder, OrderDirection
2727
from tidalapi.user import LoggedInUser
2828

2929
if TYPE_CHECKING:
@@ -159,14 +159,30 @@ def parse_factory(self, json_obj: JsonObj) -> "Playlist":
159159
self.parse(json_obj)
160160
return copy.copy(self.factory())
161161

162-
def tracks(self, limit: Optional[int] = None, offset: int = 0) -> List["Track"]:
162+
def tracks(
163+
self,
164+
limit: Optional[int] = None,
165+
offset: int = 0,
166+
order: Optional[ItemOrder] = None,
167+
order_direction: Optional[OrderDirection] = None,
168+
) -> List["Track"]:
163169
"""Gets the playlists' tracks from TIDAL.
164170
165171
:param limit: The amount of items you want returned.
166172
:param offset: The index of the first item you want included.
173+
:param order: Optional; A :class:`ItemOrder` describing the ordering type when returning the playlist tracks. eg.: "NAME, "DATE"
174+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
167175
:return: A list of :class:`Tracks <.Track>`
168176
"""
169-
params = {"limit": limit, "offset": offset}
177+
params = {
178+
"limit": limit,
179+
"offset": offset,
180+
}
181+
if order:
182+
params["order"] = order.value
183+
if order_direction:
184+
params["orderDirection"] = order_direction.value
185+
170186
request = self.request.request(
171187
"GET", self._base_url % self.id + "/tracks", params=params
172188
)
@@ -177,14 +193,27 @@ def tracks(self, limit: Optional[int] = None, offset: int = 0) -> List["Track"]:
177193
)
178194
)
179195

180-
def items(self, limit: int = 100, offset: int = 0) -> List[Union["Track", "Video"]]:
196+
def items(
197+
self,
198+
limit: int = 100,
199+
offset: int = 0,
200+
order: Optional[ItemOrder] = None,
201+
order_direction: Optional[OrderDirection] = None,
202+
) -> List[Union["Track", "Video"]]:
181203
"""Fetches up to the first 100 items, including tracks and videos.
182204
183205
:param limit: The amount of items you want, up to 100.
184206
:param offset: The index of the first item you want returned
207+
:param order: Optional; A :class:`ItemOrder` describing the ordering type when returning the playlist items. eg.: "NAME, "DATE"
208+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
185209
:return: A list of :class:`Tracks<.Track>` and :class:`Videos<.Video>`
186210
"""
187211
params = {"limit": limit, "offset": offset}
212+
if order:
213+
params["order"] = order.value
214+
if order_direction:
215+
params["orderDirection"] = order_direction.value
216+
188217
request = self.request.request(
189218
"GET", self._base_url % self.id + "/items", params=params
190219
)

tidalapi/types.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,42 @@
11
# Copyright (C) 2023- The Tidalapi Developers
22

3+
from enum import Enum
34
from typing import Any, Dict
45

56
JsonObj = Dict[str, Any]
7+
8+
class AlbumOrder(Enum):
9+
Artist = "ARTIST"
10+
DateAdded = "DATE"
11+
Name = "NAME"
12+
ReleaseDate = "RELEASE_DATE"
13+
14+
class ArtistOrder(Enum):
15+
DateAdded = "DATE"
16+
Name = "NAME"
17+
18+
class ItemOrder(Enum):
19+
Album = "ALBUM"
20+
Artist = "ARTIST"
21+
Date = "DATE"
22+
Index = "INDEX"
23+
Length = "LENGTH"
24+
Name = "NAME"
25+
26+
class MixOrder(Enum):
27+
DateAdded = "DATE"
28+
MixType = "MIX_TYPE"
29+
Name = "NAME"
30+
31+
class PlaylistOrder(Enum):
32+
DateCreated = "DATE"
33+
Name = "NAME"
34+
35+
class VideoOrder(Enum):
36+
Artist = "ARTIST"
37+
DateAdded = "DATE"
38+
Name = "NAME"
39+
40+
class OrderDirection(Enum):
41+
Ascending = "ASC"
42+
Descending = "DESC"

tidalapi/user.py

Lines changed: 93 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from urllib.parse import urljoin
2828

2929
from tidalapi.exceptions import ObjectNotFound
30-
from tidalapi.types import JsonObj
30+
from tidalapi.types import JsonObj, AlbumOrder, ItemOrder, OrderDirection, PlaylistOrder, ArtistOrder, MixOrder, VideoOrder
3131

3232
if TYPE_CHECKING:
3333
from tidalapi.album import Album
@@ -448,12 +448,27 @@ def remove_folders_playlists(self, trns: [str], type: str = "folder") -> bool:
448448
params=params,
449449
).ok
450450

451-
def artists(self, limit: Optional[int] = None, offset: int = 0) -> List["Artist"]:
451+
def artists(
452+
self,
453+
limit: Optional[int] = None,
454+
offset: int = 0,
455+
order: Optional[ArtistOrder] = None,
456+
order_direction: Optional[OrderDirection] = None,
457+
) -> List["Artist"]:
452458
"""Get the users favorite artists.
453459
460+
:param limit: Optional; The amount of artists you want returned.
461+
:param offset: The index of the first artist you want included.
462+
:param order: Optional; A :class:`ArtistOrder` describing the ordering type when returning the user favorite artists. eg.: "NAME, "DATE"
463+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
454464
:return: A :class:`list` of :class:`~tidalapi.artist.Artist` objects containing the favorite artists.
455465
"""
456466
params = {"limit": limit, "offset": offset}
467+
if order:
468+
params["order"] = order.value
469+
if order_direction:
470+
params["orderDirection"] = order_direction.value
471+
457472
return cast(
458473
List["Artist"],
459474
self.requests.map_request(
@@ -463,12 +478,27 @@ def artists(self, limit: Optional[int] = None, offset: int = 0) -> List["Artist"
463478
),
464479
)
465480

466-
def albums(self, limit: Optional[int] = None, offset: int = 0) -> List["Album"]:
481+
def albums(
482+
self,
483+
limit: Optional[int] = None,
484+
offset: int = 0,
485+
order: Optional[AlbumOrder] = None,
486+
order_direction: Optional[OrderDirection] = None,
487+
) -> List["Album"]:
467488
"""Get the users favorite albums.
468489
490+
:param limit: Optional; The amount of albums you want returned.
491+
:param offset: The index of the first album you want included.
492+
:param order: Optional; A :class:`AlbumOrder` describing the ordering type when returning the user favorite albums. eg.: "NAME, "DATE"
493+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
469494
:return: A :class:`list` of :class:`~tidalapi.album.Album` objects containing the favorite albums.
470495
"""
471496
params = {"limit": limit, "offset": offset}
497+
if order:
498+
params["order"] = order.value
499+
if order_direction:
500+
params["orderDirection"] = order_direction.value
501+
472502
return cast(
473503
List["Album"],
474504
self.requests.map_request(
@@ -477,13 +507,26 @@ def albums(self, limit: Optional[int] = None, offset: int = 0) -> List["Album"]:
477507
)
478508

479509
def playlists(
480-
self, limit: Optional[int] = None, offset: int = 0
510+
self,
511+
limit: Optional[int] = None,
512+
offset: int = 0,
513+
order: Optional[PlaylistOrder] = None,
514+
order_direction: Optional[OrderDirection] = None,
481515
) -> List["Playlist"]:
482516
"""Get the users favorite playlists.
483517
518+
:param limit: Optional; The amount of playlists you want returned.
519+
:param offset: The index of the first playlist you want included.
520+
:param order: Optional; A :class:`PlaylistOrder` describing the ordering type when returning the user favorite playlists. eg.: "NAME, "DATE"
521+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
484522
:return: A :class:`list` :class:`~tidalapi.playlist.Playlist` objects containing the favorite playlists.
485523
"""
486524
params = {"limit": limit, "offset": offset}
525+
if order:
526+
params["order"] = order.value
527+
if order_direction:
528+
params["orderDirection"] = order_direction.value
529+
487530
return cast(
488531
List["Playlist"],
489532
self.requests.map_request(
@@ -497,23 +540,22 @@ def tracks(
497540
self,
498541
limit: Optional[int] = None,
499542
offset: int = 0,
500-
order: str = "NAME",
501-
order_direction: str = "ASC",
543+
order: Optional[ItemOrder] = None,
544+
order_direction: Optional[OrderDirection] = None,
502545
) -> List["Track"]:
503546
"""Get the users favorite tracks.
504547
505548
:param limit: Optional; The amount of items you want returned.
506549
:param offset: The index of the first item you want included.
507-
:param order: A :class:`str` describing the ordering type when returning the user favorite tracks. eg.: "NAME, "DATE"
508-
:param order_direction: A :class:`str` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
550+
:param order: Optional; A :class:`ItemOrder` describing the ordering type when returning the user favorite tracks. eg.: "NAME, "DATE"
551+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
509552
:return: A :class:`list` of :class:`~tidalapi.media.Track` objects containing all of the favorite tracks.
510553
"""
511-
params = {
512-
"limit": limit,
513-
"offset": offset,
514-
"order": order,
515-
"orderDirection": order_direction,
516-
}
554+
params = {"limit": limit, "offset": offset}
555+
if order:
556+
params["order"] = order.value
557+
if order_direction:
558+
params["orderDirection"] = order_direction.value
517559

518560
return cast(
519561
List["Track"],
@@ -522,24 +564,57 @@ def tracks(
522564
),
523565
)
524566

525-
def videos(self) -> List["Video"]:
567+
def videos(
568+
self,
569+
limit: Optional[int] = None,
570+
offset: int = 0,
571+
order: Optional[VideoOrder] = None,
572+
order_direction: Optional[OrderDirection] = None,
573+
) -> List["Video"]:
526574
"""Get the users favorite videos.
527575
576+
:param limit: Optional; The amount of videos you want returned.
577+
:param offset: The index of the first video you want included.
578+
:param order: Optional; A :class:`VideoOrder` describing the ordering type when returning the user favorite videos. eg.: "NAME, "DATE"
579+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
528580
:return: A :class:`list` of :class:`~tidalapi.media.Video` objects containing all the favorite videos
529581
"""
582+
params = {"limit": limit, "offset": offset}
583+
if order:
584+
params["order"] = order.value
585+
if order_direction:
586+
params["orderDirection"] = order_direction.value
587+
530588
return cast(
531589
List["Video"],
532-
self.requests.get_items(
533-
f"{self.base_url}/videos", parse=self.session.parse_media
590+
self.requests.map_request(
591+
f"{self.base_url}/videos",
592+
params=params,
593+
parse=self.session.parse_media,
534594
),
535595
)
536596

537-
def mixes(self, limit: Optional[int] = 50, offset: int = 0) -> List["MixV2"]:
597+
def mixes(
598+
self,
599+
limit: Optional[int] = 50,
600+
offset: int = 0,
601+
order: Optional[MixOrder] = None,
602+
order_direction: Optional[OrderDirection] = None,
603+
) -> List["MixV2"]:
538604
"""Get the users favorite mixes & radio.
539605
606+
:param limit: Optional; The amount of mixes you want returned.
607+
:param offset: The index of the first mix you want included.
608+
:param order: Optional; A :class:`MixOrder` describing the ordering type when returning the user favorite mixes. eg.: "NAME, "DATE"
609+
:param order_direction: Optional; A :class:`OrderDirection` describing the ordering direction when sorting by `order`. eg.: "ASC", "DESC"
540610
:return: A :class:`list` of :class:`~tidalapi.media.Mix` objects containing the user favourite mixes & radio
541611
"""
542612
params = {"limit": limit, "offset": offset}
613+
if order:
614+
params["order"] = order.value
615+
if order_direction:
616+
params["orderDirection"] = order_direction.value
617+
543618
return cast(
544619
List["MixV2"],
545620
self.requests.map_request(

0 commit comments

Comments
 (0)