icon.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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
  6. @model
  7. class Icon(YandexMusicModel):
  8. """Класс, представляющий иконку.
  9. Attributes:
  10. background_color (:obj:`str`): Цвет заднего фона в HEX.
  11. image_url (:obj:`str`): Ссылка на изображение.
  12. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  13. """
  14. background_color: str
  15. image_url: str
  16. client: Optional['ClientType'] = None
  17. def __post_init__(self) -> None:
  18. self._id_attrs = (self.background_color, self.image_url)
  19. def download(self, filename: str, size: str = '200x200') -> None:
  20. """Загрузка иконки.
  21. Args:
  22. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  23. size (:obj:`str`, optional): Размер иконки.
  24. """
  25. assert self.valid_client(self.client)
  26. self.client.request.download(self.get_url(size), filename)
  27. async def download_async(self, filename: str, size: str = '200x200') -> None:
  28. """Загрузка иконки.
  29. Args:
  30. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  31. size (:obj:`str`, optional): Размер иконки.
  32. """
  33. assert self.valid_async_client(self.client)
  34. await self.client.request.download(self.get_url(size), filename)
  35. def download_bytes(self, size: str = '200x200') -> bytes:
  36. """Загрузка иконки и возврат в виде байтов.
  37. Args:
  38. size (:obj:`str`, optional): Размер иконки.
  39. Returns:
  40. :obj:`bytes`: Иконка в виде байтов.
  41. """
  42. assert self.valid_client(self.client)
  43. return self.client.request.retrieve(self.get_url(size))
  44. async def download_bytes_async(self, size: str = '200x200') -> bytes:
  45. """Загрузка иконки и возврат в виде байтов.
  46. Args:
  47. size (:obj:`str`, optional): Размер иконки.
  48. Returns:
  49. :obj:`bytes`: Иконка в виде байтов.
  50. """
  51. assert self.valid_async_client(self.client)
  52. return await self.client.request.retrieve(self.get_url(size))
  53. def get_url(self, size: str = '200x200') -> str:
  54. """Получение URL иконки.
  55. Args:
  56. size (:obj:`str`, optional): Размер иконки.
  57. """
  58. return f'https://{self.image_url.replace("%%", size)}'
  59. # camelCase псевдонимы
  60. #: Псевдоним для :attr:`download_async`
  61. downloadAsync = download_async
  62. #: Псевдоним для :attr:`download_bytes`
  63. downloadBytes = download_bytes
  64. #: Псевдоним для :attr:`download_bytes_async`
  65. downloadBytesAsync = download_bytes_async
  66. #: Псевдоним для :attr:`get_url`
  67. getUrl = get_url