mix_link.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. from typing import TYPE_CHECKING, Optional
  2. from yandex_music import YandexMusicModel
  3. from yandex_music.exceptions import YandexMusicError
  4. from yandex_music.utils import model
  5. if TYPE_CHECKING:
  6. from yandex_music import ClientType
  7. @model
  8. class MixLink(YandexMusicModel):
  9. """Класс, представляющий ссылку (кликабельный блок) на подборку.
  10. Note:
  11. В цветах может как оказаться HEX (`#6c65a9`), так и какой-нибудь `transparent`.
  12. Ссылка со схемой отличается от просто ссылки наличием `yandexmusic://` в начале.
  13. Attributes:
  14. title (:obj:`str`): Заголовок ссылки.
  15. url (:obj:`str`): Ссылка на подборку.
  16. url_scheme (:obj:`str`): Ссылка со схемой на подборку.
  17. text_color (:obj:`str`): Цвет текста (HEX).
  18. background_color (:obj:`str`): Цвет заднего фона.
  19. background_image_uri (:obj:`str`): Ссылка на изображение заднего фона.
  20. cover_white (:obj:`str`, optional): Ссылка на изображение с обложкой TODO.
  21. cover_uri (:obj:`str`, optional): Ссылка на изображение с обложкой.
  22. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  23. """
  24. title: str
  25. url: str
  26. url_scheme: str
  27. text_color: str
  28. background_color: str
  29. background_image_uri: str
  30. cover_white: Optional[str] = None
  31. cover_uri: Optional[str] = None
  32. client: Optional['ClientType'] = None
  33. def __post_init__(self) -> None:
  34. self._id_attrs = (
  35. self.url,
  36. self.title,
  37. self.url_scheme,
  38. self.text_color,
  39. self.background_color,
  40. self.background_image_uri,
  41. )
  42. def get_cover_url(self, size: str = '200x200') -> str:
  43. """Возвращает URL обложки.
  44. Args:
  45. size (:obj:`str`, optional): Размер обложки.
  46. Returns:
  47. :obj:`str`: URL обложки.
  48. """
  49. assert isinstance(self.cover_uri, str)
  50. return f'https://{self.cover_uri.replace("%%", size)}'
  51. def get_cover_white_url(self, size: str = '200x200') -> str:
  52. """Возвращает URL обложки white.
  53. Args:
  54. size (:obj:`str`, optional): Размер обложки.
  55. Returns:
  56. :obj:`str`: URL обложки.
  57. """
  58. if not self.cover_white:
  59. raise YandexMusicError("You can't get cover white because it's None.")
  60. return f'https://{self.cover_white.replace("%%", size)}'
  61. def get_background_url(self, size: str = '200x200') -> str:
  62. """Возвращает URL заднего фона.
  63. Args:
  64. size (:obj:`str`, optional): Размер заднего фона.
  65. Returns:
  66. :obj:`str`: URL заднего фона.
  67. """
  68. return f'https://{self.background_image_uri.replace("%%", size)}'
  69. def download_background_image(self, filename: str, size: str = '200x200') -> None:
  70. """Загрузка заднего фона.
  71. Args:
  72. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  73. size (:obj:`str`, optional): Размер заднего фона.
  74. """
  75. assert self.valid_client(self.client)
  76. self.client.request.download(self.get_background_url(size), filename)
  77. async def download_background_image_async(self, filename: str, size: str = '200x200') -> None:
  78. """Загрузка заднего фона.
  79. Args:
  80. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  81. size (:obj:`str`, optional): Размер заднего фона.
  82. """
  83. assert self.valid_async_client(self.client)
  84. await self.client.request.download(self.get_background_url(size), filename)
  85. def download_cover_white(self, filename: str, size: str = '200x200') -> None:
  86. """Загрузка обложки TODO.
  87. Args:
  88. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  89. size (:obj:`str`, optional): Размер обложки.
  90. """
  91. assert self.valid_client(self.client)
  92. self.client.request.download(self.get_cover_white_url(size), filename)
  93. async def download_cover_white_async(self, filename: str, size: str = '200x200') -> None:
  94. """Загрузка обложки TODO.
  95. Args:
  96. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  97. size (:obj:`str`, optional): Размер обложки.
  98. """
  99. assert self.valid_async_client(self.client)
  100. await self.client.request.download(self.get_cover_white_url(size), filename)
  101. def download_cover_uri(self, filename: str, size: str = '200x200') -> None:
  102. """Загрузка обложки.
  103. Args:
  104. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  105. size (:obj:`str`, optional): Размер обложки.
  106. """
  107. assert self.valid_client(self.client)
  108. self.client.request.download(self.get_cover_url(size), filename)
  109. async def download_cover_uri_async(self, filename: str, size: str = '200x200') -> None:
  110. """Загрузка обложки.
  111. Args:
  112. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  113. size (:obj:`str`, optional): Размер обложки.
  114. """
  115. assert self.valid_async_client(self.client)
  116. await self.client.request.download(self.get_cover_url(size), filename)
  117. def download_background_image_bytes(self, size: str = '200x200') -> bytes:
  118. """Загрузка заднего фона и возврат в виде байтов.
  119. Args:
  120. size (:obj:`str`, optional): Размер заднего фона.
  121. Returns:
  122. :obj:`bytes`: Задний фон в виде байтов.
  123. """
  124. assert self.valid_client(self.client)
  125. return self.client.request.retrieve(self.get_background_url(size))
  126. async def download_background_image_bytes_async(self, size: str = '200x200') -> bytes:
  127. """Загрузка заднего фона и возврат в виде байтов.
  128. Args:
  129. size (:obj:`str`, optional): Размер заднего фона.
  130. Returns:
  131. :obj:`bytes`: Задний фон в виде байтов.
  132. """
  133. assert self.valid_async_client(self.client)
  134. return await self.client.request.retrieve(self.get_background_url(size))
  135. def download_cover_white_bytes(self, size: str = '200x200') -> bytes:
  136. """Загрузка обложки и возврат в виде байтов TODO.
  137. Args:
  138. size (:obj:`str`, optional): Размер обложки.
  139. Returns:
  140. :obj:`bytes`: Обложка в виде байтов.
  141. """
  142. assert self.valid_client(self.client)
  143. return self.client.request.retrieve(self.get_cover_white_url(size))
  144. async def download_cover_white_bytes_async(self, size: str = '200x200') -> bytes:
  145. """Загрузка обложки и возврат в виде байтов TODO.
  146. Args:
  147. size (:obj:`str`, optional): Размер обложки.
  148. Returns:
  149. :obj:`bytes`: Обложка в виде байтов.
  150. """
  151. assert self.valid_async_client(self.client)
  152. return await self.client.request.retrieve(self.get_cover_white_url(size))
  153. def download_cover_uri_bytes(self, size: str = '200x200') -> bytes:
  154. """Загрузка обложки и возврат в виде байтов.
  155. Args:
  156. size (:obj:`str`, optional): Размер обложки.
  157. Returns:
  158. :obj:`bytes`: Обложка в виде байтов.
  159. """
  160. assert self.valid_client(self.client)
  161. return self.client.request.retrieve(self.get_cover_url(size))
  162. async def download_cover_uri_bytes_async(self, size: str = '200x200') -> bytes:
  163. """Загрузка обложки и возврат в виде байтов.
  164. Args:
  165. size (:obj:`str`, optional): Размер обложки.
  166. Returns:
  167. :obj:`bytes`: Обложка в виде байтов.
  168. """
  169. assert self.valid_async_client(self.client)
  170. return await self.client.request.retrieve(self.get_cover_url(size))
  171. # camelCase псевдонимы
  172. #: Псевдоним для :attr:`get_cover_url`
  173. getCoverUrl = get_cover_url
  174. #: Псевдоним для :attr:`get_cover_white_url`
  175. getCoverWhiteUrl = get_cover_white_url
  176. #: Псевдоним для :attr:`get_background_url`
  177. getBackgroundUrl = get_background_url
  178. #: Псевдоним для :attr:`download_background_image`
  179. downloadBackgroundImage = download_background_image
  180. #: Псевдоним для :attr:`download_background_image_async`
  181. downloadBackgroundImageAsync = download_background_image_async
  182. #: Псевдоним для :attr:`download_cover_white`
  183. downloadCoverWhite = download_cover_white
  184. #: Псевдоним для :attr:`download_cover_white_async`
  185. downloadCoverWhiteAsync = download_cover_white_async
  186. #: Псевдоним для :attr:`download_cover_uri`
  187. downloadCoverUri = download_cover_uri
  188. #: Псевдоним для :attr:`download_cover_uri_async`
  189. downloadCoverUriAsync = download_cover_uri_async
  190. #: Псевдоним для :attr:`download_background_image_bytes`
  191. downloadBackgroundImageBytes = download_background_image_bytes
  192. #: Псевдоним для :attr:`download_background_image_bytes_async`
  193. downloadBackgroundImageBytesAsync = download_background_image_bytes_async
  194. #: Псевдоним для :attr:`download_cover_white_bytes`
  195. downloadCoverWhiteBytes = download_cover_white_bytes
  196. #: Псевдоним для :attr:`download_cover_white_bytes_async`
  197. downloadCoverWhiteBytesAsync = download_cover_white_bytes_async
  198. #: Псевдоним для :attr:`download_cover_uri_bytes`
  199. downloadCoverUriBytes = download_cover_uri_bytes
  200. #: Псевдоним для :attr:`download_cover_uri_bytes_async`
  201. downloadCoverUriBytesAsync = download_cover_uri_bytes_async