promotion.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 Promotion(YandexMusicModel):
  8. """Класс, представляющий продвижение (рекламу).
  9. Note:
  10. В цвете может как оказаться HEX (`#6c65a9`), так и какой-нибудь `transparent`.
  11. Ссылка со схемой отличается от просто ссылки наличием `yandexmusic://` в начале.
  12. Attributes:
  13. promo_id (:obj:`str`): Уникальный идентификатор рекламы.
  14. title (:obj:`str`): Заголовок.
  15. subtitle (:obj:`str`): Подзаголовок.
  16. heading (:obj:`str`): Верхний заголовок.
  17. url (:obj:`str`): Ссылка.
  18. url_scheme (:obj:`str`): Ссылка с схемой.
  19. text_color (:obj:`str`): Цвет текста.
  20. gradient (:obj:`str`): Градиент TODO.
  21. image (:obj:`str`): Ссылка на рекламное изображение.
  22. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  23. """
  24. promo_id: str
  25. title: str
  26. subtitle: str
  27. heading: str
  28. url: str
  29. url_scheme: str
  30. text_color: str
  31. gradient: str
  32. image: str
  33. client: Optional['ClientType'] = None
  34. def __post_init__(self) -> None:
  35. self._id_attrs = (
  36. self.promo_id,
  37. self.title,
  38. self.subtitle,
  39. self.heading,
  40. self.url,
  41. self.url_scheme,
  42. self.text_color,
  43. self.gradient,
  44. self.image,
  45. )
  46. def get_image_url(self, size: str = '300x300') -> str:
  47. """Возвращает URL изображения.
  48. Args:
  49. size (:obj:`str`, optional): Размер изображения.
  50. Returns:
  51. :obj:`str`: URL изображения.
  52. """
  53. return f'https://{self.image.replace("%%", size)}'
  54. def download_image(self, filename: str, size: str = '300x300') -> None:
  55. """Загрузка рекламного изображения.
  56. Args:
  57. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  58. size (:obj:`str`, optional): Размер изображения.
  59. """
  60. assert self.valid_client(self.client)
  61. self.client.request.download(self.get_image_url(size), filename)
  62. async def download_image_async(self, filename: str, size: str = '300x300') -> None:
  63. """Загрузка рекламного изображения.
  64. Args:
  65. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  66. size (:obj:`str`, optional): Размер изображения.
  67. """
  68. assert self.valid_async_client(self.client)
  69. await self.client.request.download(self.get_image_url(size), filename)
  70. def download_image_bytes(self, size: str = '300x300') -> bytes:
  71. """Загрузка рекламного изображения и возврат в виде байтов.
  72. Args:
  73. size (:obj:`str`, optional): Размер изображения.
  74. Returns:
  75. :obj:`bytes`: Рекламное изображение в виде байтов.
  76. """
  77. assert self.valid_client(self.client)
  78. return self.client.request.retrieve(self.get_image_url(size))
  79. async def download_image_bytes_async(self, size: str = '300x300') -> bytes:
  80. """Загрузка рекламного изображения и возврат в виде байтов.
  81. Args:
  82. size (:obj:`str`, optional): Размер изображения.
  83. Returns:
  84. :obj:`bytes`: Рекламное изображение в виде байтов.
  85. """
  86. assert self.valid_async_client(self.client)
  87. return await self.client.request.retrieve(self.get_image_url(size))
  88. # camelCase псевдонимы
  89. #: Псевдоним для :attr:`get_image_url`
  90. getImageUrl = get_image_url
  91. #: Псевдоним для :attr:`download_image`
  92. downloadImage = download_image
  93. #: Псевдоним для :attr:`download_image_async`
  94. downloadImageAsync = download_image_async
  95. #: Псевдоним для :attr:`download_image_bytes`
  96. downloadImageBytes = download_image_bytes
  97. #: Псевдоним для :attr:`download_image_bytes_async`
  98. downloadImageBytesAsync = download_image_bytes_async