station.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from typing import TYPE_CHECKING, Optional
  2. from yandex_music import YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, Icon, Id, JSONType, Restrictions
  6. @model
  7. class Station(YandexMusicModel):
  8. """Класс, представляющий станцию.
  9. Note:
  10. `id_for_from` обозначает предка станции, например, жанр, настроение или занятие.
  11. Неизвестно когда используется `id_for_from`, а когда `parent_id`.
  12. Attributes:
  13. id (:obj:`yandex_music.Id`): Уникальный идентификатор станции.
  14. name (:obj:`str`): Название станции.
  15. icon (:obj:`yandex_music.Icon`): Иконка станции.
  16. mts_icon (:obj:`yandex_music.Icon`): Иконка TODO.
  17. geocell_icon (:obj:`yandex_music.Icon`): Иконка TODO.
  18. id_for_from (:obj:`str`): Категория (тип) станции.
  19. restrictions (:obj:`yandex_music.Restrictions`): Ограничения для настроек станции старого формата.
  20. restrictions2 (:obj:`yandex_music.Restrictions`): Ограничения для настроек станции.
  21. full_image_url (:obj:`str`, optional): Ссылка на полное изображение.
  22. mts_full_image_url (:obj:`str`, optional): Ссылка на полную иконку.
  23. parent_id (:obj:`yandex_music.Id`, optional): Уникальный идентификатор станции, являющейся предком текущей.
  24. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  25. """
  26. id: Optional['Id']
  27. name: str
  28. icon: 'Icon'
  29. mts_icon: 'Icon'
  30. geocell_icon: 'Icon'
  31. id_for_from: str
  32. restrictions: 'Restrictions'
  33. restrictions2: 'Restrictions'
  34. full_image_url: Optional[str] = None
  35. mts_full_image_url: Optional[str] = None
  36. parent_id: Optional['Id'] = None
  37. client: Optional['ClientType'] = None
  38. def __post_init__(self) -> None:
  39. self._id_attrs = (
  40. self.id,
  41. self.name,
  42. self.icon,
  43. self.mts_icon,
  44. self.geocell_icon,
  45. self.id_for_from,
  46. self.restrictions,
  47. self.restrictions2,
  48. )
  49. @classmethod
  50. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Station']:
  51. """Десериализация объекта.
  52. Args:
  53. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  54. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  55. Returns:
  56. :obj:`yandex_music.Station`: Станция.
  57. """
  58. if not cls.is_dict_model_data(data):
  59. return None
  60. cls_data = cls.cleanup_data(data, client)
  61. from yandex_music import Icon, Id, Restrictions
  62. cls_data['id'] = Id.de_json(data.get('id'), client)
  63. cls_data['parent_id'] = Id.de_json(data.get('parent_id'), client)
  64. cls_data['icon'] = Icon.de_json(data.get('icon'), client)
  65. cls_data['mts_icon'] = Icon.de_json(data.get('mts_icon'), client)
  66. cls_data['geocell_icon'] = Icon.de_json(data.get('geocell_icon'), client)
  67. cls_data['restrictions'] = Restrictions.de_json(data.get('restrictions'), client)
  68. cls_data['restrictions2'] = Restrictions.de_json(data.get('restrictions2'), client)
  69. return cls(client=client, **cls_data) # type: ignore