genre.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from dataclasses import field
  2. from typing import TYPE_CHECKING, Dict, List, Optional
  3. from yandex_music import YandexMusicModel
  4. from yandex_music.utils import model
  5. if TYPE_CHECKING:
  6. from yandex_music import ClientType, Icon, Images, JSONType, Title
  7. @model
  8. class Genre(YandexMusicModel):
  9. """Класс, представляющий жанр музыки.
  10. Attributes:
  11. id (:obj:`str`): Уникальный идентификатор жанра.
  12. weight (:obj:`int`): Вес TODO (возможно, чем выше показатель, тем больше нравится пользователю).
  13. composer_top (:obj:`bool`): TODO.
  14. title (:obj:`str`): Заголовок жанра.
  15. titles (:obj:`dict`): Словарь заголовков на разных языках, где ключ - язык.
  16. images (:obj:`yandex_music.Images`): Изображение жанра.
  17. show_in_menu (:obj:`bool`): Показывать в меню.
  18. show_in_regions (:obj:`list` из :obj:`int`, optional): Список регионов в которых отображается жанр в списках.
  19. full_title (:obj:`str`, optional): Полный заголовок.
  20. url_part (:obj:`str`, optional): Часть ссылки на жанр для открытия в браузере.
  21. color (:obj:`str`, optional): Цвет фона изображения.
  22. radio_icon (:obj:`yandex_music.Icon`, optional): Иконка радио жанра.
  23. sub_genres (:obj:`list` из :obj:`yandex_music.Genre`, optional): Поджанры текущего жанра музыки.
  24. hide_in_regions (:obj:`list`, optional): В каких регионах скрывать жанр.
  25. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  26. """
  27. id: str
  28. weight: int
  29. composer_top: bool
  30. title: str
  31. titles: Dict[str, Optional['Title']]
  32. images: Optional['Images']
  33. show_in_menu: bool
  34. show_in_regions: Optional[List[int]] = None
  35. full_title: Optional[str] = None
  36. url_part: Optional[str] = None
  37. color: Optional[str] = None
  38. radio_icon: Optional['Icon'] = None
  39. sub_genres: List['Genre'] = field(default_factory=list)
  40. hide_in_regions = None
  41. client: Optional['ClientType'] = None
  42. def __post_init__(self) -> None:
  43. self._id_attrs = (self.id, self.weight, self.composer_top, self.title, self.images, self.show_in_menu)
  44. @classmethod
  45. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Genre']:
  46. """Десериализация объекта.
  47. Args:
  48. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  49. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  50. Returns:
  51. :obj:`yandex_music.Genre`: Жанр музыки.
  52. """
  53. if not cls.is_dict_model_data(data):
  54. return None
  55. cls_data = cls.cleanup_data(data, client)
  56. from yandex_music import Icon, Images, Title
  57. cls_data['titles'] = Title.de_dict(data.get('titles'), client) # type: ignore особенный случай
  58. cls_data['images'] = Images.de_json(data.get('images'), client)
  59. cls_data['radio_icon'] = Icon.de_json(data.get('radio_icon'), client)
  60. cls_data['sub_genres'] = Genre.de_list(data.get('sub_genres'), client)
  61. return cls(client=client, **cls_data) # type: ignore