track.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. from dataclasses import field
  2. from typing import TYPE_CHECKING, Any, List, Optional, Union
  3. from yandex_music import YandexMusicModel
  4. from yandex_music.exceptions import InvalidBitrateError
  5. from yandex_music.utils import model
  6. if TYPE_CHECKING:
  7. from yandex_music import (
  8. R128,
  9. Album,
  10. Artist,
  11. ClientType,
  12. DownloadInfo,
  13. JSONType,
  14. LyricsInfo,
  15. Major,
  16. MetaData,
  17. Normalization,
  18. PoetryLoverMatch,
  19. Supplement,
  20. TrackLyrics,
  21. User,
  22. )
  23. @model
  24. class Track(YandexMusicModel):
  25. """Класс, представляющий трек.
  26. Note:
  27. Известные значения поля `content_warning`: `explicit`.
  28. Известные значения поля `type`: `music`.
  29. Известные значения поля `track_sharing_flag`: `VIDEO_ALLOWED`, `COVER_ONLY`.
  30. Известные значения поля `track_source`: `OWN`, `OWN_REPLACED_TO_UGC`.
  31. Известные значения поля `available_for_options`: `bookmate`.
  32. Поля `can_publish`, `state`, `desired_visibility`, `filename`, `user_info` доступны только у треков что были
  33. загружены пользователем.
  34. Обычно у подкастов поле `remember_position == True`, а у треков `remember_position == False`.
  35. Полное описание можно получить используя :func:`Track.get_supplement`.
  36. Attributes:
  37. id (:obj:`int` | :obj:`str`): Уникальный идентификатор.
  38. title (:obj:`str`, optional): Название.
  39. available (:obj:`bool`, optional): Доступен ли для прослушивания.
  40. artists (:obj:`list` из :obj:`yandex_music.Artist`, optional): Исполнители.
  41. albums (:obj:`list` из :obj:`yandex_music.Album`, optional): Альбомы.
  42. available_for_premium_users (:obj:`bool`, optional): Доступен ли для пользователей с подпиской.
  43. lyrics_available (:obj:`bool`, optional): Доступен ли текст песни.
  44. poetry_lover_matches (:obj:`list` из :obj:`yandex_music.PoetryLoverMatch`, optional): Список слов TODO.
  45. best (:obj:`bool`, optional): Лучшей ли трек TODO.
  46. real_id (:obj:`int` | :obj:`str`, optional): TODO.
  47. og_image (:obj:`str`, optional): Ссылка на превью Open Graph.
  48. type (:obj:`str`, optional): Тип.
  49. cover_uri (:obj:`str`, optional): Ссылка на изображение с обложкой.
  50. major (:obj:`yandex_music.Major`, optional): Мейджор-лейбл.
  51. duration_ms (:obj:`int`, optional): Длительность трека в миллисекундах.
  52. storage_dir (:obj:`str`, optional): В какой папке на сервере хранится файл TODO.
  53. file_size (:obj:`int`, optional): Размер файла. TODO добавить единицу измерения.
  54. substituted (:obj:`yandex_music.Track`, optional): Замещённый трек.
  55. matched_track (:obj:`yandex_music.Track`, optional): Соответствующий трек TODO.
  56. normalization (:obj:`list` из :obj:`yandex_music.Normalization`, optional): Значения для нормализации трека.
  57. error (:obj:`str`, optional): Сообщение об ошибке.
  58. can_publish (:obj:`bool`, optional): Может ли быть опубликован.
  59. state (:obj:`str`, optional): Состояние, например, playable.
  60. desired_visibility (:obj:`str`, optional): Видимость трека.
  61. filename (:obj:`str`, optional): Название файла.
  62. user_info (:obj:`yandex_music.User`, optional): Информация о пользователе, который загрузил трек.
  63. meta_data (:obj:`yandex_music.MetaData`, optional): Информация о метаданных трека.
  64. regions (:obj:`list` из :obj:`str`, optional): Регион TODO.
  65. available_as_rbt (:obj:`bool`, optional): TODO.
  66. content_warning (:obj:`str`, optional): Тип откровенного контента.
  67. explicit (:obj:`bool`, optional): Содержит ли откровенный контент.
  68. preview_duration_ms (:obj:`int`, optional): TODO.
  69. available_full_without_permission (:obj:`bool`, optional): Доступен ли без подписки.
  70. version (:obj:`str`, optional): Версия.
  71. remember_position (:obj:`bool`, optional): Если :obj:`True`, то запоминается последняя позиция прослушивания,
  72. иначе позиция не запоминается.
  73. background_video_uri (:obj:`str`, optional): Ссылка на видеошот.
  74. short_description (:obj:`str`, optional): Краткое описание эпизода подкаста.
  75. is_suitable_for_children (:obj:`bool`, optional): Подходит ли для детей TODO.
  76. track_source (:obj:`str`, optional): Источник трека.
  77. available_for_options (:obj:`list` из :obj:`str`, optional): Возможные опции для трека.
  78. r128 (:obj:`yandex_music.R128`, optional): Параметры нормализации громкости трека
  79. в соответствии с рекомендацией EBU R 128.
  80. lyrics_info (:obj:`yandex_music.LyricsInfo`, optional): Данные о наличии текстов трека.
  81. track_sharing_flag (:obj:`str`, optional): TODO.
  82. client (:obj:`yandex_music.Client`): Клиент Yandex Music.
  83. """
  84. id: Union[str, int]
  85. title: Optional[str] = None
  86. available: Optional[bool] = None
  87. artists: List['Artist'] = field(default_factory=list)
  88. albums: List['Album'] = field(default_factory=list)
  89. available_for_premium_users: Optional[bool] = None
  90. lyrics_available: Optional[bool] = None
  91. poetry_lover_matches: List['PoetryLoverMatch'] = field(default_factory=list)
  92. best: Optional[bool] = None
  93. real_id: Optional[Union[str, int]] = None
  94. og_image: Optional[str] = None
  95. type: Optional[str] = None
  96. cover_uri: Optional[str] = None
  97. major: Optional['Major'] = None
  98. duration_ms: Optional[int] = None
  99. storage_dir: Optional[str] = None
  100. file_size: Optional[int] = None
  101. substituted: Optional['Track'] = None
  102. matched_track: Optional['Track'] = None
  103. normalization: Optional['Normalization'] = None
  104. error: Optional[str] = None
  105. can_publish: Optional[bool] = None
  106. state: Optional[str] = None
  107. desired_visibility: Optional[str] = None
  108. filename: Optional[str] = None
  109. user_info: Optional['User'] = None
  110. meta_data: Optional['MetaData'] = None
  111. regions: Optional[List[str]] = None
  112. available_as_rbt: Optional[bool] = None
  113. content_warning: Optional[str] = None
  114. explicit: Optional[bool] = None
  115. preview_duration_ms: Optional[int] = None
  116. available_full_without_permission: Optional[bool] = None
  117. version: Optional[str] = None
  118. remember_position: Optional[bool] = None
  119. background_video_uri: Optional[str] = None
  120. short_description: Optional[str] = None
  121. is_suitable_for_children: Optional[bool] = None
  122. track_source: Optional[str] = None
  123. available_for_options: Optional[List[str]] = None
  124. r128: Optional['R128'] = None
  125. lyrics_info: Optional['LyricsInfo'] = None
  126. track_sharing_flag: Optional[str] = None
  127. client: Optional['ClientType'] = None
  128. def __post_init__(self) -> None:
  129. self.download_info = None
  130. self._id_attrs = (self.id,)
  131. def get_download_info(self, get_direct_links: bool = False) -> List['DownloadInfo']:
  132. """Сокращение для::
  133. client.tracks_download_info(self.track_id, get_direct_links)
  134. """
  135. assert self.valid_client(self.client)
  136. self.download_info = self.client.tracks_download_info(self.track_id, get_direct_links)
  137. return self.download_info
  138. async def get_download_info_async(self, get_direct_links: bool = False) -> List['DownloadInfo']:
  139. """Сокращение для::
  140. await client.tracks_download_info(self.track_id, get_direct_links)
  141. """
  142. assert self.valid_async_client(self.client)
  143. self.download_info = await self.client.tracks_download_info(self.track_id, get_direct_links)
  144. return self.download_info
  145. def get_supplement(self, *args: Any, **kwargs: Any) -> Optional['Supplement']:
  146. """Сокращение для::
  147. client.track_supplement(track.id, *args, **kwargs)
  148. """
  149. assert self.valid_client(self.client)
  150. return self.client.track_supplement(self.id, *args, **kwargs)
  151. async def get_supplement_async(self, *args: Any, **kwargs: Any) -> Optional['Supplement']:
  152. """Сокращение для::
  153. await client.track_supplement(track.id, *args, **kwargs)
  154. """
  155. assert self.valid_async_client(self.client)
  156. return await self.client.track_supplement(self.id, *args, **kwargs)
  157. def get_lyrics(self, *args: Any, **kwargs: Any) -> Optional['TrackLyrics']:
  158. """Сокращение для::
  159. client.tracks_lyrics(track.id, *args, **kwargs)
  160. """
  161. assert self.valid_client(self.client)
  162. return self.client.tracks_lyrics(self.id, *args, **kwargs)
  163. async def get_lyrics_async(self, *args: Any, **kwargs: Any) -> Optional['TrackLyrics']:
  164. """Сокращение для::
  165. client.tracks_lyrics(track.id, *args, **kwargs)
  166. """
  167. assert self.valid_async_client(self.client)
  168. return await self.client.tracks_lyrics(self.id, *args, **kwargs)
  169. def get_cover_url(self, size: str = '200x200') -> str:
  170. """Возвращает URL обложки.
  171. Args:
  172. size (:obj:`str`, optional): Размер обложки.
  173. Returns:
  174. :obj:`str`: URL обложки.
  175. """
  176. assert isinstance(self.cover_uri, str)
  177. return f'https://{self.cover_uri.replace("%%", size)}'
  178. def get_og_image_url(self, size: str = '200x200') -> str:
  179. """Возвращает URL OG обложки.
  180. Args:
  181. size (:obj:`str`, optional): Размер обложки.
  182. Returns:
  183. :obj:`str`: URL обложки.
  184. """
  185. assert isinstance(self.og_image, str)
  186. return f'https://{self.og_image.replace("%%", size)}'
  187. def download_cover(self, filename: str, size: str = '200x200') -> None:
  188. """Загрузка обложки.
  189. Args:
  190. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  191. size (:obj:`str`, optional): Размер обложки.
  192. """
  193. assert self.valid_client(self.client)
  194. self.client.request.download(self.get_cover_url(size), filename)
  195. async def download_cover_async(self, filename: str, size: str = '200x200') -> None:
  196. """Загрузка обложки.
  197. Args:
  198. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  199. size (:obj:`str`, optional): Размер обложки.
  200. """
  201. assert self.valid_async_client(self.client)
  202. await self.client.request.download(self.get_cover_url(size), filename)
  203. def download_og_image(self, filename: str, size: str = '200x200') -> None:
  204. """Загрузка обложки.
  205. Предпочтительнее использовать `self.download_cover()`.
  206. Args:
  207. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  208. size (:obj:`str`, optional): Размер обложки.
  209. """
  210. assert self.valid_client(self.client)
  211. self.client.request.download(self.get_og_image_url(size), filename)
  212. async def download_og_image_async(self, filename: str, size: str = '200x200') -> None:
  213. """Загрузка обложки.
  214. Предпочтительнее использовать `self.download_cover_async()`.
  215. Args:
  216. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  217. size (:obj:`str`, optional): Размер обложки.
  218. """
  219. assert self.valid_async_client(self.client)
  220. await self.client.request.download(self.get_og_image_url(size), filename)
  221. def download_cover_bytes(self, size: str = '200x200') -> bytes:
  222. """Загрузка обложки и возврат в виде байтов.
  223. Args:
  224. size (:obj:`str`, optional): Размер обложки.
  225. Returns:
  226. :obj:`bytes`: Обложка в виде байтов.
  227. """
  228. assert self.valid_client(self.client)
  229. return self.client.request.retrieve(self.get_cover_url(size))
  230. async def download_cover_bytes_async(self, size: str = '200x200') -> bytes:
  231. """Загрузка обложки и возврат в виде байтов.
  232. Args:
  233. size (:obj:`str`, optional): Размер обложки.
  234. Returns:
  235. :obj:`bytes`: Обложка в виде байтов.
  236. """
  237. assert self.valid_async_client(self.client)
  238. return await self.client.request.retrieve(self.get_cover_url(size))
  239. def download_og_image_bytes(self, size: str = '200x200') -> bytes:
  240. """Загрузка обложки и возврат в виде байтов.
  241. Предпочтительнее использовать `self.download_cover()`.
  242. Args:
  243. size (:obj:`str`, optional): Размер обложки.
  244. Returns:
  245. :obj:`bytes`: Обложка в виде байтов.
  246. """
  247. assert self.valid_client(self.client)
  248. return self.client.request.retrieve(self.get_og_image_url(size))
  249. async def download_og_image_bytes_async(self, size: str = '200x200') -> bytes:
  250. """Загрузка обложки и возврат в виде байтов.
  251. Предпочтительнее использовать `self.download_cover_async()`.
  252. Args:
  253. size (:obj:`str`, optional): Размер обложки.
  254. Returns:
  255. :obj:`bytes`: Обложка в виде байтов.
  256. """
  257. assert self.valid_async_client(self.client)
  258. return await self.client.request.retrieve(self.get_og_image_url(size))
  259. def get_specific_download_info(self, codec: str, bitrate_in_kbps: int) -> Optional['DownloadInfo']:
  260. """Возвращает вариант загрузки по критериям.
  261. Args:
  262. codec (:obj:`str`, optional): Кодек из доступных в `self.download_info`.
  263. bitrate_in_kbps (:obj:`int`, optional): Битрейт из доступных в `self.download_info` для данного кодека.
  264. Returns:
  265. :obj:`yandex_music.DownloadInfo` | :obj:`None`: Вариант загрузки трека или :obj:`None`.
  266. """
  267. if self.download_info is None:
  268. self.download_info = self.get_download_info()
  269. for info in self.download_info:
  270. if info.codec == codec and info.bitrate_in_kbps == bitrate_in_kbps:
  271. return info
  272. return None
  273. async def get_specific_download_info_async(self, codec: str, bitrate_in_kbps: int) -> Optional['DownloadInfo']:
  274. """Возвращает вариант загрузки по критериям.
  275. Args:
  276. codec (:obj:`str`, optional): Кодек из доступных в `self.download_info`.
  277. bitrate_in_kbps (:obj:`int`, optional): Битрейт из доступных в `self.download_info` для данного кодека.
  278. Returns:
  279. :obj:`yandex_music.DownloadInfo` | :obj:`None`: Вариант загрузки трека или :obj:`None`.
  280. """
  281. if self.download_info is None:
  282. self.download_info = await self.get_download_info_async()
  283. for info in self.download_info:
  284. if info.codec == codec and info.bitrate_in_kbps == bitrate_in_kbps:
  285. return info
  286. return None
  287. def download(self, filename: str, codec: str = 'mp3', bitrate_in_kbps: int = 192) -> None:
  288. """Загрузка трека.
  289. Note:
  290. Известные значения `codec`: `mp3`, `aac`.
  291. Известные значения `bitrate_in_kbps`: `64`, `128`, `192`, `320`.
  292. Args:
  293. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  294. codec (:obj:`str`, optional): Кодек из доступных в `self.download_info`.
  295. bitrate_in_kbps (:obj:`int`, optional): Битрейт из доступных в `self.download_info` для данного кодека.
  296. Raises:
  297. :class:`yandex_music.exceptions.InvalidBitrateError`: Если в `self.download_info` не найден подходящий трек.
  298. """
  299. info = self.get_specific_download_info(codec, bitrate_in_kbps)
  300. if info:
  301. info.download(filename)
  302. else:
  303. raise InvalidBitrateError('Unavailable bitrate')
  304. async def download_async(self, filename: str, codec: str = 'mp3', bitrate_in_kbps: int = 192) -> None:
  305. """Загрузка трека.
  306. Note:
  307. Известные значения `codec`: `mp3`, `aac`.
  308. Известные значения `bitrate_in_kbps`: `64`, `128`, `192`, `320`.
  309. Args:
  310. filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
  311. codec (:obj:`str`, optional): Кодек из доступных в `self.download_info`.
  312. bitrate_in_kbps (:obj:`int`, optional): Битрейт из доступных в `self.download_info` для данного кодека.
  313. Raises:
  314. :class:`yandex_music.exceptions.InvalidBitrateError`: Если в `self.download_info` не найден подходящий трек.
  315. """
  316. info = await self.get_specific_download_info_async(codec, bitrate_in_kbps)
  317. if info:
  318. await info.download_async(filename)
  319. else:
  320. raise InvalidBitrateError('Unavailable bitrate')
  321. def download_bytes(self, codec: str = 'mp3', bitrate_in_kbps: int = 192) -> bytes:
  322. """Загрузка трека и возврат в виде байтов.
  323. Note:
  324. Известные значения `codec`: `mp3`, `aac`.
  325. Известные значения `bitrate_in_kbps`: `64`, `128`, `192`, `320`.
  326. Args:
  327. codec (:obj:`str`, optional): Кодек из доступных в `self.download_info`.
  328. bitrate_in_kbps (:obj:`int`, optional): Битрейт из доступных в `self.download_info` для данного кодека.
  329. Raises:
  330. :class:`yandex_music.exceptions.InvalidBitrateError`: Если в `self.download_info` не найден подходящий трек.
  331. Returns:
  332. :obj:`bytes`: Трек в виде байтов.
  333. """
  334. info = self.get_specific_download_info(codec, bitrate_in_kbps)
  335. if info:
  336. return info.download_bytes()
  337. raise InvalidBitrateError('Unavailable bitrate')
  338. async def download_bytes_async(self, codec: str = 'mp3', bitrate_in_kbps: int = 192) -> bytes:
  339. """Загрузка трека и возврат в виде байтов.
  340. Note:
  341. Известные значения `codec`: `mp3`, `aac`.
  342. Известные значения `bitrate_in_kbps`: `64`, `128`, `192`, `320`.
  343. Args:
  344. codec (:obj:`str`, optional): Кодек из доступных в `self.download_info`.
  345. bitrate_in_kbps (:obj:`int`, optional): Битрейт из доступных в `self.download_info` для данного кодека.
  346. Raises:
  347. :class:`yandex_music.exceptions.InvalidBitrateError`: Если в `self.download_info` не найден подходящий трек.
  348. Returns:
  349. :obj:`bytes`: Трек в виде байтов.
  350. """
  351. info = await self.get_specific_download_info_async(codec, bitrate_in_kbps)
  352. if info:
  353. return await info.download_bytes_async()
  354. raise InvalidBitrateError('Unavailable bitrate')
  355. def like(self, *args: Any, **kwargs: Any) -> bool:
  356. """Сокращение для::
  357. client.users_likes_tracks_add(track.id, user.id, *args, **kwargs)
  358. """
  359. assert self.valid_client(self.client)
  360. return self.client.users_likes_tracks_add(self.track_id, self.client.account_uid, *args, **kwargs)
  361. async def like_async(self, *args: Any, **kwargs: Any) -> bool:
  362. """Сокращение для::
  363. await client.users_likes_tracks_add(track.id, user.id, *args, **kwargs)
  364. """
  365. assert self.valid_async_client(self.client)
  366. return await self.client.users_likes_tracks_add(self.track_id, self.client.account_uid, *args, **kwargs)
  367. def dislike(self, *args: Any, **kwargs: Any) -> bool:
  368. """Сокращение для::
  369. client.users_likes_tracks_remove(track.id, user.id *args, **kwargs)
  370. """
  371. assert self.valid_client(self.client)
  372. return self.client.users_likes_tracks_remove(self.track_id, self.client.account_uid, *args, **kwargs)
  373. async def dislike_async(self, *args: Any, **kwargs: Any) -> bool:
  374. """Сокращение для::
  375. await client.users_likes_tracks_remove(track.id, user.id *args, **kwargs)
  376. """
  377. assert self.valid_async_client(self.client)
  378. return await self.client.users_likes_tracks_remove(self.track_id, self.client.account_uid, *args, **kwargs)
  379. def artists_name(self) -> List[str]:
  380. """Получает имена всех исполнителей.
  381. Returns:
  382. :obj:`list` из :obj:`str`: Имена исполнителей.
  383. """
  384. return [i.name for i in self.artists if i.name]
  385. @property
  386. def track_id(self) -> str:
  387. """:obj:`str`: Уникальный идентификатор трека состоящий из его номера и номера альбома или просто из номера."""
  388. if self.albums:
  389. return f'{self.id}:{self.albums[0].id}'
  390. return f'{self.id}'
  391. @classmethod
  392. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Track']:
  393. """Десериализация объекта.
  394. Args:
  395. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  396. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  397. Returns:
  398. :obj:`yandex_music.Track`: Трек.
  399. """
  400. if not cls.is_dict_model_data(data):
  401. return None
  402. cls_data = cls.cleanup_data(data, client)
  403. from yandex_music import R128, Album, Artist, LyricsInfo, Major, MetaData, Normalization, PoetryLoverMatch, User
  404. cls_data['albums'] = Album.de_list(data.get('albums'), client)
  405. cls_data['artists'] = Artist.de_list(data.get('artists'), client)
  406. cls_data['normalization'] = Normalization.de_json(data.get('normalization'), client)
  407. cls_data['major'] = Major.de_json(data.get('major'), client)
  408. cls_data['substituted'] = Track.de_json(data.get('substituted'), client)
  409. cls_data['matched_track'] = Track.de_json(data.get('matched_track'), client)
  410. cls_data['user_info'] = User.de_json(data.get('user_info'), client)
  411. cls_data['meta_data'] = MetaData.de_json(data.get('meta_data'), client)
  412. cls_data['poetry_lover_matches'] = PoetryLoverMatch.de_list(data.get('poetry_lover_matches'), client)
  413. cls_data['r128'] = R128.de_json(data.get('r128'), client)
  414. cls_data['lyrics_info'] = LyricsInfo.de_json(data.get('lyrics_info'), client)
  415. return cls(client=client, **cls_data) # type: ignore
  416. # camelCase псевдонимы
  417. #: Псевдоним для :attr:`get_download_info`
  418. getDownloadInfo = get_download_info
  419. #: Псевдоним для :attr:`get_download_info_async`
  420. getDownloadInfoAsync = get_download_info_async
  421. #: Псевдоним для :attr:`get_supplement`
  422. getSupplement = get_supplement
  423. #: Псевдоним для :attr:`get_supplement_async`
  424. getSupplementAsync = get_supplement_async
  425. #: Псевдоним для :attr:`get_lyrics`
  426. getLyrics = get_lyrics
  427. #: Псевдоним для :attr:`get_lyrics_async`
  428. getLyricsAsync = get_lyrics_async
  429. #: Псевдоним для :attr:`get_cover_url`
  430. getCoverUrl = get_cover_url
  431. #: Псевдоним для :attr:`get_og_image_url`
  432. getOgImageUrl = get_og_image_url
  433. #: Псевдоним для :attr:`download_cover`
  434. downloadCover = download_cover
  435. #: Псевдоним для :attr:`download_cover_async`
  436. downloadCoverAsync = download_cover_async
  437. #: Псевдоним для :attr:`download_og_image`
  438. downloadOgImage = download_og_image
  439. #: Псевдоним для :attr:`download_og_image_async`
  440. downloadOgImageAsync = download_og_image_async
  441. #: Псевдоним для :attr:`download_cover_bytes`
  442. downloadCoverBytes = download_cover_bytes
  443. #: Псевдоним для :attr:`download_cover_bytes_async`
  444. downloadCoverBytesAsync = download_cover_bytes_async
  445. #: Псевдоним для :attr:`download_og_image_bytes`
  446. downloadOgImageBytes = download_og_image_bytes
  447. #: Псевдоним для :attr:`download_og_image_bytes_async`
  448. downloadOgImageBytesAsync = download_og_image_bytes_async
  449. #: Псевдоним для :attr:`get_specific_download_info`
  450. getSpecificDownloadInfo = get_specific_download_info
  451. #: Псевдоним для :attr:`get_specific_download_info_async`
  452. getSpecificDownloadInfoAsync = get_specific_download_info_async
  453. #: Псевдоним для :attr:`download_async`
  454. downloadAsync = download_async
  455. #: Псевдоним для :attr:`download_bytes`
  456. downloadBytes = download_bytes
  457. #: Псевдоним для :attr:`download_bytes_async`
  458. downloadBytesAsync = download_bytes_async
  459. #: Псевдоним для :attr:`like_async`
  460. likeAsync = like_async
  461. #: Псевдоним для :attr:`dislike_async`
  462. dislikeAsync = dislike_async
  463. #: Псевдоним для :attr:`artists_name`
  464. artistsName = artists_name
  465. #: Псевдоним для :attr:`track_id`
  466. trackId = track_id