From 9681487c9a813e14b24d5485b53dd2ac1714ecd2 Mon Sep 17 00:00:00 2001 From: Il`ya Date: Fri, 24 Jan 2020 17:47:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=B5=D1=81=D0=B5=D1=80=D0=B8=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=88=D0=BE=D1=82?= =?UTF-8?q?=20=D0=B8=D0=B2=D0=B5=D0=BD=D1=82=D0=B0.=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=B0=D1=83=D0=B4=D0=B8=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20=D1=88=D0=BE=D1=82=D0=B0.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F.?= =?UTF-8?q?=20#185?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yandex_music/client.py | 13 ++++++++++--- yandex_music/shot/shot_data.py | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/yandex_music/client.py b/yandex_music/client.py index f2d262a..f6ead99 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -1229,18 +1229,25 @@ class Client(YandexMusicObject): return self._dislike_action(track_ids, True, user_id, timeout, *args, **kwargs) @log - def after_track(self, prev_track_id: Union[str, int], next_track_id: Union[str, int], context_item: str, + def after_track(self, next_track_id: Union[str, int], context_item: str, prev_track_id: Union[str, int] = None, context: str = 'playlist', types: str = 'shot', from_: str = 'mobile-landing-origin-default', timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ShotEvent]: """Получение рекламы или шота от Алисы после трека. + При получения шота от Алисы `prev_track_id` можно не указывать. + + Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`. + Плейлист с Алисой имеет владельца с `id = 940441070`. + + ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя. + Известные значения `context`: `playlist`. Известные значения `types`: `shot`, `ad`. Args: prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека. next_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор следующего трека. - context_item (:obj:`str`): TODO (уникальный идентификатор контекста). + context_item (:obj:`str`): Уникальный идентификатор контекста. context (:obj:`str`, optional): Место, откуда было вызвано получение. types (:obj:`str`, optional): Тип того, что вернуть после трека. from_ (:obj:`str`, optional): Место, с которого попали в контекст. @@ -1270,7 +1277,7 @@ class Client(YandexMusicObject): result = self._request.get(url, params=params, timeout=timeout, *args, **kwargs) # TODO судя по всему эндпоинт ещё возвращает рекламу после треков для пользователей без подписки. - return ShotEvent.de_json(result, self) + return ShotEvent.de_json(result.get('shot_event'), self) # camelCase псевдонимы diff --git a/yandex_music/shot/shot_data.py b/yandex_music/shot/shot_data.py index 1ca7526..8123736 100644 --- a/yandex_music/shot/shot_data.py +++ b/yandex_music/shot/shot_data.py @@ -44,6 +44,25 @@ class ShotData(YandexMusicObject): self.client = client self._id_attrs = (self.cover_uri, self.mds_url, self.shot_text, self.shot_type) + def download_cover(self, filename: str, size: str = '200x200') -> None: + """Загрузка обложки. + + Args: + filename (:obj:`str`): Путь для сохранения файла с названием и расширением. + size (:obj:`str`, optional): Размер обложки. + """ + + self.client.request.download(f'https://{self.cover_uri.replace("%%", size)}', filename) + + def download_mds(self, filename: str) -> None: + """Загрузка аудиоверсии шота. + + Args: + filename (:obj:`str`): Путь для сохранения файла с названием и расширением. + """ + + self.client.request.download(self.mds_url, filename) + @classmethod def de_json(cls, data: dict, client: 'Client') -> Optional['ShotData']: """Десериализация объекта. @@ -64,3 +83,10 @@ class ShotData(YandexMusicObject): data['shot_type'] = ShotType.de_json(data.get('shot_type'), client) return cls(client=client, **data) + + # camelCase псевдонимы + + #: Псевдоним для :attr:`download_cover` + downloadCover = download_cover + #: Псевдоним для :attr:`download_mds` + downloadMds = download_mds