block_entity.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from typing import TYPE_CHECKING, Optional, Union
  2. from yandex_music import (
  3. Album,
  4. ChartItem,
  5. GeneratedPlaylist,
  6. MixLink,
  7. PlayContext,
  8. Playlist,
  9. Promotion,
  10. YandexMusicModel,
  11. )
  12. from yandex_music.utils import model
  13. if TYPE_CHECKING:
  14. from yandex_music import ClientType, JSONType, MapTypeToDeJson
  15. _TYPE_TO_DE_JSON_DEF: 'MapTypeToDeJson' = {
  16. 'personal-playlist': GeneratedPlaylist.de_json,
  17. 'promotion': Promotion.de_json,
  18. 'album': Album.de_json,
  19. 'playlist': Playlist.de_json,
  20. 'chart-item': ChartItem.de_json,
  21. 'play-context': PlayContext.de_json,
  22. 'mix-link': MixLink.de_json,
  23. }
  24. @model
  25. class BlockEntity(YandexMusicModel):
  26. """Класс, представляющий содержимое блока.
  27. Note:
  28. В зависимости от поля `type_`, в поле `data` будет объект соответствующего типа.
  29. Известные значения поля `type_`: `personal-playlist`, `promotion`, `album`, `playlist`, `chart-item`,
  30. `play-context`, `mix-link`.
  31. Attributes:
  32. id (:obj:`str`): Уникальный идентификатор содержимого.
  33. type (:obj:`str`): Тип содержимого.
  34. data (:obj:`yandex_music.GeneratedPlaylist` | :obj:`yandex_music.Promotion` | :obj:`yandex_music.Album` |
  35. :obj:`yandex_music.Playlist` | :obj:`yandex_music.ChartItem` | :obj:`yandex_music.PlayContext` |
  36. :obj:`yandex_music.MixLink`): Содержимое.
  37. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  38. """
  39. id: str
  40. type: str
  41. data: Union['GeneratedPlaylist', 'Promotion', 'Album', 'Playlist', 'ChartItem', 'PlayContext', 'MixLink']
  42. client: Optional['ClientType'] = None
  43. def __post_init__(self) -> None:
  44. self._id_attrs = (self.id, self.type, self.data)
  45. @classmethod
  46. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['BlockEntity']:
  47. """Десериализация объекта.
  48. Args:
  49. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  50. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  51. Returns:
  52. :obj:`yandex_music.BlockEntity`: Сущность (объект) блока.
  53. """
  54. if not cls.is_dict_model_data(data):
  55. return None
  56. cls_data = cls.cleanup_data(data, client)
  57. type_ = data.get('type')
  58. if isinstance(type_, str) and type_ in _TYPE_TO_DE_JSON_DEF:
  59. de_json_def = _TYPE_TO_DE_JSON_DEF[type_]
  60. cls_data['data'] = de_json_def(data.get('data'), client)
  61. return cls(client=client, **cls_data) # type: ignore