Исправлена десериализация шот ивента.

Добавлены методы для загрузки обложки и аудиоверсии шота.
Дополнена документация. #185
このコミットが含まれているのは:
Il`ya 2020-01-24 17:47:50 +03:00
コミット 9681487c9a
2個のファイルの変更36行の追加3行の削除

ファイルの表示

@ -1229,18 +1229,25 @@ class Client(YandexMusicObject):
return self._dislike_action(track_ids, True, user_id, timeout, *args, **kwargs) return self._dislike_action(track_ids, True, user_id, timeout, *args, **kwargs)
@log @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', context: str = 'playlist', types: str = 'shot', from_: str = 'mobile-landing-origin-default',
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ShotEvent]: 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`. Известные значения `context`: `playlist`.
Известные значения `types`: `shot`, `ad`. Известные значения `types`: `shot`, `ad`.
Args: Args:
prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека. prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека.
next_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): Место, откуда было вызвано получение. context (:obj:`str`, optional): Место, откуда было вызвано получение.
types (:obj:`str`, optional): Тип того, что вернуть после трека. types (:obj:`str`, optional): Тип того, что вернуть после трека.
from_ (: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) result = self._request.get(url, params=params, timeout=timeout, *args, **kwargs)
# TODO судя по всему эндпоинт ещё возвращает рекламу после треков для пользователей без подписки. # TODO судя по всему эндпоинт ещё возвращает рекламу после треков для пользователей без подписки.
return ShotEvent.de_json(result, self) return ShotEvent.de_json(result.get('shot_event'), self)
# camelCase псевдонимы # camelCase псевдонимы

ファイルの表示

@ -44,6 +44,25 @@ class ShotData(YandexMusicObject):
self.client = client self.client = client
self._id_attrs = (self.cover_uri, self.mds_url, self.shot_text, self.shot_type) 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 @classmethod
def de_json(cls, data: dict, client: 'Client') -> Optional['ShotData']: 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) data['shot_type'] = ShotType.de_json(data.get('shot_type'), client)
return cls(client=client, **data) return cls(client=client, **data)
# camelCase псевдонимы
#: Псевдоним для :attr:`download_cover`
downloadCover = download_cover
#: Псевдоним для :attr:`download_mds`
downloadMds = download_mds