diff --git a/yandex_music/__init__.py b/yandex_music/__init__.py index f5d2c01..c70a79c 100644 --- a/yandex_music/__init__.py +++ b/yandex_music/__init__.py @@ -44,6 +44,7 @@ from .tracks_list import TracksList from .track.major import Major from .track.normalization import Normalization from .track.track import Track +from .track.tracks_similar import TracksSimilar from .likes.albums_likes import AlbumsLikes from .likes.artists_likes import ArtistsLikes @@ -119,4 +120,4 @@ __all__ = ['YandexMusicObject', 'Client', 'Account', 'PassportPhone', 'Invocatio 'Icon', 'Images', 'Id', 'Station', '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'] + 'PlaylistAbsence', 'Shot', 'ShotEvent', 'ShotType', 'ShotData', 'TracksSimilar'] diff --git a/yandex_music/client.py b/yandex_music/client.py index 795c4d7..45a445e 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -6,7 +6,7 @@ from typing import Callable, Union, List, Optional from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \ TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \ Suggestions, Landing, Genre, Dashboard, StationResult, StationTracksResult, BriefInfo, Supplement, ArtistTracks, \ - ArtistAlbums, ShotEvent + ArtistAlbums, ShotEvent, TracksSimilar from yandex_music.utils.request import Request from yandex_music.utils.difference import Difference from yandex_music.exceptions import InvalidToken, Captcha @@ -465,6 +465,15 @@ class Client(YandexMusicObject): return Supplement.de_json(result, self) + @log + def tracks_similar(self, track_id: Union[str, int], timeout: Union[int, float] = None, + *args, **kwargs) -> Optional: + url = f'{self.base_url}/tracks/{track_id}/similar' + + result = self._request.get(url, timeout=timeout, *args, **kwargs) + + return TracksSimilar.de_json(result, self) + @log def play_audio(self, track_id: Union[str, int], diff --git a/yandex_music/track/tracks_similar.py b/yandex_music/track/tracks_similar.py new file mode 100644 index 0000000..c9e3e73 --- /dev/null +++ b/yandex_music/track/tracks_similar.py @@ -0,0 +1,31 @@ +from typing import TYPE_CHECKING, Optional, List + +if TYPE_CHECKING: + from yandex_music import Client, Track + +from yandex_music import YandexMusicObject + + +class TracksSimilar(YandexMusicObject): + def __init__(self, + track: Optional['Track'], + similar_tracks: List['Track'], + client: Optional['Client'] = None, + **kwargs) -> None: + self.track = track + self.similar_tracks = similar_tracks + + self.client = client + self._id_attrs = (self.track, self.similar_tracks) + + @classmethod + def de_json(cls, data: dict, client: 'Client') -> Optional['TracksSimilar']: + if not data: + return None + + data = super(TracksSimilar, cls).de_json(data, client) + from yandex_music import Track + data['track'] = Track.de_json(data.get('track'), client) + data['similar_tracks'] = Track.de_list(data.get('similar_tracks'), client) + + return cls(client=client, **data)