Исправлена десериализация шот ивента.
Добавлены методы для загрузки обложки и аудиоверсии шота. Дополнена документация. #185
このコミットが含まれているのは:
コミット
9681487c9a
|
@ -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 псевдонимы
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
読み込み中…
新しいイシューから参照