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