shot_data.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. from typing import TYPE_CHECKING, Optional
  2. from yandex_music import YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, JSONType, ShotType
  6. @model
  7. class ShotData(YandexMusicModel):
  8. """Класс, представляющий основную информацию о шоте.
  9. Attributes:
  10. cover_uri (:obj:`str`): Ссылка на обложку шота (иконка Алисы).
  11. mds_url (:obj:`str`): Ссылка на аудиоверсию шота в озвучке от Алисы.
  12. shot_text (:obj:`str`): Текстовая версия шота.
  13. shot_type (:obj:`yandex_music.ShotType`): Тип шота.
  14. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  15. """
  16. cover_uri: str
  17. mds_url: str
  18. shot_text: str
  19. shot_type: 'ShotType'
  20. client: Optional['ClientType'] = None
  21. def __post_init__(self) -> None:
  22. self._id_attrs = (self.cover_uri, self.mds_url, self.shot_text, self.shot_type)
  23. def get_cover_url(self, size: str = '200x200') -> str:
  24. """Возвращает URL обложки.
  25. Args:
  26. size (:obj:`str`, optional): Размер обложки.
  27. Returns:
  28. :obj:`str`: URL обложки.
  29. """
  30. return f'https://{self.cover_uri.replace("%%", size)}'
  31. def download_cover(self, filename: str, size: str = '200x200') -> None:
  32. """Загрузка обложки.
  33. Args:
  34. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  35. size (:obj:`str`, optional): Размер обложки.
  36. """
  37. assert self.valid_client(self.client)
  38. self.client.request.download(self.get_cover_url(size), filename)
  39. async def download_cover_async(self, filename: str, size: str = '200x200') -> None:
  40. """Загрузка обложки.
  41. Args:
  42. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  43. size (:obj:`str`, optional): Размер обложки.
  44. """
  45. assert self.valid_async_client(self.client)
  46. await self.client.request.download(self.get_cover_url(size), filename)
  47. def download_mds(self, filename: str) -> None:
  48. """Загрузка аудиоверсии шота.
  49. Args:
  50. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  51. """
  52. assert self.valid_client(self.client)
  53. self.client.request.download(self.mds_url, filename)
  54. async def download_mds_async(self, filename: str) -> None:
  55. """Загрузка аудиоверсии шота.
  56. Args:
  57. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  58. """
  59. assert self.valid_async_client(self.client)
  60. await self.client.request.download(self.mds_url, filename)
  61. def download_cover_bytes(self, size: str = '200x200') -> bytes:
  62. """Загрузка обложки и возврат в виде байтов.
  63. Args:
  64. size (:obj:`str`, optional): Размер обложки.
  65. Returns:
  66. :obj:`bytes`: Обложка в виде байтов
  67. """
  68. assert self.valid_client(self.client)
  69. return self.client.request.retrieve(self.get_cover_url(size))
  70. async def download_cover_bytes_async(self, size: str = '200x200') -> bytes:
  71. """Загрузка обложки и возврат в виде байтов.
  72. Args:
  73. size (:obj:`str`, optional): Размер обложки.
  74. Returns:
  75. :obj:`bytes`: Обложка в виде байтов
  76. """
  77. assert self.valid_async_client(self.client)
  78. return await self.client.request.retrieve(self.get_cover_url(size))
  79. def download_mds_bytes(self) -> bytes:
  80. """Загрузка аудиоверсии шота и возврат в виде байтов.
  81. Returns:
  82. :obj:`bytes`: Аудиоверсия шота в виде байтов
  83. """
  84. assert self.valid_client(self.client)
  85. return self.client.request.retrieve(self.mds_url)
  86. async def download_mds_bytes_async(self) -> bytes:
  87. """Загрузка аудиоверсии шота и возврат в виде байтов.
  88. Returns:
  89. :obj:`bytes`: Аудиоверсия шота в виде байтов
  90. """
  91. assert self.valid_async_client(self.client)
  92. return await self.client.request.retrieve(self.mds_url)
  93. @classmethod
  94. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['ShotData']:
  95. """Десериализация объекта.
  96. Args:
  97. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  98. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  99. Returns:
  100. :obj:`yandex_music.ShotData`: Основная информация о шоте.
  101. """
  102. if not cls.is_dict_model_data(data):
  103. return None
  104. cls_data = cls.cleanup_data(data, client)
  105. from yandex_music import ShotType
  106. cls_data['shot_type'] = ShotType.de_json(data.get('shot_type'), client)
  107. return cls(client=client, **cls_data) # type: ignore
  108. # camelCase псевдонимы
  109. #: Псевдоним для :attr:`get_cover_url`
  110. getCoverUrl = get_cover_url
  111. #: Псевдоним для :attr:`download_cover`
  112. downloadCover = download_cover
  113. #: Псевдоним для :attr:`download_cover_async`
  114. downloadCoverAsync = download_cover_async
  115. #: Псевдоним для :attr:`download_mds`
  116. downloadMds = download_mds
  117. #: Псевдоним для :attr:`download_mds_async`
  118. downloadMdsAsync = download_mds_async
  119. #: Псевдоним для :attr:`download_cover_bytes`
  120. downloadCoverBytes = download_cover_bytes
  121. #: Псевдоним для :attr:`download_cover_bytes_async`
  122. downloadCoverBytesAsync = download_cover_bytes_async
  123. #: Псевдоним для :attr:`download_mds_bytes`
  124. downloadMdsBytes = download_mds_bytes
  125. #: Псевдоним для :attr:`download_mds_bytes_async`
  126. downloadMdsBytesAsync = download_mds_bytes_async