brief_info.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from dataclasses import field
  2. from typing import TYPE_CHECKING, Any, List, Optional
  3. from yandex_music import YandexMusicModel
  4. from yandex_music.utils import model
  5. if TYPE_CHECKING:
  6. from yandex_music import (
  7. Album,
  8. Artist,
  9. Chart,
  10. ClientType,
  11. Cover,
  12. JSONType,
  13. Playlist,
  14. PlaylistId,
  15. Stats,
  16. Track,
  17. Video,
  18. Vinyl,
  19. )
  20. @model
  21. class BriefInfo(YandexMusicModel):
  22. """Класс, представляющий информацию об артисте.
  23. Attributes:
  24. artist (:obj:`yandex_music.Artist` | :obj:`None`): Артист.
  25. albums (:obj:`list` из :obj:`yandex_music.Album`): Альбомы.
  26. playlists (:obj:`list` из :obj:`yandex_music.Playlist`): Плейлисты.
  27. also_albums (:obj:`list` из :obj:`yandex_music.Album`): Сборники.
  28. last_release_ids (:obj:`list` из :obj:`int`): Уникальные идентификаторы последних выпущенных альбомов.
  29. last_releases (:obj:`list` из :obj:`yandex_music.Album`, optional): Последние выпущенные альбомы.
  30. popular_tracks (:obj:`list` из :obj:`yandex_music.Track`): Популярные треки.
  31. similar_artists (:obj:`list` из :obj:`yandex_music.Artist`): Похожие артисты.
  32. all_covers (:obj:`list` из :obj:`yandex_music.Cover`): Все обложки.
  33. concerts (:obj:`str`): Концерты (тест-кейс с ними потерялся, мало у кого есть).
  34. videos (:obj:`list` из :obj:`yandex_music.Video`): Видео.
  35. vinyls (:obj:`list` из :obj:`yandex_music.Vinyl`): Пластинки.
  36. has_promotions (:obj:`bool`): Рекламируется ли TODO.
  37. playlist_ids (:obj:`list` из :obj:`yandex_music.PlaylistId`): Уникальные идентификаторы плейлистов.
  38. stats (:obj:`yandex_music.Stats`, optional): Статистика прослушиваний за месяц.
  39. tracks_in_chart (:obj:`list` из :obj:`yandex_music.Chart`, optional): Треки в чарте.
  40. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  41. """
  42. artist: Optional['Artist']
  43. albums: List['Album']
  44. playlists: List['Playlist']
  45. also_albums: List['Album']
  46. last_release_ids: List[int]
  47. last_releases: List['Album']
  48. popular_tracks: List['Track']
  49. similar_artists: List['Artist']
  50. all_covers: List['Cover']
  51. concerts: Any
  52. videos: List['Video']
  53. vinyls: List['Vinyl']
  54. has_promotions: bool
  55. playlist_ids: List['PlaylistId']
  56. stats: Optional['Stats'] = None
  57. tracks_in_chart: List['Chart'] = field(default_factory=list)
  58. client: Optional['ClientType'] = None
  59. def __post_init__(self) -> None:
  60. self._id_attrs = (
  61. self.artist,
  62. self.albums,
  63. self.playlists,
  64. self.also_albums,
  65. self.last_release_ids,
  66. self.popular_tracks,
  67. self.similar_artists,
  68. self.all_covers,
  69. self.concerts,
  70. self.videos,
  71. self.vinyls,
  72. self.has_promotions,
  73. self.playlist_ids,
  74. )
  75. @classmethod
  76. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['BriefInfo']:
  77. """Десериализация объекта.
  78. Args:
  79. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  80. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  81. Returns:
  82. :obj:`yandex_music.BriefInfo`: Информация об артисте.
  83. """
  84. if not cls.is_dict_model_data(data):
  85. return None
  86. cls_data = cls.cleanup_data(data, client)
  87. from yandex_music import Album, Artist, Chart, Cover, Playlist, PlaylistId, Stats, Track, Video, Vinyl
  88. cls_data['playlists'] = Playlist.de_list(data.get('playlists'), client)
  89. cls_data['artist'] = Artist.de_json(data.get('artist'), client)
  90. cls_data['similar_artists'] = Artist.de_list(data.get('similar_artists'), client)
  91. cls_data['popular_tracks'] = Track.de_list(data.get('popular_tracks'), client)
  92. cls_data['albums'] = Album.de_list(data.get('albums'), client)
  93. cls_data['also_albums'] = Album.de_list(data.get('also_albums'), client)
  94. cls_data['last_releases'] = Album.de_list(data.get('last_releases'), client)
  95. cls_data['all_covers'] = Cover.de_list(data.get('all_covers'), client)
  96. cls_data['playlist_ids'] = PlaylistId.de_list(data.get('playlist_ids'), client)
  97. cls_data['videos'] = Video.de_list(data.get('videos'), client)
  98. cls_data['tracks_in_chart'] = Chart.de_list(data.get('tracks_in_chart'), client)
  99. cls_data['vinyls'] = Vinyl.de_list(data.get('vinyls'), client)
  100. cls_data['stats'] = Stats.de_json(data.get('stats'), client)
  101. return cls(client=client, **cls_data) # type: ignore