track_short.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from typing import TYPE_CHECKING, Optional, Union
  2. from yandex_music import YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import Chart, ClientType, JSONType, Track
  6. @model
  7. class TrackShort(YandexMusicModel):
  8. """Класс, представляющий укороченную версию трека с неполными данными.
  9. Note:
  10. Поля `chart` и `track` только у треков, полученных через метод `chart()`.
  11. Attributes:
  12. id (:obj:`str`): Уникальный идентификатор трека.
  13. timestamp (:obj:`str`): Дата TODO.
  14. album_id (:obj:`str`, optional): Уникальный идентификатор альбома.
  15. play_count (:obj:`int`, optional): Количество проигрываний.
  16. recent (:obj:`bool`, optional): Недавний.
  17. chart (:obj:`yandex_music.Chart`, optional): Позиция в чарте.
  18. track (:obj:`yandex_music.Track`, optional): Полная версия трека.
  19. original_index (:obj:`int`, optional): Индекс в плейлисте или альбоме. TODO уточнить про альбом.
  20. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  21. """
  22. id: Union[str, int]
  23. timestamp: str
  24. album_id: Optional[str] = None
  25. play_count: Optional[int] = None
  26. recent: Optional[bool] = None
  27. chart: Optional['Chart'] = None
  28. track: Optional['Track'] = None
  29. original_index: Optional[int] = None
  30. client: Optional['ClientType'] = None
  31. def __post_init__(self) -> None:
  32. self._id_attrs = (self.id, self.album_id)
  33. def fetch_track(self) -> 'Track':
  34. """Получение полной версии трека.
  35. Returns:
  36. :obj:`yandex_music.Track`: Полная версия трека.
  37. """
  38. assert self.valid_client(self.client)
  39. return self.client.tracks(self.track_id)[0]
  40. async def fetch_track_async(self) -> 'Track':
  41. """Получение полной версии трека.
  42. Returns:
  43. :obj:`yandex_music.Track`: Полная версия трека.
  44. """
  45. assert self.valid_async_client(self.client)
  46. return (await self.client.tracks(self.track_id))[0]
  47. @property
  48. def track_id(self) -> str:
  49. """:obj:`str`: Уникальный идентификатор трека состоящий из его номера и номера альбома или просто из номера."""
  50. if self.album_id:
  51. return f'{self.id}:{self.album_id}'
  52. return f'{self.id}'
  53. @classmethod
  54. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['TrackShort']:
  55. """Десериализация объекта.
  56. Args:
  57. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  58. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  59. Returns:
  60. :obj:`yandex_music.TrackShort`: Укороченная версия трека с неполными данными.
  61. """
  62. if not cls.is_dict_model_data(data):
  63. return None
  64. cls_data = cls.cleanup_data(data, client)
  65. from yandex_music import Chart, Track
  66. cls_data['track'] = Track.de_json(data.get('track'), client)
  67. cls_data['chart'] = Chart.de_json(data.get('chart'), client)
  68. return cls(client=client, **cls_data) # type: ignore
  69. # camelCase псевдонимы
  70. #: Псевдоним для :attr:`fetch_track`
  71. fetchTrack = fetch_track
  72. #: Псевдоним для :attr:`fetch_track_async`
  73. fetchTrackAsync = fetch_track_async
  74. #: Псевдоним для :attr:`track_id`
  75. trackId = track_id