event.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from dataclasses import field
  2. from typing import TYPE_CHECKING, List, Optional
  3. from yandex_music import YandexMusicModel
  4. from yandex_music.utils import model
  5. if TYPE_CHECKING:
  6. from yandex_music import AlbumEvent, ArtistEvent, ClientType, JSONType, Track
  7. @model
  8. class Event(YandexMusicModel):
  9. """Класс, представляющий событие фида.
  10. Note:
  11. Известные значения поля `type`: `tracks`, `artists`, `albums`, `notification`.
  12. Поле `message` заполнено только когда `type` равен `notification`.
  13. Примером значения поля `type_for_from` может служить `recommended-similar-artists`.
  14. Наличие данных в `tracks`, `albums`, `artists` напрямую зависит от `type`.
  15. Attributes:
  16. id (:obj:`str`): Уникальный идентификатор события.
  17. type (:obj:`str`): Тип события.
  18. type_for_from (:obj:`str`, optional): Откуда пришло событие.
  19. title (:obj:`str`, optional): Заголовок.
  20. tracks (:obj:`list` из :obj:`yandex_music.Track`, optional): Список треков.
  21. artists (:obj:`list` из :obj:`yandex_music.ArtistEvent`, optional): Список артистов с похожими и популярными
  22. треками.
  23. albums (:obj:`list` из :obj:`yandex_music.AlbumEvent`, optional): Список альбомов с треками.
  24. message (:obj:`str`, optional): Сообщение уведомления.
  25. device (:obj:`str`, optional): Устройство, с которого пришло уведомление.
  26. tracks_count (:obj:`int`, optional): Количество треков (возможно, уже не используется).
  27. genre (:obj:`str`, optional): Жанр треков.
  28. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  29. """
  30. id: str
  31. type: str
  32. type_for_from: Optional[str] = None
  33. title: Optional[str] = None
  34. tracks: List['Track'] = field(default_factory=list)
  35. artists: List['ArtistEvent'] = field(default_factory=list)
  36. albums: List['AlbumEvent'] = field(default_factory=list)
  37. message: Optional[str] = None
  38. device: Optional[str] = None
  39. tracks_count: Optional[int] = None
  40. genre: Optional[str] = None
  41. client: Optional['ClientType'] = None
  42. def __post_init__(self) -> None:
  43. self._id_attrs = (self.id, self.type)
  44. @classmethod
  45. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Event']:
  46. """Десериализация объекта.
  47. Args:
  48. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  49. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  50. Returns:
  51. :obj:`yandex_music.Event`: Событие фида.
  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 AlbumEvent, ArtistEvent, Track
  57. cls_data['tracks'] = Track.de_list(data.get('tracks'), client)
  58. cls_data['albums'] = AlbumEvent.de_list(data.get('albums'), client)
  59. cls_data['artists'] = ArtistEvent.de_list(data.get('artists'), client)
  60. return cls(client=client, **cls_data) # type: ignore