like.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from typing import TYPE_CHECKING, Optional
  2. from yandex_music import Album, Artist, Playlist, 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. 'album': Album.de_json,
  8. 'playlist': Playlist.de_json,
  9. }
  10. @model
  11. class Like(YandexMusicModel):
  12. """Класс, представляющий объект с отметкой "мне нравится".
  13. None:
  14. В поле `type` содержится одно из трёх значений: `artist`, `playlist`, `album`. Обозначает поле, в котором
  15. содержится информация.
  16. Attributes:
  17. type (:obj:`str`): Тип объекта с отметкой.
  18. id (:obj:`str`, optional): Уникальный идентификатор отметки.
  19. timestamp (:obj:`str`, optional): Дата и время добавления отметки.
  20. album (:obj:`yandex_music.Album`, optional): Понравившейся альбом.
  21. artist (:obj:`yandex_music.Artist`, optional): Понравившейся артист.
  22. playlist (:obj:`yandex_music.Playlist`, optional): Понравившейся плейлист.
  23. short_description (:obj:`str`, optional): Короткое описание.
  24. description (:obj:`str`, optional): Описание.
  25. is_premiere (:obj:`bool`, optional): Премьера ли.
  26. is_banner (:obj:`bool`, optional): Является ли баннером.
  27. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  28. """
  29. type: str
  30. id: Optional[str] = None
  31. timestamp: Optional[str] = None
  32. album: Optional['Album'] = None
  33. artist: Optional['Artist'] = None
  34. playlist: Optional['Playlist'] = None
  35. short_description: Optional[str] = None
  36. description: Optional[str] = None
  37. is_premiere: Optional[bool] = None
  38. is_banner: Optional[bool] = None
  39. client: Optional['ClientType'] = None
  40. def __post_init__(self) -> None:
  41. self._id_attrs = (self.id, self.type, self.timestamp, self.album, self.artist, self.playlist)
  42. @classmethod
  43. def de_json(cls, data: 'JSONType', client: 'ClientType', type_: Optional[str] = None) -> Optional['Like']:
  44. """Десериализация объекта.
  45. Args:
  46. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  47. type_ (:obj:`str`, optional): Тип объекта с отметкой "мне нравится".
  48. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  49. Returns:
  50. :obj:`yandex_music.Like`: Объект с отметкой "мне нравится".
  51. """
  52. if not cls.is_dict_model_data(data):
  53. return None
  54. cls_data = cls.cleanup_data(data, client)
  55. if type_ == 'artist':
  56. if 'artist' not in data:
  57. temp_data = data.copy()
  58. cls_data.clear()
  59. cls_data[type_] = Artist.de_json(temp_data, client)
  60. else:
  61. cls_data[type_] = Artist.de_json(data.get('artist'), client)
  62. elif type_:
  63. de_json = _TYPE_TO_DE_JSON_DEF[type_]
  64. cls_data[type_] = de_json(data.get(type_), client)
  65. cls_data['type'] = type_
  66. return cls(client=client, **cls_data) # type: ignore