12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621 |
- ####################################################################
- # THIS IS AUTO GENERATED COPY OF client.py. DON'T EDIT IN BY HANDS #
- ####################################################################
- import functools
- import logging
- from datetime import datetime
- from typing import TYPE_CHECKING, Any, Callable, List, Optional, TypeVar, Union, cast
- from yandex_music import (
- Album,
- Artist,
- ArtistAlbums,
- ArtistTracks,
- BriefInfo,
- ChartInfo,
- Dashboard,
- DownloadInfo,
- Experiments,
- Feed,
- Genre,
- Landing,
- LandingList,
- Like,
- PermissionAlerts,
- Playlist,
- PlaylistRecommendations,
- PromoCodeStatus,
- Queue,
- QueueItem,
- Search,
- Settings,
- ShotEvent,
- SimilarTracks,
- StationResult,
- StationTracksResult,
- Status,
- Suggestions,
- Supplement,
- TagResult,
- Track,
- TrackLyrics,
- TracksList,
- UserSettings,
- YandexMusicObject,
- __copyright__,
- __license__,
- __version__,
- )
- if TYPE_CHECKING:
- from yandex_music.base import JSONType
- from yandex_music.exceptions import BadRequestError
- from yandex_music.utils.difference import Difference
- from yandex_music.utils.request_async import Request
- from yandex_music.utils.sign_request import get_sign_request
- de_list = {
- 'artist': Artist.de_list,
- 'album': Album.de_list,
- 'track': Track.de_list,
- 'playlist': Playlist.de_list,
- }
- logging.getLogger(__name__).addHandler(logging.NullHandler())
- F = TypeVar('F', bound=Callable[..., Any])
- UserIdType = Optional[Union[str, int]]
- TimestampType = Optional[Union[str, float, int]]
- def log(method: F) -> F:
- logger = logging.getLogger(method.__module__)
- @functools.wraps(method)
- async def wrapper(*args: Any, **kwargs: Any) -> Any: # noqa: ANN401:
- logger.debug(f'Entering: {method.__name__}')
- result = await method(*args, **kwargs)
- logger.debug(result)
- logger.debug(f'Exiting: {method.__name__}')
- return result
- return wrapper
- class ClientAsync(YandexMusicObject):
- """Класс, представляющий клиент Yandex Music.
- Note:
- Доступные языки: en, uz, uk, us, ru, kk, hy.
- Поле `device` используется только при работе с очередью прослушивания.
- Attributes:
- logger (:obj:`logging.Logger`): Объект логгера.
- token (:obj:`str`): Уникальный ключ для аутентификации.
- base_url (:obj:`str`): Ссылка на API Yandex Music.
- me (:obj:`yandex_music.Status`): Информация об аккаунте.
- device (:obj:`str`): Строка, содержащая сведения об устройстве, с которого выполняются запросы.
- report_unknown_fields (:obj:`bool`): Включены ли предупреждения о неизвестных полях от API,
- которых нет в библиотеке.
- Args:
- token (:obj:`str`, optional): Уникальный ключ для аутентификации.
- base_url (:obj:`str`, optional): Ссылка на API Yandex Music.
- request (:obj:`yandex_music.utils.request.Request`, optional): Пре-инициализация
- :class:`yandex_music.utils.request.Request`.
- language (:obj:`str`, optional): Язык, на котором будут приходить ответы от API. По умолчанию русский.
- report_unknown_fields (:obj:`bool`, optional): Включить предупреждения о неизвестных полях от API,
- которых нет в библиотеке.
- """
- __notice_displayed = True # больше не используется
- def __init__(
- self,
- token: Optional[str] = None,
- base_url: Optional[str] = None,
- request: Optional[Request] = None,
- language: str = 'ru',
- report_unknown_fields: bool = False,
- ) -> None:
- if not ClientAsync.__notice_displayed:
- print(f'Yandex Music API v{__version__}, {__copyright__}')
- print(f'Licensed under the terms of the {__license__}', end='\n\n')
- ClientAsync.__notice_displayed = True
- self.logger = logging.getLogger(__name__)
- self.token = token
- if base_url is None:
- base_url = 'https://api.music.yandex.net'
- self.base_url = base_url
- self.report_unknown_fields = report_unknown_fields
- if request:
- self._request = request
- self._request.set_and_return_client(self)
- else:
- self._request = Request(self)
- self.language = language
- self._request.set_language(self.language)
- self.device = (
- 'os=Python; os_version=; manufacturer=Marshal; '
- 'model=Yandex Music API; clid=; device_id=random; uuid=random'
- )
- self.me: Optional['Status'] = None
- self.account_uid: Optional[str] = None
- @property
- def request(self) -> Request:
- """:obj:`yandex_music.utils.request.Request`: Объект вспомогательного класса для отправки запросов."""
- return self._request
- @log
- async def init(self) -> 'ClientAsync':
- """Получение информацию об аккаунте использующихся в других запросах."""
- self.me = await self.account_status()
- if self.me and self.me.account:
- self.account_uid = self.me.account.uid
- return self
- @log
- async def account_status(self, *args: Any, **kwargs: Any) -> Optional[Status]:
- """Получение статуса аккаунта. Нет обязательных параметров.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Status` | :obj:`None`: Информация об аккаунте если он валиден, иначе :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/account/status'
- result = await self._request.get(url, *args, **kwargs)
- return Status.de_json(result, self)
- @log
- async def account_settings(self, *args: Any, **kwargs: Any) -> Optional[UserSettings]:
- """Получение настроек текущего пользователя.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.UserSettings` | :obj:`None`: Настройки пользователя если аккаунт валиден,
- иначе :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/account/settings'
- result = await self._request.get(url, *args, **kwargs)
- return UserSettings.de_json(result, self)
- @log
- async def account_settings_set(
- self,
- param: Optional[str] = None,
- value: Optional[Union[str, int, bool]] = None,
- data: Optional['JSONType'] = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[UserSettings]:
- """Изменение настроек текущего пользователя.
- Note:
- Доступные названия параметров есть поля в классе :class:`yandex_music.UserSettings`, только в CamelCase.
- Args:
- param (:obj:`str`): Название параметра для изменения.
- value (:obj:`str` | :obj:`int` | :obj:`bool`): Значение параметра.
- data (:obj:`dict`): Словарь параметров и значений для множественного изменения.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.UserSettings` | :obj:`None`: Настройки пользователя или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/account/settings'
- if not data and param:
- data = {param: str(value)}
- result = await self._request.post(url, data, *args, **kwargs)
- return UserSettings.de_json(result, self)
- @log
- async def settings(self, *args: Any, **kwargs: Any) -> Optional[Settings]:
- """Получение предложений по покупке. Нет обязательных параметров.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Settings` | :obj:`None`: Информацию о предлагаемых продуктах если аккаунт валиден
- или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/settings'
- result = await self._request.get(url, *args, **kwargs)
- return Settings.de_json(result, self)
- @log
- async def permission_alerts(self, *args: Any, **kwargs: Any) -> Optional[PermissionAlerts]:
- """Получение оповещений. Нет обязательных параметров.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.PermissionAlerts` | :obj:`None`: Оповещения если аккаунт валиден или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/permission-alerts'
- result = await self._request.get(url, *args, **kwargs)
- return PermissionAlerts.de_json(result, self)
- @log
- async def account_experiments(self, *args: Any, **kwargs: Any) -> Optional[Experiments]:
- """Получение значений экспериментальных функций аккаунта.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Experiments` | :obj:`None`: Состояние экспериментальных функций или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/account/experiments'
- result = await self._request.get(url, *args, **kwargs)
- return Experiments.de_json(result, self)
- @log
- async def consume_promo_code(
- self, code: str, language: Optional[str] = None, *args, **kwargs
- ) -> Optional[PromoCodeStatus]:
- """Активация промо-кода.
- Note:
- Доступные языки: en, uz, uk, us, ru, kk, hy.
- Args:
- code (:obj:`str`): Промо-код.
- language (:obj:`str`, optional): Язык ответа API в ISO 639-1. По умолчанию язык клиента.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.PromoCodeStatus` | :obj:`None`: Информация об активации промо-кода или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/account/consume-promo-code'
- if not language:
- language = self.language
- result = await self._request.post(url, {'code': code, 'language': language}, *args, **kwargs)
- return PromoCodeStatus.de_json(result, self)
- @log
- async def feed(self, *args: Any, **kwargs: Any) -> Optional[Feed]:
- """Получение потока информации (фида) подобранного под пользователя. Содержит умные плейлисты.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Feed` | :obj:`None`: Умные плейлисты пользователя или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/feed'
- result = await self._request.get(url, *args, **kwargs)
- return Feed.de_json(result, self)
- @log
- async def feed_wizard_is_passed(self, *args: Any, **kwargs: Any) -> bool:
- """Получение информации о прохождении визарда.
- Note:
- Временное событие на хэллоуин.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: Прошел ли пользователь визард или нет.
- """
- url = f'{self.base_url}/feed/wizard/is-passed'
- result = await self._request.get(url, *args, **kwargs)
- return result.get('is_wizard_passed') or False
- @log
- async def landing(self, blocks: Union[str, List[str]], *args: Any, **kwargs: Any) -> Optional[Landing]:
- """Получение лендинг-страницы содержащий блоки с новыми релизами, чартами, плейлистами с новинками и т.д.
- Note:
- Поддерживаемые типы блоков: `personalplaylists`, `promotions`, `new-releases`, `new-playlists`, `mixes`,
- `chart`, `artists`, `albums`, `playlists`, `play_contexts`.
- Args:
- blocks (:obj:`str` | :obj:`list` из :obj:`str`): Блок или список блоков необходимых для выдачи.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Landing` | :obj:`None`: Лендинг-страница или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/landing3'
- params = cast('JSONType', {'blocks': blocks, 'eitherUserId': '10254713668400548221'})
- result = await self._request.get(url, params, *args, **kwargs)
- # TODO (MarshalX) что тут делает константа с чьим-то User ID
- # https://github.com/MarshalX/yandex-music-api/issues/553
- return Landing.de_json(result, self)
- @log
- async def chart(self, chart_option: str = '', *args: Any, **kwargs: Any) -> Optional[ChartInfo]:
- """Получение чарта.
- Note:
- `chart_option` - это постфикс к запросу из поля `menu` чарта.
- Например, на сайте можно выбрать глобальный (world) чарт или российский (russia).
- Args:
- chart_option (:obj:`str` optional): Параметры чарта.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.ChartInfo`: Чарт.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/landing3/chart'
- if chart_option:
- url = f'{url}/{chart_option}'
- result = await self._request.get(url, *args, **kwargs)
- return ChartInfo.de_json(result, self)
- @log
- async def new_releases(self, *args: Any, **kwargs: Any) -> Optional[LandingList]:
- """Получение полного списка всех новых релизов (альбомов).
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.LandingList`: Список новых альбомов.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/landing3/new-releases'
- result = await self._request.get(url, *args, **kwargs)
- return LandingList.de_json(result, self)
- @log
- async def new_playlists(self, *args: Any, **kwargs: Any) -> Optional[LandingList]:
- """Получение полного списка всех новых плейлистов.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.LandingList`: Список новых плейлистов.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/landing3/new-playlists'
- result = await self._request.get(url, *args, **kwargs)
- return LandingList.de_json(result, self)
- @log
- async def podcasts(self, *args: Any, **kwargs: Any) -> Optional[LandingList]:
- """Получение подкастов с лендинга.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.LandingList`: Список подкастов.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/landing3/podcasts'
- result = await self._request.get(url, *args, **kwargs)
- return LandingList.de_json(result, self)
- @log
- async def genres(self, *args: Any, **kwargs: Any) -> List[Genre]:
- """Получение жанров музыки.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Genre` | :obj:`None`: Жанры музыки или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/genres'
- result = await self._request.get(url, *args, **kwargs)
- return Genre.de_list(result, self)
- @log
- async def tags(self, tag_id: str, *args: Any, **kwargs: Any) -> Optional[TagResult]:
- """Получение тега (подборки).
- Note:
- Теги есть в `MixLink` у `Landing`, а также плейлистов в `.tags`.
- У `MixLink` есть `URL`, но `tag_id` только его последняя часть.
- Например, `/tag/belarus/`. `Tag` - `belarus`.
- Args:
- tag_id (:obj:`str`): Уникальный идентификатор тега.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.TagResult`: Тег с плейлистами.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/tags/{tag_id}/playlist-ids'
- result = await self._request.get(url, *args, **kwargs)
- return TagResult.de_json(result, self)
- @log
- async def tracks_download_info(
- self,
- track_id: Union[str, int],
- get_direct_links: bool = False,
- *args: Any,
- **kwargs: Any,
- ) -> List[DownloadInfo]:
- """Получение информации о доступных вариантах загрузки трека.
- Args:
- track_id (:obj:`str` | :obj:`list` из :obj:`str`): Уникальный идентификатор трека или треков.
- get_direct_links (:obj:`bool`, optional): Получить ли при вызове метода прямую ссылку на загрузку.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.DownloadInfo` | :obj:`None`: Варианты загрузки трека или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/tracks/{track_id}/download-info'
- result = await self._request.get(url, *args, **kwargs)
- return await DownloadInfo.de_list_async(result, self, get_direct_links)
- @log
- async def track_supplement(self, track_id: Union[str, int], *args: Any, **kwargs: Any) -> Optional[Supplement]:
- """Получение дополнительной информации о треке.
- Warning:
- Получение текста из дополнительной информации устарело. Используйте
- :func:`yandex_music.ClientAsync.tracks_lyrics`.
- Args:
- track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Supplement`: Дополнительная информация о треке.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/tracks/{track_id}/supplement'
- result = await self._request.get(url, *args, **kwargs)
- return Supplement.de_json(result, self)
- @log
- async def tracks_lyrics(
- self,
- track_id: Union[str, int],
- format_: str = 'TEXT',
- **kwargs: Any,
- ) -> Optional[TrackLyrics]:
- """Получение текста трека.
- Note:
- Для работы с методом необходима авторизация.
- Известные значения для аргумента format:
- - `LRC` - формат с временными метками.
- - `TEXT` - простой текст.
- Args:
- track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
- format_ (:obj:`str`): Формат текста.
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.TrackLyrics` | :obj:`None`: Информация о тексте трека.
- Raises:
- :class:`yandex_music.exceptions.UnauthorizedError`: Метод вызван без авторизации.
- :class:`yandex_music.exceptions.NotFoundError`: Текст у трека отсутствует.
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/tracks/{track_id}/lyrics'
- sign = get_sign_request(track_id)
- params = {
- 'format': format_,
- 'timeStamp': sign.timestamp,
- 'sign': sign.value,
- }
- result = await self._request.get(url, params=params, **kwargs)
- return TrackLyrics.de_json(result, self)
- @log
- async def tracks_similar(self, track_id: Union[str, int], *args: Any, **kwargs: Any) -> Optional[SimilarTracks]:
- """Получение похожих треков.
- Args:
- track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.SimilarTracks`: Похожие треки на другой трек.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/tracks/{track_id}/similar'
- result = await self._request.get(url, *args, **kwargs)
- return SimilarTracks.de_json(result, self)
- @log
- async def play_audio(
- self,
- track_id: Union[str, int],
- from_: str,
- album_id: Union[str, int],
- playlist_id: Optional[str] = None,
- from_cache: bool = False,
- play_id: Optional[str] = None,
- uid: Optional[int] = None,
- timestamp: Optional[str] = None,
- track_length_seconds: int = 0,
- total_played_seconds: int = 0,
- end_position_seconds: int = 0,
- client_now: Optional[str] = None,
- *args: Any,
- **kwargs: Any,
- ) -> bool:
- """Метод для отправки текущего состояния прослушиваемого трека.
- Args:
- track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
- from_ (:obj:`str`): Наименования клиента с которого происходит прослушивание.
- album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
- playlist_id (:obj:`str`, optional): Уникальный идентификатор плейлиста, если таковой прослушивается.
- from_cache (:obj:`bool`, optional): Проигрывается ли трек с кеша.
- play_id (:obj:`str`, optional): Уникальный идентификатор проигрывания.
- uid (:obj:`int`, optional): Уникальный идентификатор пользователя.
- timestamp (:obj:`str`, optional): Текущая дата и время в ISO.
- track_length_seconds (:obj:`int`, optional): Продолжительность трека в секундах.
- total_played_seconds (:obj:`int`, optional): Сколько было всего воспроизведено трека в секундах.
- end_position_seconds (:obj:`int`, optional): Окончательное значение воспроизведенных секунд.
- client_now (:obj:`str`, optional): Текущая дата и время клиента в ISO.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if uid is None and self.account_uid is not None:
- uid = self.account_uid
- url = f'{self.base_url}/play-audio'
- data = {
- 'track-id': track_id,
- 'from-cache': str(from_cache),
- 'from': from_,
- 'play-id': play_id or '',
- 'uid': uid,
- 'timestamp': timestamp or f'{datetime.now().isoformat()}Z',
- 'track-length-seconds': track_length_seconds,
- 'total-played-seconds': total_played_seconds,
- 'end-position-seconds': end_position_seconds,
- 'album-id': album_id,
- 'playlist-id': playlist_id,
- 'client-now': client_now or f'{datetime.now().isoformat()}Z',
- }
- result = await self._request.post(url, data, *args, **kwargs)
- return result == 'ok'
- @log
- async def albums_with_tracks(self, album_id: Union[str, int], *args: Any, **kwargs: Any) -> Optional[Album]:
- """Получение альбома по его уникальному идентификатору вместе с треками.
- Args:
- album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Album` | :obj:`None`: Альбом или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/albums/{album_id}/with-tracks'
- result = await self._request.get(url, *args, **kwargs)
- return Album.de_json(result, self)
- @log
- async def search(
- self,
- text: str,
- nocorrect: bool = False,
- type_: str = 'all',
- page: int = 0,
- playlist_in_best: bool = True,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Search]:
- """Осуществление поиска по запросу и типу, получение результатов.
- Note:
- Известные значения для поля `type_`: `all`, `artist`, `user`, `album`, `playlist`, `track`, `podcast`,
- `podcast_episode`.
- При поиске `type=all` не возвращаются подкасты и эпизоды. Указывайте конкретный тип для поиска.
- Args:
- text (:obj:`str`): Текст запроса.
- nocorrect (:obj:`bool`): Если :obj:`False`, то ошибочный запрос будет исправлен. Например, запрос
- "Гражданская абарона" будет исправлен на "Гражданская оборона".
- type_ (:obj:`str`): Среди какого типа искать (трек, плейлист, альбом, исполнитель, пользователь, подкаст).
- page (:obj:`int`): Номер страницы.
- playlist_in_best (:obj:`bool`): Выдавать ли плейлисты лучшим вариантом поиска.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Search` | :obj:`None`: Результаты поиска или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/search'
- params = {
- 'text': text,
- 'nocorrect': str(nocorrect),
- 'type': type_,
- 'page': page,
- 'playlist-in-best': str(playlist_in_best),
- }
- result = await self._request.get(url, params, *args, **kwargs)
- if isinstance(result, str):
- raise BadRequestError(result)
- return Search.de_json(result, self)
- @log
- async def search_suggest(self, part: str, *args: Any, **kwargs: Any) -> Optional[Suggestions]:
- """Получение подсказок по введенной части поискового запроса.
- Args:
- part (:obj:`str`): Часть поискового запроса.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Suggestions` | :obj:`None`: Подсказки для запроса или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/search/suggest'
- result = await self._request.get(url, {'part': part}, *args, **kwargs)
- return Suggestions.de_json(result, self)
- @log
- async def users_settings(self, user_id: UserIdType = None, *args: Any, **kwargs: Any) -> Optional[UserSettings]:
- """Получение настроек пользователя.
- Note:
- Для получения настроек пользователя нужно быть авторизованным или владеть `user_id`.
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя чьи настройки хотим
- получить.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.UserSettings` | :obj:`None`: Настройки пользователя или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/settings'
- result = await self._request.get(url, *args, **kwargs)
- return UserSettings.de_json(result.get('user_settings'), self)
- @log
- async def users_playlists(
- self,
- kind: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Union[Playlist, List[Playlist], None]:
- """Получение плейлиста или списка плейлистов по уникальным идентификаторам.
- Note:
- Если передан один `kind`, то вернётся не список плейлистов, а один плейлист.
- Args:
- kind (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста
- или их список.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Playlist` | :obj:`yandex_music.Playlist` | :obj:`None`:
- Список плейлистов или плейлист, иначе :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- if isinstance(kind, list):
- url = f'{self.base_url}/users/{user_id}/playlists'
- data = {'kinds': kind}
- result = await self._request.post(url, data, *args, **kwargs)
- return Playlist.de_list(result, self)
- url = f'{self.base_url}/users/{user_id}/playlists/{kind}'
- result = await self._request.get(url, *args, **kwargs)
- return Playlist.de_json(result, self)
- @log
- async def users_playlists_recommendations(
- self, kind: Union[str, int], user_id: UserIdType = None, *args: Any, **kwargs: Any
- ) -> Optional[PlaylistRecommendations]:
- """Получение рекомендаций для плейлиста.
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- user_id (:obj:`str` | :obj:`int`): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.PlaylistRecommendations` | :obj:`None`: Рекомендации для плейлиста или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/{kind}/recommendations'
- result = await self._request.get(url, *args, **kwargs)
- return PlaylistRecommendations.de_json(result, self)
- @log
- async def users_playlists_create(
- self,
- title: str,
- visibility: str = 'public',
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Playlist]:
- """Создание плейлиста.
- Args:
- title (:obj:`str`): Название.
- visibility (:obj:`str`, optional): Модификатор доступа.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Playlist` | :obj:`None`: Созданный плейлист или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/create'
- data = {'title': title, 'visibility': visibility}
- result = await self._request.post(url, data, *args, **kwargs)
- return Playlist.de_json(result, self)
- @log
- async def users_playlists_delete(
- self, kind: Union[str, int], user_id: UserIdType = None, *args: Any, **kwargs: Any
- ) -> bool:
- """Удаление плейлиста.
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/{kind}/delete'
- result = await self._request.post(url, *args, **kwargs)
- return result == 'ok'
- @log
- async def users_playlists_name(
- self,
- kind: Union[str, int],
- name: str,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Playlist]:
- """Изменение названия плейлиста.
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- name (:obj:`str`): Новое название.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Playlist` | :obj:`None`: Изменённый плейлист или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/{kind}/name'
- result = await self._request.post(url, {'value': name}, *args, **kwargs)
- return Playlist.de_json(result, self)
- @log
- async def users_playlists_visibility(
- self,
- kind: Union[str, int],
- visibility: str,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Playlist]:
- """Изменение видимости плейлиста.
- Note:
- Видимость (`visibility`) может быть задана только одним из двух значений: `private`, `public`.
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- visibility (:obj:`str`): Новое название.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Playlist` | :obj:`None`: Изменённый плейлист или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/{kind}/visibility'
- result = await self._request.post(url, {'value': visibility}, *args, **kwargs)
- return Playlist.de_json(result, self)
- @log
- async def users_playlists_change(
- self,
- kind: Union[str, int],
- diff: str,
- revision: int = 1,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Playlist]:
- """Изменение плейлиста.
- Note:
- Для получения отличий есть вспомогательный класс :class:`yandex_music.utils.difference.Difference`.
- Так же существуют уже готовые методы-обёртки над операциями.
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- revision (:obj:`int`): TODO.
- diff (:obj:`str`): JSON представления отличий старого и нового плейлиста.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Playlist`: Изменённый плейлист или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/{kind}/change'
- data = {'kind': kind, 'revision': revision, 'diff': diff}
- result = await self._request.post(url, data, *args, **kwargs)
- return Playlist.de_json(result, self)
- @log
- async def users_playlists_insert_track(
- self,
- kind: Union[str, int],
- track_id: Union[str, int],
- album_id: Union[str, int],
- at: int = 0,
- revision: int = 1,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Playlist]:
- """Добавление трека в плейлист.
- Note:
- Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент `at`).
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
- album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
- at (:obj:`int`): Индекс для вставки.
- revision (:obj:`int`): TODO.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Playlist`: Изменённый плейлист или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- diff = Difference().add_insert(at, {'id': track_id, 'album_id': album_id})
- return await self.users_playlists_change(kind, diff.to_json(), revision, user_id, *args, **kwargs)
- @log
- async def users_playlists_delete_track(
- self,
- kind: Union[str, int],
- from_: int,
- to: int,
- revision: int = 1,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[Playlist]:
- """Удаление треков из плейлиста.
- Note:
- Для удаление необходимо указать границы с какого по какой элемент (трек) удалить.
- Args:
- kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
- from_ (:obj:`int`): С какого индекса.
- to (:obj:`int`): По какой индекс.
- revision (:obj:`int`): TODO.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Playlist` | :obj:`None`: Изменённый плейлист или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- diff = Difference().add_delete(from_, to)
- return await self.users_playlists_change(kind, diff.to_json(), revision, user_id, *args, **kwargs)
- @log
- async def rotor_account_status(self, *args: Any, **kwargs: Any) -> Optional[Status]:
- """Получение статуса пользователя с дополнительными полями.
- Note:
- Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Status` | :obj:`None`: Статус пользователя с дополнительными полями от радио или
- :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/rotor/account/status'
- result = await self._request.get(url, *args, **kwargs)
- return Status.de_json(result, self)
- @log
- async def rotor_stations_dashboard(self, *args: Any, **kwargs: Any) -> Optional[Dashboard]:
- """Получение рекомендованных станций текущего пользователя.
- Args:
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Dashboard` | :obj:`None`: Рекомендованные станции или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/rotor/stations/dashboard'
- result = await self._request.get(url, *args, **kwargs)
- return Dashboard.de_json(result, self)
- @log
- async def rotor_stations_list(
- self, language: Optional[str] = None, *args: Any, **kwargs: Any
- ) -> List[StationResult]:
- """Получение всех радиостанций с настройками пользователя.
- Note:
- Доступные языки: en, uz, uk, us, ru, kk, hy.
- Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в поле
- `id_for_from`.
- Args:
- language (:obj:`str`, optional): Язык, на котором будет информация о станциях. По умолчанию язык клиента.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.StationResult`: Список станций.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/rotor/stations/list'
- if not language:
- language = self.language
- result = await self._request.get(url, {'language': language}, *args, **kwargs)
- return StationResult.de_list(result, self)
- @log
- async def rotor_station_feedback(
- self,
- station: str,
- type_: str,
- timestamp: TimestampType = None,
- from_: Optional[str] = None,
- batch_id: Optional[str] = None,
- total_played_seconds: Optional[Union[int, float]] = None,
- track_id: Optional[Union[str, int]] = None,
- **kwargs: Any,
- ) -> bool:
- """Отправка обратной связи на действия при прослушивании радио.
- Note:
- Сообщения о начале прослушивания радио, начале и конце трека, его пропуска.
- Известные типы обратной связи: `radioStarted`, `trackStarted`, `trackFinished`, `skip`.
- Пример `station`: `user:onyourwave`, `genre:allrock`.
- Пример `from_`: `mobile-radio-user-123456789`.
- Args:
- station (:obj:`str`): Станция.
- type_ (:obj:`str`): Тип отправляемого отзыва.
- timestamp (:obj:`str` | :obj:`float` | :obj:`int`, optional): Текущее время и дата.
- from_ (:obj:`str`, optional): Откуда начато воспроизведение радио.
- batch_id (:obj:`str`, optional): Уникальный идентификатор партии треков. Возвращается при получении треков.
- total_played_seconds (:obj:`int` |:obj:`float`, optional): Сколько было проиграно секунд трека
- перед действием.
- track_id (:obj:`int` | :obj:`str`, optional): Уникальной идентификатор трека.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if timestamp is None:
- timestamp = datetime.now().timestamp()
- url = f'{self.base_url}/rotor/station/{station}/feedback'
- params = {}
- data = {'type': type_, 'timestamp': timestamp}
- if batch_id:
- params = {'batch-id': batch_id}
- if track_id:
- data.update({'trackId': track_id})
- if from_:
- data.update({'from': from_})
- if total_played_seconds:
- data.update({'totalPlayedSeconds': total_played_seconds})
- result = await self._request.post(url, params=params, json=data, **kwargs)
- return result == 'ok'
- @log
- async def rotor_station_feedback_radio_started(
- self,
- station: str,
- from_: str,
- batch_id: Optional[str] = None,
- timestamp: TimestampType = None,
- **kwargs: Any,
- ) -> bool:
- """Сокращение для::
- client.rotor_station_feedback(station, 'radioStarted', timestamp, from, batch_id, **kwargs)
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self.rotor_station_feedback(
- station, 'radioStarted', timestamp, from_=from_, batch_id=batch_id, **kwargs
- )
- @log
- async def rotor_station_feedback_track_started(
- self,
- station: str,
- track_id: Union[str, int],
- batch_id: Optional[str] = None,
- timestamp: TimestampType = None,
- **kwargs: Any,
- ) -> bool:
- """Сокращение для::
- client.rotor_station_feedback(station, 'trackStarted', timestamp, track_id=track_id,
- batch_id=batch_id, **kwargs)
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self.rotor_station_feedback(
- station, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id, **kwargs
- )
- @log
- async def rotor_station_feedback_track_finished(
- self,
- station: str,
- track_id: Union[str, int],
- total_played_seconds: float,
- batch_id: Optional[str] = None,
- timestamp: TimestampType = None,
- **kwargs: Any,
- ) -> bool:
- """Сокращение для::
- client.rotor_station_feedback(station, 'trackFinished', timestamp,
- track_id=track_id, total_played_seconds=total_played_seconds, batch_id=batch_id, **kwargs)
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self.rotor_station_feedback(
- station,
- 'trackFinished',
- timestamp,
- track_id=track_id,
- total_played_seconds=total_played_seconds,
- batch_id=batch_id,
- **kwargs,
- )
- @log
- async def rotor_station_feedback_skip(
- self,
- station: str,
- track_id: Union[str, int],
- total_played_seconds: float,
- batch_id: Optional[str] = None,
- timestamp: TimestampType = None,
- **kwargs: Any,
- ) -> bool:
- """Сокращение для::
- client.rotor_station_feedback(station, 'skip', timestamp, track_id=track_id,
- total_played_seconds=total_played_seconds, batch_id=batch_id, **kwargs)
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self.rotor_station_feedback(
- station,
- 'skip',
- timestamp,
- track_id=track_id,
- total_played_seconds=total_played_seconds,
- batch_id=batch_id,
- **kwargs,
- )
- @log
- async def rotor_station_info(self, station: str, *args: Any, **kwargs: Any) -> List[StationResult]:
- """Получение информации о станции и пользовательских настроек на неё.
- Args:
- station (:obj:`str`): Станция.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.StationResult` | :obj:`None`: Информация о станции или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/rotor/station/{station}/info'
- result = await self._request.get(url, *args, **kwargs)
- return StationResult.de_list(result, self)
- @log
- async def rotor_station_settings2(
- self,
- station: str,
- mood_energy: str,
- diversity: str,
- language: str = 'not-russian', # TODO(#555): заменить на any
- type_: str = 'rotor',
- **kwargs: Any,
- ) -> bool:
- """Изменение настроек определённой станции.
- Note:
- Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`.
- Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`.
- Доступные значения для `language`: `not-russian`, `russian`, `any`.
- Доступные значения для `type_`: `rotor`, `generative`.
- У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля.
- Args:
- station (:obj:`str`): Станция.
- mood_energy (:obj:`str`): Настроение.
- diversity (:obj:`str`): Треки.
- language (:obj:`str`): Язык.
- type_ (:obj:`str`): Тип.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/rotor/station/{station}/settings3'
- data = {'moodEnergy': mood_energy, 'diversity': diversity, 'type': type_}
- if language:
- data.update({'language': language})
- result = await self._request.post(url, json=data, **kwargs)
- return result == 'ok'
- @log
- async def rotor_station_tracks(
- self,
- station: str,
- settings2: bool = True,
- queue: Optional[Union[str, int]] = None,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[StationTracksResult]:
- """Получение цепочки треков определённой станции.
- Note:
- Запуск потока по сущности сервиса осуществляется через станцию `<type>:<id>`.
- Например, станцией для запуска потока по треку будет `track:1234`.
- Для продолжения цепочки треков необходимо:
- 1. Передавать `ID` трека, что был до этого (первый в цепочки).
- 2. Отправить фидбек о конце или скипе трека, что был передан в `queue`.
- 3. Отправить фидбек о начале следующего трека (второй в цепочки).
- 4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент.
- Проход по цепочке до конца не изучен. Часто встречаются дубликаты.
- Все официальные клиенты выполняют запросы с `settings2 = True`.
- Args:
- station (:obj:`str`): Станция.
- settings2 (:obj:`bool`, optional): Использовать ли второй набор настроек.
- queue (:obj:`str` | :obj:`int`, optional): Уникальной идентификатор трека, который только что был.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.StationTracksResult` | :obj:`None`: Последовательность треков станции или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/rotor/station/{station}/tracks'
- params = {}
- if settings2:
- params = {'settings2': str(True)}
- if queue:
- params = {'queue': queue}
- result = await self._request.get(url, params, *args, **kwargs)
- return StationTracksResult.de_json(result, self)
- @log
- async def artists_brief_info(self, artist_id: Union[str, int], *args: Any, **kwargs: Any) -> Optional[BriefInfo]:
- """Получение информации об артисте.
- Args:
- artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор исполнителя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.BriefInfo` | :obj:`None`: Информация об артисте или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/artists/{artist_id}/brief-info'
- result = await self._request.get(url, *args, **kwargs)
- return BriefInfo.de_json(result, self)
- @log
- async def artists_tracks(
- self,
- artist_id: Union[str, int],
- page: int = 0,
- page_size: int = 20,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[ArtistTracks]:
- """Получение треков артиста.
- Args:
- artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста.
- page (:obj:`int`, optional): Номер страницы.
- page_size (:obj:`int`, optional): Количество треков на странице.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.ArtistsTracks` | :obj:`None`: Страница списка треков артиста или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/artists/{artist_id}/tracks'
- params = {'page': page, 'page-size': page_size}
- result = await self._request.get(url, params, *args, **kwargs)
- return ArtistTracks.de_json(result, self)
- @log
- async def artists_direct_albums(
- self,
- artist_id: Union[str, int],
- page: int = 0,
- page_size: int = 20,
- sort_by: str = 'year',
- *args: Any,
- **kwargs: Any,
- ) -> Optional[ArtistAlbums]:
- """Получение альбомов артиста.
- Note:
- Известные значения для `sort_by`: `year`, `rating`.
- Args:
- artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста.
- page (:obj:`int`, optional): Номер страницы.
- page_size (:obj:`int`, optional): Количество альбомов на странице.
- sort_by (:obj:`str`, optional): Параметр для сортировки.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.ArtistAlbums` | :obj:`None`: Страница списка альбомов артиста или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/artists/{artist_id}/direct-albums'
- params = {'sort-by': sort_by, 'page': page, 'page-size': page_size}
- result = await self._request.get(url, params, *args, **kwargs)
- return ArtistAlbums.de_json(result, self)
- async def _like_action(
- self,
- object_type: str,
- ids: Union[List[Union[str, int]], str, int],
- remove: bool = False,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> bool:
- """Действия с отметкой "Мне нравится".
- Note:
- Типы объектов: `track` - трек, `artist` - исполнитель, `playlist` - плейлист, `album` - альбом.
- Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
- плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
- Args:
- object_type (:obj:`str`): Тип объекта.
- ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор объекта или объектов.
- remove (:obj:`bool`, optional): Если :obj:`True` то снимает отметку, иначе ставит.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- action = 'remove' if remove else 'add-multiple'
- url = f'{self.base_url}/users/{user_id}/likes/{object_type}s/{action}'
- result = await self._request.post(url, {f'{object_type}-ids': ids}, *args, **kwargs)
- if object_type == 'track':
- return 'revision' in result
- return result == 'ok'
- @log
- async def users_likes_tracks_add(
- self,
- track_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Поставить отметку "Мне нравится" треку/трекам.
- Note:
- Так же снимает отметку "Не рекомендовать" если она есть.
- Args:
- track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор трека или треков.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('track', track_ids, remove=False, user_id=user_id, **kwargs)
- @log
- async def users_likes_tracks_remove(
- self,
- track_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Снять отметку "Мне нравится" у трека/треков.
- Args:
- track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор трека или треков.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('track', track_ids, remove=True, user_id=user_id, **kwargs)
- @log
- async def users_likes_artists_add(
- self,
- artist_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Поставить отметку "Мне нравится" исполнителю/исполнителям.
- Args:
- artist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор артиста или артистов.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('artist', artist_ids, remove=False, user_id=user_id, **kwargs)
- @log
- async def users_likes_artists_remove(
- self,
- artist_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Снять отметку "Мне нравится" у исполнителя/исполнителей.
- Args:
- artist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор артиста или артистов.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('artist', artist_ids, remove=True, user_id=user_id, **kwargs)
- @log
- async def users_likes_playlists_add(
- self,
- playlist_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Поставить отметку "Мне нравится" плейлисту/плейлистам.
- Note:
- Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
- плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
- Args:
- playlist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор плейлиста или плейлистов.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('playlist', playlist_ids, remove=False, user_id=user_id, **kwargs)
- @log
- async def users_likes_playlists_remove(
- self,
- playlist_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Снять отметку "Мне нравится" у плейлиста/плейлистов.
- Note:
- Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
- плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
- Args:
- playlist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор плейлиста или плейлистов.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('playlist', playlist_ids, remove=True, user_id=user_id, **kwargs)
- @log
- async def users_likes_albums_add(
- self,
- album_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Поставить отметку "Мне нравится" альбому/альбомам.
- Args:
- album_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор артиста или артистов.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('album', album_ids, remove=False, user_id=user_id, **kwargs)
- @log
- async def users_likes_albums_remove(
- self,
- album_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Снять отметку "Мне нравится" у альбома/альбомов.
- Args:
- album_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор артиста или артистов.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._like_action('album', album_ids, remove=True, user_id=user_id, **kwargs)
- async def _get_list(
- self,
- object_type: str,
- ids: Union[List[Union[str, int]], int, str],
- params: Optional['JSONType'] = None,
- *args: Any,
- **kwargs: Any,
- ) -> List[Union[Artist, Album, Track, Playlist]]:
- """Получение объекта/объектов.
- Args:
- object_type (:obj:`str`): Тип объекта.
- ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор объекта или объектов.
- params (:obj:`dict`, optional): Параметры, которые будут переданы в запрос.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Artist` | :obj:`list` из :obj:`yandex_music.Album` |
- :obj:`list` из :obj:`yandex_music.Track` | :obj:`list` из :obj:`yandex_music.Playlist`: Запрошенный
- объект.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if params is None:
- params = {}
- params.update({f'{object_type}-ids': ids})
- url = f'{self.base_url}/{object_type}s' + ('/list' if object_type == 'playlist' else '')
- result = await self._request.post(url, params, *args, **kwargs)
- return de_list[object_type](result, self)
- @log
- async def artists(
- self, artist_ids: Union[List[Union[str, int]], int, str], *args: Any, **kwargs: Any
- ) -> List[Artist]:
- """Получение исполнителя/исполнителей.
- Args:
- artist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор исполнителя или исполнителей.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Artist`: Исполнитель или исполнители.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_list('artist', artist_ids, *args, **kwargs)
- @log
- async def albums(self, album_ids: Union[List[Union[str, int]], int, str], *args: Any, **kwargs: Any) -> List[Album]:
- """Получение альбома/альбомов.
- Args:
- album_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор альбома или альбомов.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Album`: Альбом или альбомы.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_list('album', album_ids, *args, **kwargs)
- @log
- async def tracks(
- self,
- track_ids: Union[List[str], List[int], List[Union[str, int]], int, str],
- with_positions: bool = True,
- *args: Any,
- **kwargs: Any,
- ) -> List[Track]:
- """Получение трека/треков.
- Args:
- track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор трека или треков.
- with_positions (:obj:`bool`, optional): С позициями TODO.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Track`: Трек или Треки.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_list('track', track_ids, {'with-positions': str(with_positions)}, *args, **kwargs)
- @log
- async def playlists_list(
- self, playlist_ids: Union[List[Union[str, int]], int, str], *args: Any, **kwargs: Any
- ) -> List[Playlist]:
- """Получение плейлиста/плейлистов.
- Note:
- Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
- плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
- Данный метод возвращает сокращенную модель плейлиста для отображения больших список.
- Warning:
- Данный метод не возвращает список треков у плейлиста! Для получения объекта :obj:`yandex_music.Playlist` c
- заполненным полем `tracks` используйте метод :func:`yandex_music.ClientAsync.users_playlists` или
- метод :func:`yandex_music.Playlist.fetch_tracks`.
- Args:
- playlist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор плейлиста или плейлистов.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Playlist`: Плейлист или плейлисты.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_list('playlist', playlist_ids, *args, **kwargs)
- @log
- async def playlists_collective_join(self, user_id: int, token: str, **kwargs: Any) -> bool:
- """Присоединение к плейлисту как соавтор.
- Note:
- В качестве `user_id` принимается исключительно числовой уникальный идентификатор пользователя, не username.
- Токен можно получить в Web-версии. Для этого, на странице плейлиста нужно нажать на
- "Добавить соавтора". В полученной ссылке GET параметр `token` и будет токеном для присоединения.
- Args:
- user_id (:obj:`int`): Владелец плейлиста.
- token (:obj:`str`): Токен для присоединения.
- **kwargs: Произвольные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/playlists/collective/join'
- params = {'uid': user_id, 'token': token}
- result = await self._request.post(url, params=params, **kwargs)
- return result == 'ok'
- @log
- async def users_playlists_list(self, user_id: UserIdType = None, *args: Any, **kwargs: Any) -> List[Playlist]:
- """Получение списка плейлистов пользователя.
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Playlist`: Плейлисты пользователя.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/playlists/list'
- result = await self._request.get(url, *args, **kwargs)
- return Playlist.de_list(result, self)
- async def _get_likes(
- self,
- object_type: str,
- user_id: UserIdType = None,
- params: Optional['JSONType'] = None,
- *args: Any,
- **kwargs: Any,
- ) -> Union[List[Like], Optional[TracksList]]:
- """Получение объектов с отметкой "Мне нравится".
- Args:
- object_type (:obj:`str`): Тип объекта.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- params (:obj:`dict`, optional): Параметры, которые будут переданы в запрос.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Like` | :obj:`yandex_music.TracksList`: Объекты с отметкой "Мне нравится".
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/likes/{object_type}s'
- result = await self._request.get(url, params, *args, **kwargs)
- if object_type == 'track':
- return TracksList.de_json(result.get('library'), self)
- return Like.de_list(result, self, object_type)
- @log
- async def users_likes_tracks(
- self,
- user_id: UserIdType = None,
- if_modified_since_revision: int = 0,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[TracksList]:
- """Получение треков с отметкой "Мне нравится".
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- if_modified_since_revision (:obj:`int`, optional): TODO.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.TracksList`: Треки с отметкой "Мне нравится".
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_likes(
- 'track', user_id, {'if-modified-since-revision': if_modified_since_revision}, *args, **kwargs
- )
- @log
- async def users_likes_albums(
- self, user_id: UserIdType = None, rich: bool = True, *args: Any, **kwargs: Any
- ) -> List[Like]:
- """Получение альбомов с отметкой "Мне нравится".
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- rich (:obj:`bool`, optional): Если False, то приходит укороченная версия.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Like`: Альбомы с отметкой "Мне нравится".
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_likes('album', user_id, {'rich': str(rich)}, *args, **kwargs)
- @log
- async def users_likes_artists(
- self,
- user_id: UserIdType = None,
- with_timestamps: bool = True,
- *args: Any,
- **kwargs: Any,
- ) -> List[Like]:
- """Получение артистов с отметкой "Мне нравится".
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- with_timestamps (:obj:`bool`, optional): С временными метками TODO.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Like`: Артисты с отметкой "Мне нравится".
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_likes('artist', user_id, {'with-timestamps': str(with_timestamps)}, *args, **kwargs)
- @log
- async def users_likes_playlists(self, user_id: UserIdType = None, *args: Any, **kwargs: Any) -> List[Like]:
- """Получение плейлистов с отметкой "Мне нравится".
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.Like`: Плейлисты с отметкой "Мне нравится".
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._get_likes('playlist', user_id, *args, **kwargs)
- @log
- async def users_dislikes_tracks(
- self,
- user_id: UserIdType = None,
- if_modified_since_revision: int = 0,
- *args: Any,
- **kwargs: Any,
- ) -> Optional[TracksList]:
- """Получение треков с отметкой "Не рекомендовать".
- Args:
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- if_modified_since_revision (:obj:`bool`, optional): TODO.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.TracksList`: Треки с отметкой "Не рекомендовать".
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- url = f'{self.base_url}/users/{user_id}/dislikes/tracks'
- result = await self._request.get(
- url, {'if_modified_since_revision': if_modified_since_revision}, *args, **kwargs
- )
- return TracksList.de_json(result.get('library'), self)
- async def _dislike_action(
- self,
- ids: Union[List[Union[str, int]], str, int],
- remove: bool = False,
- user_id: UserIdType = None,
- *args: Any,
- **kwargs: Any,
- ) -> bool:
- """Действия с отметкой "Не рекомендовать".
- Args:
- ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор объекта или объектов.
- remove (:obj:`bool`, optional): Если :obj:`True`, то снимает отметку, иначе ставит.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if user_id is None and self.account_uid is not None:
- user_id = self.account_uid
- action = 'remove' if remove else 'add-multiple'
- url = f'{self.base_url}/users/{user_id}/dislikes/tracks/{action}'
- result = await self._request.post(url, {'track-ids': ids}, *args, **kwargs)
- return 'revision' in result
- @log
- async def users_dislikes_tracks_add(
- self,
- track_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Поставить отметку "Не рекомендовать" треку/трекам.
- Note:
- Так же снимает отметку "Мне нравится" если она есть.
- Args:
- track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор трека или треков.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._dislike_action(track_ids, remove=False, user_id=user_id, **kwargs)
- @log
- async def users_dislikes_tracks_remove(
- self,
- track_ids: Union[List[Union[str, int]], str, int],
- user_id: UserIdType = None,
- **kwargs: Any,
- ) -> bool:
- """Снять отметку "Не рекомендовать" у трека/треков.
- Args:
- track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
- идентификатор трека или треков.
- user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
- используется ID текущего пользователя.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- return await self._dislike_action(track_ids, remove=True, user_id=user_id, **kwargs)
- @log
- async def after_track(
- self,
- next_track_id: Union[str, int],
- context_item: str,
- prev_track_id: Optional[Union[str, int]] = None,
- context: str = 'playlist',
- types: str = 'shot',
- from_: str = 'mobile-landing-origin-default',
- *args: Any,
- **kwargs: Any,
- ) -> Optional[ShotEvent]:
- """Получение рекламы или шота от Алисы после трека.
- Note:
- При получения шота от Алисы `prev_track_id` можно не указывать.
- Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`.
- Плейлист с Алисой имеет владельца с `id = 940441070`.
- ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя.
- Известные значения `context`: `playlist`.
- Известные значения `types`: `shot`, `ad`.
- Args:
- prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека.
- next_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор следующего трека.
- context_item (:obj:`str`): Уникальный идентификатор контекста.
- context (:obj:`str`, optional): Место, откуда было вызвано получение.
- types (:obj:`str`, optional): Тип того, что вернуть после трека.
- from_ (:obj:`str`, optional): Место, с которого попали в контекст.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.ShotEvent`: Шот от Алисы или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/after-track'
- params = {
- 'from': from_,
- 'prevTrackId': prev_track_id,
- 'nextTrackId': next_track_id,
- 'context': context,
- 'contextItem': context_item,
- 'types': types,
- }
- result = await self._request.get(url, params, *args, **kwargs)
- # TODO (MarshalX) судя по всему ручка ещё возвращает рекламу после треков для пользователей без подписки.
- # https://github.com/MarshalX/yandex-music-api/issues/557
- return ShotEvent.de_json(result.get('shot_event'), self)
- @log
- async def queues_list(self, device: Optional[str] = None, *args: Any, **kwargs: Any) -> List[QueueItem]:
- """Получение всех очередей треков с разных устройств для синхронизации между ними.
- Note:
- Именно к `device` привязывается очередь. На одном устройстве может быть создана одна очередь.
- Аргумент `device` имеет следующий формат: `ключ=значение; ключ2=значение2`. Обязательные паля указы в
- значении по умолчанию.
- Args:
- device (:obj:`str`, optional): Содержит информацию об устройстве с которого выполняется запрос.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`list` из :obj:`yandex_music.QueueItem`: Элементы очереди всех устройств.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if not device:
- device = self.device
- url = f'{self.base_url}/queues'
- self._request.headers['X-Yandex-Music-Device'] = device
- result = await self._request.get(url, *args, **kwargs)
- return QueueItem.de_list(result.get('queues'), self)
- @log
- async def queue(self, queue_id: str, *args: Any, **kwargs: Any) -> Optional[Queue]:
- """Получение информации об очереди треков и самих треков в ней.
- Args:
- queue_id (:obj:`str`): Уникальный идентификатор очереди.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`yandex_music.Queue`: Очередь или :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- url = f'{self.base_url}/queues/{queue_id}'
- result = await self._request.get(url, *args, **kwargs)
- return Queue.de_json(result, self)
- @log
- async def queue_update_position(
- self, queue_id: str, current_index: int, device: Optional[str] = None, **kwargs
- ) -> bool:
- """Установка текущего индекса проигрываемого трека в очереди треков.
- Note:
- Изменить можно только у той очереди, которая была создана с переданного `device`!
- Args:
- queue_id (:obj:`str`): Уникальный идентификатор очереди.
- current_index (:obj:`int`): Текущий индекс.
- device (:obj:`str`, optional): Содержит информацию об устройстве с которого выполняется запрос.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if not device:
- device = self.device
- url = f'{self.base_url}/queues/{queue_id}/update-position'
- self._request.headers['X-Yandex-Music-Device'] = device
- result = await self._request.post(
- url, {'isInteractive': False}, params={'currentIndex': current_index}, **kwargs
- )
- return result.get('status') == 'ok'
- @log
- async def queue_create(
- self, queue: Union[Queue, str], device: Optional[str] = None, *args: Any, **kwargs: Any
- ) -> Optional[str]:
- """Создание новой очереди треков.
- Args:
- queue (:obj:`yandex_music.Queue` | :obj:`str`): Объект очереди или JSON строка с этим объектом.
- device (:obj:`str`, optional): Содержит информацию об устройстве с которого выполняется запрос.
- *args: Произвольные аргументы (будут переданы в запрос).
- **kwargs: Произвольные именованные аргументы (будут переданы в запрос).
- Returns:
- :obj:`str`: Вернёт уникальный идентификатор созданной очереди, иначе :obj:`None`.
- Raises:
- :class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
- """
- if not device:
- device = self.device
- if isinstance(queue, Queue):
- queue = queue.to_json(True)
- url = f'{self.base_url}/queues'
- self._request.headers['X-Yandex-Music-Device'] = device
- result = await self._request.post(url, queue, *args, **kwargs)
- return result.get('id')
- # camelCase псевдонимы
- #: Псевдоним для :attr:`account_status`
- accountStatus = account_status
- #: Псевдоним для :attr:`account_settings`
- accountSettings = account_settings
- #: Псевдоним для :attr:`account_settings_set`
- accountSettingsSet = account_settings_set
- #: Псевдоним для :attr:`permission_alerts`
- permissionAlerts = permission_alerts
- #: Псевдоним для :attr:`account_experiments`
- accountExperiments = account_experiments
- #: Псевдоним для :attr:`consume_promo_code`
- consumePromoCode = consume_promo_code
- #: Псевдоним для :attr:`feed_wizard_is_passed`
- feedWizardIsPassed = feed_wizard_is_passed
- #: Псевдоним для :attr:`new_releases`
- newReleases = new_releases
- #: Псевдоним для :attr:`new_playlists`
- newPlaylists = new_playlists
- #: Псевдоним для :attr:`tracks_download_info`
- tracksDownloadInfo = tracks_download_info
- #: Псевдоним для :attr:`track_supplement`
- trackSupplement = track_supplement
- #: Псевдоним для :attr:`tracks_lyrics`
- tracksLyrics = tracks_lyrics
- #: Псевдоним для :attr:`tracks_similar`
- tracksSimilar = tracks_similar
- #: Псевдоним для :attr:`play_audio`
- playAudio = play_audio
- #: Псевдоним для :attr:`albums_with_tracks`
- albumsWithTracks = albums_with_tracks
- #: Псевдоним для :attr:`search_suggest`
- searchSuggest = search_suggest
- #: Псевдоним для :attr:`users_settings`
- usersSettings = users_settings
- #: Псевдоним для :attr:`users_playlists`
- usersPlaylists = users_playlists
- #: Псевдоним для :attr:`users_playlists_recommendations`
- usersPlaylistsRecommendations = users_playlists_recommendations
- #: Псевдоним для :attr:`users_playlists_create`
- usersPlaylistsCreate = users_playlists_create
- #: Псевдоним для :attr:`users_playlists_delete`
- usersPlaylistsDelete = users_playlists_delete
- #: Псевдоним для :attr:`users_playlists_name`
- usersPlaylistsName = users_playlists_name
- #: Псевдоним для :attr:`users_playlists_visibility`
- usersPlaylistsVisibility = users_playlists_visibility
- #: Псевдоним для :attr:`users_playlists_change`
- usersPlaylistsChange = users_playlists_change
- #: Псевдоним для :attr:`users_playlists_insert_track`
- usersPlaylistsInsertTrack = users_playlists_insert_track
- #: Псевдоним для :attr:`users_playlists_delete_track`
- usersPlaylistsDeleteTrack = users_playlists_delete_track
- #: Псевдоним для :attr:`rotor_account_status`
- rotorAccountStatus = rotor_account_status
- #: Псевдоним для :attr:`rotor_stations_dashboard`
- rotorStationsDashboard = rotor_stations_dashboard
- #: Псевдоним для :attr:`rotor_stations_list`
- rotorStationsList = rotor_stations_list
- #: Псевдоним для :attr:`rotor_station_feedback`
- rotorStationFeedback = rotor_station_feedback
- #: Псевдоним для :attr:`rotor_station_feedback_radio_started`
- rotorStationFeedbackRadioStarted = rotor_station_feedback_radio_started
- #: Псевдоним для :attr:`rotor_station_feedback_track_started`
- rotorStationFeedbackTrackStarted = rotor_station_feedback_track_started
- #: Псевдоним для :attr:`rotor_station_feedback_track_finished`
- rotorStationFeedbackTrackFinished = rotor_station_feedback_track_finished
- #: Псевдоним для :attr:`rotor_station_feedback_skip`
- rotorStationFeedbackSkip = rotor_station_feedback_skip
- #: Псевдоним для :attr:`rotor_station_info`
- rotorStationInfo = rotor_station_info
- #: Псевдоним для :attr:`rotor_station_settings2`
- rotorStationSettings2 = rotor_station_settings2
- #: Псевдоним для :attr:`rotor_station_tracks`
- rotorStationTracks = rotor_station_tracks
- #: Псевдоним для :attr:`artists_brief_info`
- artistsBriefInfo = artists_brief_info
- #: Псевдоним для :attr:`artists_tracks`
- artistsTracks = artists_tracks
- #: Псевдоним для :attr:`artists_direct_albums`
- artistsDirectAlbums = artists_direct_albums
- #: Псевдоним для :attr:`users_likes_tracks_add`
- usersLikesTracksAdd = users_likes_tracks_add
- #: Псевдоним для :attr:`users_likes_tracks_remove`
- usersLikesTracksRemove = users_likes_tracks_remove
- #: Псевдоним для :attr:`users_likes_artists_add`
- usersLikesArtistsAdd = users_likes_artists_add
- #: Псевдоним для :attr:`users_likes_artists_remove`
- usersLikesArtistsRemove = users_likes_artists_remove
- #: Псевдоним для :attr:`users_likes_playlists_add`
- usersLikesPlaylistsAdd = users_likes_playlists_add
- #: Псевдоним для :attr:`users_likes_playlists_remove`
- usersLikesPlaylistsRemove = users_likes_playlists_remove
- #: Псевдоним для :attr:`users_likes_albums_add`
- usersLikesAlbumsAdd = users_likes_albums_add
- #: Псевдоним для :attr:`users_likes_albums_remove`
- usersLikesAlbumsRemove = users_likes_albums_remove
- #: Псевдоним для :attr:`playlists_list`
- playlistsList = playlists_list
- #: Псевдоним для :attr:`playlists_collective_join`
- playlistsCollectiveJoin = playlists_collective_join
- #: Псевдоним для :attr:`users_playlists_list`
- usersPlaylistsList = users_playlists_list
- #: Псевдоним для :attr:`users_likes_tracks`
- usersLikesTracks = users_likes_tracks
- #: Псевдоним для :attr:`users_likes_albums`
- usersLikesAlbums = users_likes_albums
- #: Псевдоним для :attr:`users_likes_artists`
- usersLikesArtists = users_likes_artists
- #: Псевдоним для :attr:`users_likes_playlists`
- usersLikesPlaylists = users_likes_playlists
- #: Псевдоним для :attr:`users_dislikes_tracks`
- usersDislikesTracks = users_dislikes_tracks
- #: Псевдоним для :attr:`users_dislikes_tracks_add`
- usersDislikesTracksAdd = users_dislikes_tracks_add
- #: Псевдоним для :attr:`users_dislikes_tracks_remove`
- usersDislikesTracksRemove = users_dislikes_tracks_remove
- #: Псевдоним для :attr:`after_track`
- afterTrack = after_track
- #: Псевдоним для :attr:`queues_list`
- queuesList = queues_list
- #: Псевдоним для :attr:`queue_update_position`
- queueUpdatePosition = queue_update_position
- #: Псевдоним для :attr:`queue_create`
- queueCreate = queue_create
|