From 16aae08b075d5731c75d2bac3bac099e65dcc3a0 Mon Sep 17 00:00:00 2001 From: Il`ya Date: Sat, 25 Jan 2020 19:46:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20TracksSimilar=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=BE=D0=BB=D1=8F=D0=BC=D0=B8=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=B0=20=D0=B8=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D1=85=D0=BE=D0=B6=D0=B8=D1=85=20=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D0=BE=D0=B2.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=85=D0=BE=D0=B6=D0=B8=D1=85=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BA=D0=BE=D0=B2.=20#197?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yandex_music/__init__.py | 3 ++- yandex_music/client.py | 11 +++++++++- yandex_music/track/tracks_similar.py | 31 ++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 yandex_music/track/tracks_similar.py 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)