best.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from typing import TYPE_CHECKING, Optional, Union
  2. from yandex_music import Album, Artist, Playlist, Track, User, Video, YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, JSONType, MapTypeToDeJson
  6. _TYPE_TO_DE_JSON_DEF: 'MapTypeToDeJson' = {
  7. 'track': Track.de_json,
  8. 'artist': Artist.de_json,
  9. 'album': Album.de_json,
  10. 'playlist': Playlist.de_json,
  11. 'video': Video.de_json,
  12. 'user': User.de_json,
  13. 'podcast': Album.de_json,
  14. 'podcast_episode': Track.de_json,
  15. }
  16. @model
  17. class Best(YandexMusicModel):
  18. """Класс, представляющий лучший результат поиска.
  19. Attributes:
  20. type (:obj:`str`): Тип лучшего результата.
  21. result (:obj:`yandex_music.Track` | :obj:`yandex_music.Artist` | :obj:`yandex_music.Album` \
  22. | :obj:`yandex_music.Playlist` | :obj:`yandex_music.Video`): Лучший результат.
  23. text (:obj:`str`, optional): TODO.
  24. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  25. """
  26. type: str
  27. result: Optional[Union[Track, Artist, Album, Playlist, Video]]
  28. text: Optional[str] = None
  29. client: Optional['ClientType'] = None
  30. def __post_init__(self) -> None:
  31. self._id_attrs = (self.type, self.result)
  32. @classmethod
  33. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Best']:
  34. """Десериализация объекта.
  35. Args:
  36. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  37. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  38. Returns:
  39. :obj:`yandex_music.Best`: Лучший результат.
  40. """
  41. if not cls.is_dict_model_data(data):
  42. return None
  43. cls_data = cls.cleanup_data(data, client)
  44. type_ = data.get('type')
  45. if type_ and type_ in _TYPE_TO_DE_JSON_DEF:
  46. de_json = _TYPE_TO_DE_JSON_DEF[type_]
  47. cls_data['result'] = de_json(data.get('result'), client)
  48. return cls(client=client, **cls_data) # type: ignore