diff --git a/yandex_music/__init__.py b/yandex_music/__init__.py index 1416049..5b99b8f 100644 --- a/yandex_music/__init__.py +++ b/yandex_music/__init__.py @@ -36,6 +36,7 @@ from .playlist.play_counter import PlayCounter from .playlist.playlist_id import PlaylistId from .playlist.playlist_absence import PlaylistAbsence from .playlist.playlist import Playlist +from .playlist.playlists_recommendations import PlaylistsRecommendations from .shot.shot_type import ShotType from .shot.shot_data import ShotData @@ -119,4 +120,4 @@ __all__ = ['YandexMusicObject', 'Client', 'Account', 'PassportPhone', 'Invocatio 'Dashboard', 'RotorSettings', 'AdParams', 'Restrictions', 'Value', 'Enum', 'DiscreteScale', 'StationResult', 'Sequence', 'StationTracksResult', 'BriefInfo', 'Description', 'PlaylistId', 'Vinyl', 'Supplement', 'Lyrics', 'VideoSupplement', 'ArtistTracks', 'Pager', 'ArtistAlbums', 'PlaylistAbsence', 'Shot', 'ShotEvent', - 'ShotType', 'ShotData', 'SimilarTracks', 'UserSettings', 'RenewableRemainder'] + 'ShotType', 'ShotData', 'SimilarTracks', 'UserSettings', 'RenewableRemainder', 'PlaylistsRecommendations'] diff --git a/yandex_music/client.py b/yandex_music/client.py index 404a81c..30abb4a 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -6,7 +6,7 @@ from typing import Callable, Dict, List, Optional, Union from yandex_music import Album, Artist, ArtistAlbums, ArtistTracks, BriefInfo, Dashboard, DownloadInfo, Experiments, \ Feed, Genre, Landing, Like, PermissionAlerts, Playlist, PromoCodeStatus, Search, Settings, ShotEvent, SimilarTracks, \ StationResult, StationTracksResult, Status, Suggestions, Supplement, Track, TracksList, UserSettings, \ - YandexMusicObject + YandexMusicObject, PlaylistsRecommendations from yandex_music.exceptions import Captcha, InvalidToken from yandex_music.utils.difference import Difference from yandex_music.utils.request import Request @@ -764,6 +764,19 @@ class Client(YandexMusicObject): return Playlist.de_json(result, self) + @log + def users_playlists_recommendations(self, kind: Union[List[Union[str, int]], str, int], + user_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, + **kwargs): + if user_id is None and self.me is not None: + user_id = self.me.account.uid + + url = f'{self.base_url}/users/{user_id}/playlists/{kind}/recommendations' + + result = self._request.get(url, timeout=timeout, *args, **kwargs) + + return PlaylistsRecommendations.de_json(result, self) + @log def users_playlists_create(self, title: str, visibility: str = 'public', user_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: diff --git a/yandex_music/playlist/playlists_recommendations.py b/yandex_music/playlist/playlists_recommendations.py new file mode 100644 index 0000000..f41d948 --- /dev/null +++ b/yandex_music/playlist/playlists_recommendations.py @@ -0,0 +1,32 @@ +from typing import TYPE_CHECKING, Optional, List + +from yandex_music import YandexMusicObject + +if TYPE_CHECKING: + from yandex_music import Client, Track + + +class PlaylistsRecommendations(YandexMusicObject): + def __init__(self, + tracks: List['Track'], + batch_id: str = None, + client: Optional['Client'] = None, + **kwargs) -> None: + super().handle_unknown_kwargs(self, **kwargs) + + self.batchId = batch_id + self.tracks = tracks + + self.client = client + self._id_attrs = (self.batchId, self.tracks) + + @classmethod + def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistsRecommendations']: + if not data: + return None + + data = super(PlaylistsRecommendations, cls).de_json(data, client) + from yandex_music import Track + data['tracks'] = Track.de_list(data.get('tracks'), client) + + return cls(client=client, **data)