search_result.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from typing import TYPE_CHECKING, Dict, Generic, List, Optional, Type, TypeVar, Union
  2. from yandex_music import Album, Artist, Playlist, Track, User, Video, YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, JSONType
  6. T = TypeVar('T', bound=Union[Track, Artist, Album, Playlist, Video, User])
  7. _TYPE_TO_CLASS: Dict[str, Type[YandexMusicModel]] = {
  8. 'track': Track,
  9. 'artist': Artist,
  10. 'album': Album,
  11. 'playlist': Playlist,
  12. 'video': Video,
  13. 'user': User,
  14. 'podcast': Album,
  15. 'podcast_episode': Track,
  16. }
  17. @model
  18. class SearchResult(YandexMusicModel, Generic[T]):
  19. """Класс, представляющий результаты поиска.
  20. Note:
  21. Значения поля `type`: `track`, `artist`, `playlist`, `album`, `video`.
  22. Attributes:
  23. type (:obj:`str`): Тип результата.
  24. total (:obj:`int`): Количество результатов.
  25. per_page (:obj:`int`): Максимальное количество результатов на странице.
  26. order (:obj:`int`): Позиция блока.
  27. results (:obj:`list` из :obj:`yandex_music.Track` | :obj:`yandex_music.Artist` | :obj:`yandex_music.Album` \
  28. | :obj:`yandex_music.Playlist` | :obj:`yandex_music.Video`): Результаты поиска.
  29. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  30. """
  31. type: str
  32. total: int
  33. per_page: int
  34. order: int
  35. results: List[T]
  36. client: Optional['ClientType'] = None
  37. def __post_init__(self) -> None:
  38. self._id_attrs = (self.total, self.per_page, self.order, self.results)
  39. @classmethod
  40. def de_json(
  41. cls, data: 'JSONType', client: 'ClientType', type_: Optional[str] = None
  42. ) -> Optional['SearchResult[T]']:
  43. """Десериализация объекта.
  44. Args:
  45. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  46. type_ (:obj:`str`, optional): Тип результата.
  47. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  48. Returns:
  49. :obj:`yandex_music.SearchResult`: Результаты поиска.
  50. """
  51. if not cls.is_dict_model_data(data):
  52. return None
  53. cls_data = cls.cleanup_data(data, client)
  54. cls_data['type'] = type_
  55. if type_ and type_ in _TYPE_TO_CLASS:
  56. klass = _TYPE_TO_CLASS[type_]
  57. cls_data['results'] = klass.de_list(data.get('results'), client)
  58. return cls(client=client, **cls_data) # type: ignore