cover.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from typing import TYPE_CHECKING, List, 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 Cover(YandexMusicModel):
  8. """Класс, представляющий обложку.
  9. Attributes:
  10. type (:obj:`str`, optional): Тип обложки.
  11. uri (:obj:`str`, optional): Ссылка на изображение.
  12. items_uri (:obj:`list` из :obj:`str`, optional): Список ссылок на изображения.
  13. dir (:obj:`str`, optional): Директория хранения изображения на сервере.
  14. version (:obj:`str`, optional): Версия.
  15. is_custom (:obj:`bool`, optional): Является ли обложка пользовательской.
  16. custom (:obj:`bool`, optional): Является ли обложка пользовательской.
  17. prefix (:obj:`str`, optional): Уникальный идентификатор.
  18. copyright_name (:obj:`str`, optional): Название владельца авторским правом.
  19. copyright_cline (:obj:`str`, optional): Владелец прав на музыку (автор текста и т.д.), а не её записи.
  20. error (:obj:`str`, optional): Сообщение об ошибке.
  21. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  22. """
  23. type: Optional[str] = None
  24. uri: Optional[str] = None
  25. items_uri: Optional[List[str]] = None
  26. dir: Optional[str] = None
  27. version: Optional[str] = None
  28. custom: Optional[bool] = None
  29. is_custom: Optional[bool] = None
  30. copyright_name: Optional[str] = None
  31. copyright_cline: Optional[str] = None
  32. prefix: Optional[str] = None
  33. error: Optional[str] = None
  34. client: Optional['ClientType'] = None
  35. def __post_init__(self) -> None:
  36. self._id_attrs = (self.prefix, self.version, self.uri, self.items_uri)
  37. def get_url(self, index: int = 0, size: str = '200x200') -> str:
  38. """Возвращает URL обложки.
  39. Args:
  40. index (:obj:`int`, optional): Индекс элемента в списке ссылок на обложки если нет `self.uri`.
  41. size (:obj:`str`, optional): Размер изображения.
  42. Returns:
  43. :obj:`str`: URL адрес.
  44. """
  45. uri = self.uri
  46. if not uri:
  47. assert isinstance(self.items_uri, list)
  48. uri = self.items_uri[index]
  49. return f'https://{uri.replace("%%", size)}'
  50. def download(self, filename: str, index: int = 0, size: str = '200x200') -> None:
  51. """Загрузка обложки.
  52. Args:
  53. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  54. index (:obj:`int`, optional): Индекс элемента в списке ссылок на обложки если нет `self.uri`.
  55. size (:obj:`str`, optional): Размер изображения.
  56. """
  57. assert self.valid_client(self.client)
  58. self.client.request.download(self.get_url(index, size), filename)
  59. async def download_async(self, filename: str, index: int = 0, size: str = '200x200') -> None:
  60. """Загрузка обложки.
  61. Args:
  62. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  63. index (:obj:`int`, optional): Индекс элемента в списке ссылок на обложки если нет `self.uri`.
  64. size (:obj:`str`, optional): Размер изображения.
  65. """
  66. assert self.valid_async_client(self.client)
  67. await self.client.request.download(self.get_url(index, size), filename)
  68. def download_bytes(self, index: int = 0, size: str = '200x200') -> bytes:
  69. """Загрузка обложки и возврат в виде байтов.
  70. Args:
  71. index (:obj:`int`, optional): Индекс элемента в списке ссылок на обложки если нет `self.uri`.
  72. size (:obj:`str`, optional): Размер изображения.
  73. Returns:
  74. :obj:`bytes`: Обложка в виде байтов.
  75. """
  76. assert self.valid_client(self.client)
  77. return self.client.request.retrieve(self.get_url(index, size))
  78. async def download_bytes_async(self, index: int = 0, size: str = '200x200') -> bytes:
  79. """Загрузка обложки и возврат в виде байтов.
  80. Args:
  81. index (:obj:`int`, optional): Индекс элемента в списке ссылок на обложки если нет `self.uri`.
  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_url(index, size))
  88. # camelCase псевдонимы
  89. #: Псевдоним для :attr:`get_url`
  90. getUrl = get_url
  91. #: Псевдоним для :attr:`download_async`
  92. downloadAsync = download_async
  93. #: Псевдоним для :attr:`download_bytes`
  94. downloadBytes = download_bytes
  95. #: Псевдоним для :attr:`download_bytes_async`
  96. downloadBytesAsync = download_bytes_async