================ Yandex Music API ================
Делаю то, что по определённым причинам не сделала компания Yandex.
⚠️ Это неофициальная библиотека.
Сообщество разработчиков общаются и помогают друг другу
в Telegram чате <https://t.me/yandex_music_api>
_, присоединяйтесь!
.. image:: https://img.shields.io/badge/python-3.7+-blue.svg :target: https://pypi.org/project/yandex-music/ :alt: Поддерживаемые Python версии
.. image:: https://codecov.io/gh/MarshalX/yandex-music-api/branch/main/graph/badge.svg :target: https://codecov.io/gh/MarshalX/yandex-music-api :alt: Покрытие кода тестами
.. image:: https://api.codacy.com/project/badge/Grade/27011a5a8d9f4b278d1bfe2fe8725fed :target: https://www.codacy.com/manual/MarshalX/yandex-music-api :alt: Качество кода
.. image:: https://github.com/MarshalX/yandex-music-api/actions/workflows/pytest_full.yml/badge.svg :target: https://github.com/MarshalX/yandex-music-api/actions/workflows/pytest_full.yml :alt: Статус тестов
.. image:: https://readthedocs.org/projects/yandex-music/badge/?version=latest :target: https://yandex-music.readthedocs.io/en/latest/?badge=latest :alt: Статус документации
.. image:: https://img.shields.io/badge/license-LGPLv3-lightgrey.svg :target: https://www.gnu.org/licenses/lgpl-3.0.html :alt: Лицензия LGPLv3
========== Содержание ==========
Введение
_#. Доступ к вашим данным Яндекс.Музыка
_
Установка
_
Начало работы
_
#. Изучение по примерам
_
#. Особенности использования асинхронного клиента
_
#. Логирование
_
#. Документация
_
Получение помощи
_
Список изменений
_
Реализации на других языках
_
#. C#
_
#. PHP
_
#. JavaScript
_
Разработанные проекты
_#. Плагин для Kodi
_
#. Telegram бот-клиент
_
Благодарность
_
Внесение своего вклада в проект
_
Лицензия
_
======== Введение ========
Эта библиотека предоставляется Python интерфейс для никем незадокументированного и сделанного только для себя API Яндекс Музыки.
Она совместима с версиями Python 3.7+ и поддерживает работу как с синхронном, так и асинхронным (asyncio) кодом.
В дополнение к реализации чистого API данная библиотека имеет ряд классов-обёрток объектов высокого уровня дабы сделать разработку клиентов и скриптов простой и понятной. Вся документация была написана с нуля исходя из логического анализа в ходе обратной разработки (reverse engineering) API.
Начиная с версии 2.0.0 <https://github.com/MarshalX/yandex-music-api/blob/main/CHANGES.rst#%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F-200>
_ библиотека больше не предоставляет интерфейсы для работы
с OAuth Яндекс и Яндекс.Паспорт. Задача по получению токена для доступа к данным
на плечах разработчиков использующих данную библиотеку.
========= Установка =========
Вы можете установить или обновить Yandex Music API при помощи:
.. code:: shell
pip install yandex-music --upgrade
Или Вы можете установить из исходного кода с помощью:
.. code:: shell
git clone https://github.com/MarshalX/yandex-music-api
cd yandex-music-api
python setup.py install
============= Начало работы =============
Приступив к работе первым делом необходимо создать экземпляр клиента.
Инициализация синхронного клиента:
.. code:: python
from yandex_music import Client
client = Client()
client.init()
# или
client = Client().init()
Инициализация асинхронного клиента:
.. code:: python
from yandex_music import ClientAsync
client = ClientAsync()
await client.init()
# или
client = await Client().init()
Вызов init()
необходим для получение информации для упрощения будущих запросов.
Работа без авторизации ограничена. Так, например, для загрузки будут доступны только первые 30 секунд аудиофайла. Для понимания всех ограничений зайдите на сайт Яндекс.Музыка под инкогнито и воспользуйтесь сервисом.
Для доступа к своим личным данным следует авторизоваться. Это осуществляется через токен аккаунта Яндекс.Музыка.
Авторизация:
.. code:: python
from yandex_music import Client
client = Client('token').init()
После успешного создания клиента Вы вольны в выборе необходимого метода
из API. Все они доступны у объекта класса Client
. Подробнее в методах клиента
в документации <https://yandex-music.readthedocs.io/en/latest/yandex_music.client.html>
_.
Пример получения первого трека из плейлиста "Мне нравится" и его загрузка:
.. code:: python
from yandex_music import Client
client = Client('token').init()
client.users_likes_tracks()[0].fetch_track().download('example.mp3')
В примере выше клиент получает список треков которые были отмечены как
понравившиеся. API возвращает объект
TracksList <https://yandex-music.readthedocs.io/en/latest/yandex_music.tracks_list.html>
в котором содержится список с треками класса
TrackShort <https://yandex-music.readthedocs.io/en/latest/yandex_music.track_short.html>
.
Данный класс содержит наиважнейшую информацию о треке и никаких подробностей,
поэтому для получения полной версии трека со всей информацией необходимо
обратиться к методу fetch_track()
. Затем можно скачать трек методом download()
.
Пример получения треков по ID:
.. code:: python
from yandex_music import Client
client = Client().init()
client.tracks(['10994777:1193829', '40133452:5206873', '48966383:6693286', '51385674:7163467'])
В качестве ID трека выступает его уникальный номер и номер альбома. Первым треком из примера является следующий трек: music.yandex.ru/album/1193829/track/10994777
Выполнение запросов с использование прокси в синхронной версии:
.. code:: python
from yandex_music.utils.request import Request
from yandex_music import Client
request = Request(proxy_url='socks5://user:[email protected]:port')
client = Client(request=request).init()
Примеры proxy url:
Больше примеров тут: proxies - advanced usage - requests <https://2.python-requests.org/en/master/user/advanced/#proxies>
_
Выполнение запросов с использование прокси в асинхронной версии:
.. code:: python
from yandex_music.utils.request_async import Request
from yandex_music import ClientAsync
request = Request(proxy_url='http://user:[email protected]')
client = await ClientAsync(request=request).init()
Socks прокси не поддерживаются в асинхронной версии.
Про поддерживаемые прокси тут: proxy support - advanced usage - aiohttp <https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support>
_
Вот несколько примеров для обзора. Даже если это не Ваш подход к обучению, пожалуйста, возьмите и бегло просмотрите их.
Код примеров опубликован в открытом доступе, поэтому Вы можете взять его и начать писать вокруг своё.
Посетите эту страницу <https://github.com/MarshalX/yandex-music-api/blob/main/examples/>
_
чтобы изучить официальные примеры.
При работе с асинхронной версией библиотеке стоит всегда помнить следующие особенности:
ClientAsync
, а не просто Client
._async
.Пояснение ко второму пункту:
.. code:: python
from yandex_music import ClientAsync
client = await ClientAsync('token').init()
liked_short_track = (await client.users_likes_tracks())[0]
# правильно
full_track = await liked_short_track.fetch_track_async()
await full_track.download_async()
# НЕПРАВИЛЬНО
full_track = await liked_short_track.fetch_track()
await full_track.download()
Данная библиотека использует logging
модуль. Чтобы настроить логирование на
стандартный вывод, поместите
.. code:: python
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
в начало вашего скрипта.
Вы также можете использовать логирование в вашем приложении, вызвав
logging.getLogger()
и установить уровень какой Вы хотите:
.. code:: python
logger = logging.getLogger()
logger.setLevel(logging.INFO)
Если Вы хотите DEBUG
логирование:
.. code:: python
logger.setLevel(logging.DEBUG)
============ Документация ============
Документация yandex-music-api
расположена на
readthedocs.io <https://yandex-music.readthedocs.io/>
.
Вашей отправной точкой должен быть класс Client
, а точнее его методы.
Именно они выполняют все
запросы на API и возвращают Вам готовые объекты.
Класс Client на readthedocs.io <https://yandex-music.readthedocs.io/en/latest/yandex_music.client.html>
.
================ Получение помощи ================
Получить помощь можно несколькими путями:
Telegram чате <https://t.me/yandex_music_api>
_, где мы помогаем друг другу, присоединяйтесь!создав Bug Report <https://github.com/MarshalX/yandex-music-api/issues/new?assignees=MarshalX&labels=bug&template=bug-report.md&title=>
_.создав discussion <https://github.com/MarshalX/yandex-music-api/discussions/new>
_.документации библиотеки <https://yandex-music.readthedocs.io/en/latest/>
_.================ Список изменений ================
Весь список изменений ведётся в файле CHANGES.rst <https://github.com/MarshalX/yandex-music-api/blob/main/CHANGES.rst>
_.
=========================== Реализации на других языках ===========================
-- C# --
Реализация с совершенно другим подходом, так как используется API для frontend'a,
а не мобильных и десктопных приложений:
Winster332/Yandex.Music.Api <https://github.com/Winster332/Yandex.Music.Api>
_.
@Winster332 <https://github.com/Winster332>
не сильно проявляет активность,
но существует форк, который продолжил начатое. Эндпоинты изменены с фронтовых на
мобильные: K1llMan/Yandex.Music.Api <https://github.com/K1llMan/Yandex.Music.Api>
.
Частично переписанная текущая библиотека на PHP:
LuckyWins/yandex-music-api <https://github.com/LuckyWins/yandex-music-api>
_.
API wrapper на Node.JS. Не обновлялся больше двух лет:
itsmepetrov/yandex-music-api <https://github.com/itsmepetrov/yandex-music-api>
.
Продолжение разработки заброшенной библиотеки: kontsevoye/ym-api <https://github.com/kontsevoye/ym-api>
.
===================== Разработанные проекты =====================
Плагин может проигрывать пользовательские плейлисты и плейлисты Яндекса, поиск по Яндекс Музыке, радио.
Сайт проекта: ymkodi.ru <https://ymkodi.ru/>
.
Исходный код: kodi.plugin.yandex-music <https://github.com/Angel777d/kodi.plugin.yandex-music>
.
Автор: @Angel777d <https://github.com/Angel777d>
_.
.. image:: https://raw.githubusercontent.com/Angel777d/kodi.plugin.yandex-music/master/assets/img/kody_yandex_music_plugin.png :target: https://ymkodi.ru/ :alt: Плагин для Kodi
Неофициальный бот. Умные и ваши плейлисты, понравившиеся треки. Лайки, дизлайки, текста песен, поиск, распознавание песен, похожие треки! Полноценный клиент на базе мессенджера.
Сайт проекта: music-yandex-bot.ru <https://music-yandex-bot.ru/>
.
Бот в Telegram: @music_yandex_bot <https://t.me/music_yandex_bot>
.
Автор: @MarshalX <https://github.com/MarshalX>
_.
Статья на habr.com с описанием реализации: Под капотом бота-клиента Яндекс.Музыки <https://habr.com/ru/post/487428/>
_.
.. image:: https://hsto.org/webt/uv/4s/a3/uv4sa3pslohuzlmuzrjzteju2dk.png :target: https://music-yandex-bot.ru/ :alt: Telegram бот-клиент
============= Благодарность =============
Спасибо разработчикам python-telegram-bot
. Выбрал Вас в качестве примера.
=============================== Внесение своего вклада в проект ===============================
Внесение своего вклада максимально приветствуется! Есть перечень пунктов,
который стоит соблюдать. Каждый пункт перечня расписан в CONTRIBUTING.md <https://github.com/MarshalX/yandex-music-api/blob/main/CONTRIBUTING.md>
_.
Вы можете помочь и сообщив о баге <https://github.com/MarshalX/yandex-music-api/issues/new?assignees=MarshalX&labels=bug&template=bug-report.md&title=>
или о новом поле пришедшем от API <https://github.com/MarshalX/yandex-music-api/issues/new?assignees=&labels=feature&template=found-unknown-fields.md&title=%D0%9D%D0%BE%D0%B2%D0%BE%D0%B5+%D0%BD%D0%B5%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D0%BE%D0%B5+%D0%BF%D0%BE%D0%BB%D0%B5+%D0%BE%D1%82+API>
.
======== Лицензия ========
Вы можете копировать, распространять и модифицировать программное обеспечение
при условии, что модификации описаны и лицензированы бесплатно в соответствии
с LGPL-3 <https://www.gnu.org/licenses/lgpl-3.0.html>
_. Произведения
производных (включая модификации или что-либо статически связанное с библиотекой)
могут распространяться только в соответствии с LGPL-3, но приложения, которые
используют библиотеку, необязательно.
Опишите ошибку Битая ссылка на странице https://github.com/MarshalX/yandex-music-api/tree/main/examples/radio_example
cURL
curl 'https://music.yandex.ru/handlers/ugc-upload.jsx?filename=musicfile.mp3&kind=1014&visibility=private&lang=ru&external-domain=music.yandex.ru&overembed=false&ncrnd=0.024180625568828384' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'Accept-Language: ru,ru-RU;q=0.9,en-US;q=0.8,en;q=0.7' \
-H 'Connection: keep-alive' \
-H $'Cookie: Session_id=yandex_coookie_grabbed_from_browser '
Данные запроса
filename
[str] - название загружаемого файлаkind
[int] - номер пользовательского альбомаvisibility
[str - 'private', 'public'] - видимость трека для других пользователей,lang
[str] - язык трека?external-domain
[str]- ???, при загрузке через браузер всегда принимает значение 'music.yandex.ru' overembed
[bool] - ???, всегда принимает значение falsencrnd
[float, int] - ???, скорее всего аналитическое значение, всегда отправляет float, при отправке int ошибки не вызываетОтвет
JSON
{
"poll-result": "https://music-stable-loader-vla-2.music.yandex.ru:8443/request-status/20230102T211219.566.utd.3fc1g2pqlv0pblicalwokrm96-music-stable-loader-vla-2.vla.yp-c.yandex.net.147453",
"post-target": "https://music-stable-loader-vla-2.music.yandex.ru:443/upload-target/20230102T211219.566.utd.3fc1g2pqlv0pblicalwokrm96-music-stable-loader-vla-2.vla.yp-c.yandex.net.147453",
"ugc-track-id": "9a9706da-ea99-4c4c-9afb-e50ae7e2bcaa"
}
Объекты ответа
* poll-result [str]- ?
* post-target [str] - эндпоинт загрузки трека
* ugc-track-id [str] - уникальный идентификатор загружаемого трека
cURL
curl -X POST 'POST-TARGET_URL_TAKEN_FROM_UGC_UPLOAD_RESPONSE' \
-H 'Accept: */*' \
-H 'Accept-Language: ru,ru-RU;q=0.9,en-US;q=0.8,en;q=0.7' \
-H 'Connection: keep-alive' \
-H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBtAcAImh7wW0KBtN' \
--data-raw $'------WebKitFormBoundaryBtAcAImh7wW0KBtN\r\nContent-Disposition: form-data; name="file"; filename="track_name.mp3"\r\nContent-Type: audio/mpeg\r\n\r\n\r\n------WebKitFormBoundaryBtAcAImh7wW0KBtN--\r\n' \
--compressed
Данные запроса
* file
[binary]
Ответ
JSON
{
"result": "CREATED"
}
```python3
def ugc_upload(self, filename: str, kind: Union[str, int], cookies: dict, lang: str = None, overembed: bool = None, ncrnd: Union[int, float] = None, external_domain: str = None, visibility: str = None ) -> str:
if not lang:
lang = 'ru'
if not overembed:
overembed = 'false'
if not ncrnd:
ncrnd = 0.5703991544386358
if not external_domain:
external_domain = 'music.yandex.ru'
if not visibility:
visibility = 'private'
url = f'https://music.yandex.ru/handlers/ugc-upload.jsx'
params = {'filename': filename, 'kind': kind, 'visibility': visibility,
'lang': lang, 'external-domain': external_domain, 'overembed': overembed, 'ncrnd': ncrnd}
result = self._request.get(url, params, cookies=cookies)
return result['post_target']
def upload_track(self, file: bytes, post_target: str, cookies: dict) -> bool: payload = {'file': file} result = self._request.post(url=post_target, files=payload, cookies=cookies, timeout=120) return True
ALBUM_ID = 1014 # ID пользовательского альбома file = open('path_to_file.mp3', 'rb') cookies = {'Session_id': 'yandex_session_cookie_grabbed_from_browser'} ugc = client.ugc_upload(filename=file.name, kind=ALBUM_ID, cookies=cookies) client.upload_track(file=file, post_target=ugc, cookies=cookies) ```
TypeError yandex_music.landing.mix_link in de_json
В ЯМ боте полетели недавно вот такие ошибки. Надо сделать поле cover_white
класса MixLink
опциональным
Пример содержимого data
:
js
{background_color: 'transparent', background_image_uri: 'avatars.yandex.net/get-music-misc/ID/mix.ID.background-image.ID/%%', text_color: '#ffffff', title: 'Зимняя', url: '/tag/winter', url_scheme: 'yandexmusic://tag/winter'}
Воспроизводить вызывая метод landing (/landing3 эндпоинт)
Классу Playlist добавлены новые поля: - custom_wave - новая модель, описание плейлиста - pager - пагинация
Классу TrackShort добавлено поле original_index. Классу Track добавлены новые поля.
Основное:
- [ ] Написать список изменений в CHANGES.md
- [ ] Добавить страницу про получение токена в документацию
- [ ] Добавить страницу с примерами в документацию. Добавить примеров (как минимум те, что есть в ридми и короткие из папки example. Сослаться на папку examples включил examples/README.md как отдельную страницу доки)
- [ ] Разнести README файл на маленькие подменю с отельными страницами в документации
- [ ] Проверить не сломало ли обратную совместимость удаление *args
из сигнатур в #550
Дополнительно: - [ ] Возможно взять в релиз #547 (подумать не сломает ли обратную совместимость) - [ ] Возможно убрать документацию к псевдонимам (выглядит мусорно в доке)
Новая структура доки задеплоина тут: https://yandex-music.readthedocs.io/en/dev/index.html
Переломные изменения
Python 3.6
.from_credentials
класса Client
).report_new_fields_callback
конструктора класса Client
.fetch_account_status
из конструктора класса Client
. Теперь необходимо вызывать метод init
для получения ID аккаунта который будет использоваться в последующих запросах. В противном случае, передача user_id
при вызове многих методов класса Client
становится обязательной.BadRequest
переименовано в BadRequestError
.Unauthorized
переименовано в UnauthorizedError
.InvalidBitrate
переименовано в InvalidBitrateError
.TimedOut
переименовано в TimedOutError
.result
класса Response
удалено. Вместо него добавлен метод get_result
.error
класса Response
удалено. Вместо него добавлен метод get_error
.id
, а не id_
; max
, а не max_
). Теперь нижнее подчеркивание добавляется только к зарезервированным словам (пример: from
будет from_
).Крупные изменения
ClientAsync
).NotFoundError
(наследник NetworkError
). Будет сгенерировано при получении статус кода 404.pipenv
.Sphinx
теперь используется sphinx-apidoc
.Незначительные изменения и/или исправления
search
класса Client
.Sphinx
.Переломные изменения
error
класса Artist
теперь называется reason
.users_playlists
класса Client
теперь возвращает один объект плейлиста, когда был передан один kind
. При
передаче списка в kind
вернётся список плейлистов (#318).labels
класса Album
теперь может содержать список из строк, а не только список объектов класса Label
.Крупные изменения
examples
.PlaylistRecommendations
.users_playlists_recommendations
).get_recommendations
классу Playlist
для получения рекомендаций.ChartInfo
, ChartInfoMenu
,
ChartInfoMenuItem
.chart
).TagResult
, Tag
.tags
).playlists_collective_join
).Context
, Queue
, QueueItem
.Client
: queues_list
, queue
,
queue_update_position
, queue_create
.track_id
и from_
в класс TrackId
.JSON
пригодного для отправки в запросе на Яндекс API.Client
:new_releases
– получение полного списка всех новых релизов.new_playlists
– получение полного списка всех новый плейлистов.podcasts
– получение подкаста с лендинга.download_cover_white
, download_cover_uri
в MixLink
.download_image
в Promotion
.artists_name
в Album
и Track
.fetch_track
, track_full_id
в TrackId
.fetch_tracks
в TracksList
.insert_track
, delete_tracks
, delete
в Playlist
.playlist_id
, fetch_playlist
в PlaylistId
.get_current_track
в Queue
.fetch_queue
в QueueItem
.next_page
, get_page
, prev_page
в Search
.decomposed
у Artist
(#10).__len__
для TracksList
(#380).__iter__
, __len__
и __getitem__
для классов представляющих список каких-либо объектов.fetch_tracks
классу Playlist
для получения треков плейлиста.get_url
классу Icon
для получения прямой ссылки на изображение.User
расширен для поддержки поля user_info
из Track
(поля full_name
, display_name
).#306
, #398
):LandingList
.RenewableRemainder
.Alert
.AlertButton
.StationData
.Brand
.Contest
.OpenGraphData
.NonAutoRenewable
.Operator
.Deactivation
.PoetryLoverMatch
.Deprecation
.#306
, #398
):plus
в Product
.non_auto_renewable_remainder
в Subscription
.og_image
в Artist
.meta_type
в Album
.advertisement
в Status
.best
в Track
.offer_id
и artist_ids
в Vinyl
.playlists
в BriefInfo
.is_custom
в Cover
.play_count
, recent
, chart
, track
в TrackShort
.url_part
, og_title
, image
, cover_without_text
,
background_color
, text_color
, id_for_from
,
similar_playlists
, last_owner_playlists
в Playlist
.bg_color
в Chart
.error
в Artist
.substituted
, matched_track
, can_publish
, state
,
desired_visibility
, filename
, user_info
, meta_data
в
Track
.copyright_name
, copyright_cline
в Cover
.direct
в DownloadInfo
.cheapest
, title
, family_sub
, fb_image
, fb_name
,
family
, intro_period_duration
, intro_price
,
start_period_duration
, start_price
, licence_text_parts
в
Product
.storage_dir
, duplicates
в Album
.subscribed
в ArtistEvent
.description
в GeneratedPlaylist
.genre
в Event
.show_in_regions
в Genre
.cover_uri
в MixLink
.og_description
, top_artist
в Playlist
.full_image_url
, mts_full_image_url
в Station
.coauthors
и recent_tracks
в Playlist
.regions
в User
.users
, podcasts
, podcast_episodes
, type_
, page
,
per_page
в Search
.short_description
, description
, is_premiere
, is_banner
в
Like
.master_info
в AutoRenewable
.station_data
и bar_below
в Status
.family_auto_renewable
в Subscription
.misspell_result
и misspell_original
в Search
.experiment
в класс Status
.operator
и non_auto_renewable
в Subscription
.text_color
, short_description
, description
, is_premiere
и is_banner
в Album
.hand_made_description
в Artist
.metrika_id
в Playlist
.og_image
в Tag
.url
в Lyrics
.number
, genre
в MetaData
.poetry_lover_matches
в Track
.contest
, dummy_description
, dummy_page_description
,
dummy_cover
, dummy_rollover_cover
, og_data
, branding
в
Playlist
.available_as_rbt
, lyrics_available
, remember_position
,
albums
, duration_ms
, explicit
, start_date
,
likes_count
, deprecation
в Album
.lyricist
, version
, composer
в MetaData
.last_releases
в BriefInfo
.ya_money_id
в Artist
(#351
, #370
).playlist_uuid
в Playlist
.sync_queue_enabled
в UserSettings
.background_video_uri
, short_description
,
is_suitable_for_children
в Track
(#376).meta_type
, likes_count
в Album
(#386).deprecation
в Album
.available_regions
в Album
.type
, ready
в Playlist
.description
в Supplement
.Незначительные изменения и/или исправления
MetaData
.advertisement
в Status
.text_language
в Lyrics
.provider_video_id
в VideoSupplement
.title
в VideoSupplement
(#403).instructions
в Deactivation
(#402).id
в Album
(#401).Переломные изменения
ArtistsLikes
.AlbumsLikes
.PlaylistsLikes
.Like
(поле type
для определения содержимого).status
на account
(#195).TimeoutError
(built-in).TimedOut
(yandex_music.exceptions
).requirements.txt
, requirements-dev.txt
, requirements-docs.txt
.Крупные изменения
type
для класса SearchResult
для определения типа результата поиска по объекту.UserSettings
.account_settings
).users_settings
).account_settings_set
).TracksSimilar
с полями трека и списка похожих треков.tracks_similar
).after_track
в класс Client
для получения контента для воспоризведения после трека (реклама, шот).Shot
ShotData
ShotEvent
ShotType
Незначительные изменения и/или исправления
Track
: version
, remember_position
(#238).InvalidBitrate
при попытке загрузить недопустимый трек по критериям (кодек, битрейт).Description
(с url
на uri
).version
в класс Album
(#178).picture
класса Vinyl
теперь опциональное.week
класса Ratings
теперь опциональное.product_id
класса AutoRenewable
теперь опциональное (#182).Переломные изменения
account
переименовано в me
и теперь содержит объект Status
, вместо Account
(#162)._
на конце). Имена с нижними подчёркиваниями есть как при сериализации так и при десериализации (#168).Крупные изменения
Незначительные изменения и/или исправления
fetch_account_status
для опциональности получения информации об аккаунте при инициализации клиента (#162).de_json
и de_list
(#174).ujson
при наличии, обновлены зависимости (#161).importlib_metadata
для поддержки старых версий (в новой версии pytest
его больше не используют, в угоду importlib.metadata
#pytest-5537) (#161).atomicwrites
, который используется pytest
теперь только на Windows
- #pytest-6148 (#161).timeout
аргумента в аргумент params в следующих методах: artists
, albums
, playlists_list
(#120).Переломные изменения
Artist
, Track
и Playlist
изменился перечень полей для генерации хеша.Крупные изменения
README
.Captcha
:CaptchaRequired
.CaptchaWrong
.CaptchaResponse
.README
:Search
(#83).ArtistAlbums
.artists_direct_albums
у Client
.get_albums
у Artist
.PlaylistAbsence
.Незначительные изменения и/или исправления
Переломные изменения
AlbumSearchResult
, ArtistSearchResult
, PlaylistSearchResult
, TrackSearchResult
, VideoSearchResult
были объединены в один - SearchResult
.Крупные изменения
Pager
) и списка треков артиста (ArtistsTracks
).Незначительные изменения и/или исправления
cover_uri
класса Album
теперь опциональное.region
у класса Account
теперь не обязательное..to_dict()
методе, связанный с десериализцией объектов списков и словарей..to_dict()
методе, связанный с не рекурсивной десериализацией.similar_artists
в BriefInfo
.artist
в классе ArtistEvent
.Track
.python yandex yandex-music api library yandexmusic yandex-api async asyncio asynchronous