Неофициальная Python библиотека для работы с API сервиса Яндекс.Музыка

MarshalX, updated 🕥 2023-03-17 12:37:15

================ 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

Частично переписанная текущая библиотека на PHP: LuckyWins/yandex-music-api <https://github.com/LuckyWins/yandex-music-api>_.


JavaScript

API wrapper на Node.JS. Не обновлялся больше двух лет: itsmepetrov/yandex-music-api <https://github.com/itsmepetrov/yandex-music-api>. Продолжение разработки заброшенной библиотеки: kontsevoye/ym-api <https://github.com/kontsevoye/ym-api>.

===================== Разработанные проекты =====================


Плагин для Kodi

Плагин может проигрывать пользовательские плейлисты и плейлисты Яндекса, поиск по Яндекс Музыке, радио.

Сайт проекта: 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


Telegram бот-клиент

Неофициальный бот. Умные и ваши плейлисты, понравившиеся треки. Лайки, дизлайки, текста песен, поиск, распознавание песен, похожие треки! Полноценный клиент на базе мессенджера.

Сайт проекта: 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, но приложения, которые используют библиотеку, необязательно.

Issues

В документацию добавлена запись, о необходимости авторизации для метода tracks_lyrics

opened on 2023-03-17 12:36:08 by glebliutsko None

Битая ссылка на странице "Пример работы с радио"

opened on 2023-02-20 18:24:26 by acherkashin

Опишите ошибку Битая ссылка на странице https://github.com/MarshalX/yandex-music-api/tree/main/examples/radio_example

Screenshot 2023-02-20 at 22 21 46

image

Загрузка собственных треков

opened on 2023-01-02 19:18:52 by efinskiy

Загрузка собственных треков с аутентификацией через cookie

Запрос эндпоинта для загрузки трека


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] - ???, всегда принимает значение false
  • ncrnd [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) ```

__init__() missing 1 required positional argument: 'cover_white'

opened on 2022-12-02 23:54:20 by MarshalX

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 эндпоинт)

Issues/#509 Новые поля

opened on 2022-11-27 01:35:10 by andrew097

Классу Playlist добавлены новые поля: - custom_wave - новая модель, описание плейлиста - pager - пагинация

Классу TrackShort добавлено поле original_index. Классу Track добавлены новые поля.

2.1.0

opened on 2022-11-22 23:29:46 by MarshalX

Основное: - [ ] Написать список изменений в CHANGES.md - [ ] Добавить страницу про получение токена в документацию - [ ] Добавить страницу с примерами в документацию. Добавить примеров (как минимум те, что есть в ридми и короткие из папки example. Сослаться на папку examples включил examples/README.md как отдельную страницу доки) - [ ] Разнести README файл на маленькие подменю с отельными страницами в документации - [ ] Проверить не сломало ли обратную совместимость удаление *args из сигнатур в #550

Дополнительно: - [ ] Возможно взять в релиз #547 (подумать не сломает ли обратную совместимость) - [ ] Возможно убрать документацию к псевдонимам (выглядит мусорно в доке)

Новая структура доки задеплоина тут: https://yandex-music.readthedocs.io/en/dev/index.html

Releases

Поддержка asyncio и модели на dataclasses 2022-02-22 23:18:18

Переломные изменения

  • Убрана поддержка Python 3.6.
  • Удалено получение авторизационного токена по логину и паролю (метод from_credentials класса Client).
  • Удалена возможность задать свой обработчик на полученные неизвестные поля от API (аргумент 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.
  • В JSON представлении моделей к полям, чьё имя совпадает с именем стандартных функций, больше не добавляется нижнее подчеркивание в конец (пример: id, а не id_; max, а не max_). Теперь нижнее подчеркивание добавляется только к зарезервированным словам (пример: from будет from_).

Крупные изменения

  • Добавлена асинхронная версия клиента и всех методов-сокращений (класс ClientAsync).
  • Добавлено новое исключение NotFoundError (наследник NetworkError). Будет сгенерировано при получении статус кода 404.
  • Проект больше не использует pipenv.
  • Зависимости проекта больше не требуют конкретных версий.
  • Для генерации исходных файлов Sphinx теперь используется sphinx-apidoc.

Незначительные изменения и/или исправления

  • Исправлена обработка серверных ошибок которые вернулись в отличном от JSON формате.
  • Исправлена обработка серверных ошибок метода search класса Client.
  • Предупреждения о пришедших неизвестных полях от API отключены по умолчанию.
  • Используется английская локализация Sphinx.
  • Изменена тема документации.

Первый стабильный релиз библиотеки 2021-02-06 12:34:05

Переломные изменения

  • Поле error класса Artist теперь называется reason.
  • Метод users_playlists класса Client теперь возвращает один объект плейлиста, когда был передан один kind. При передаче списка в kind вернётся список плейлистов (#318).
  • Поле labels класса Album теперь может содержать список из строк, а не только список объектов класса Label.

Крупные изменения

  • Добавлены примеры в папку examples.
  • Добавлена поддержка рекомендаций для плейлистов (#324):
    • Добавлен класс PlaylistRecommendations.
    • Добавлен метод клиента для получения рекомендаций (users_playlists_recommendations).
    • Добавлен метод get_recommendations классу Playlist для получения рекомендаций.
  • Добавлено получение чартов (#294):
    • Добавлены новые классы: ChartInfo, ChartInfoMenu, ChartInfoMenuItem.
    • Добавлен метод клиента для получения чарта (chart).
  • Добавлена поддержка тегов/подборок (#192):
    • Добавлены новые классы: TagResult, Tag.
    • Добавлен новый метод клиента для получения тегов (tags).
  • Добавлено присоединение к коллективному плейлисту (#317):
    • Добавлен новый метод клиента для присоединения (playlists_collective_join).
  • Добавлена поддержка очередей прослушивания (#246):
    • Добавлены новые классы: Context, Queue, QueueItem.
    • Добавлены новые методы в Client: queues_list, queue, queue_update_position, queue_create.
    • Добавлены поля track_id и from_ в класс TrackId.
    • Добавлена возможность смены языка у клиента для ответов от API.
    • Добавлена десериализация любого объекта в 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).
  • Добавлены новые классы по отчётам с Telegram бота (#306, #398):
    • LandingList.
    • RenewableRemainder.
    • Alert.
    • AlertButton.
    • StationData.
    • Brand.
  • Contest.
    • OpenGraphData.
    • NonAutoRenewable.
    • Operator.
    • Deactivation.
    • PoetryLoverMatch.
    • Deprecation.
  • Добавлены новые поля классам по отчётам с Telegram бота (#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).
  • Исправлена десериализация подкастов, эпизодов подкастов и пользователей в лучшем результате поиска.
  • Исправлена десериализация альбомов. В зависимости от запроса содержимое лейблов может быть списком объектом или списком строк (в поиске).
  • Исправлен выбор настроек радио.
  • Исправлены ошибки в документации.
  • Протестирована работа на Python 3.9.

Закончено документирование всех классов и основных методов! 2020-03-25 07:19:12

Переломные изменения

  • Классы отметок "мне нравится" для альбомов, плейлистов и исполнителей обобщены. Теперь представлены одним классом.
    • Удаленные классы:
      • ArtistsLikes.
      • AlbumsLikes.
      • PlaylistsLikes.
    • Новый класс: Like (поле type для определения содержимого).
  • Изменено название пакета с status на account (#195).
  • Исправлено выбрасываемое исключение при таймауте:
    • Прошлое исключение: TimeoutError (built-in).
    • Новое исключение: TimedOut (yandex_music.exceptions).
  • Удалены следующие файлы: requirements.txt, requirements-dev.txt, requirements-docs.txt.

Крупные изменения

  • Добавлено обнаружение новых полей с просьбой сообщить о них (#216).
    • Добавлена проверка на неизвестные поля.
    • Добавлен вывод отладочной информации в виде warning'a.
    • Добавлен шаблон issue для отправки логов.
  • Добавлено поле type для класса SearchResult для определения типа результата поиска по объекту.
  • Добавлены настройки пользователя (#195):
    • Добавлен класс UserSettings.
    • Добавлен метод для получения своих настроек (account_settings).
    • Добавлен метод для получения настроек другого пользователя (users_settings).
    • Добавлен метод для изменения настроек (account_settings_set).
  • Добавлен возможность получить похожие треки (#197):
    • Добавлен класс TracksSimilar с полями трека и списка похожих треков.
    • Добавлен метод для получения похожих треков (tracks_similar).
  • Добавлены шоты от Алисы (#185):
    • Добавлен метод after_track в класс Client для получения контента для воспоризведения после трека (реклама, шот).
    • Добавлены методы для загрузки обложки и аудиоверсии шота.
    • Добавлены новые классы:
      • Shot
      • ShotData
      • ShotEvent
      • ShotType
  • Добавлен метод для изменения видимости плейлиста (#179).
  • Добавлена поддержка Яндекс.Радио (#20):
    • Исправлена отправка фидбека.
    • Написана инструкция по использованию (в доке к методу).
    • Добавлен аругмент для перехода по цепочке треков.
    • Добавлен метод для изменения настроек станции.

Незначительные изменения и/или исправления

  • Убрано дублирование информации в документации (#247).
  • Добавленые новые поля в класс Track: version, remember_position (#238).
  • Добавлено исключение InvalidBitrate при попытке загрузить недопустимый трек по критериям (кодек, битрейт).
  • Исправлено получение прямой ссылки на файл с кодеком AAC (#237, #25).
  • Исправлено получение плейлиста с Алисой в лендинге (#185).
  • Исправлено название поля с ссылкой на источник в классе Descriptionurl на uri).
  • Исправлена десериализация несуществующего исполнителя.
  • Добавлено поле version в класс Album (#178).
  • Поле picture класса Vinyl теперь опциональное.
  • Поле week класса Ratings теперь опциональное.
  • Поле product_id класса AutoRenewable теперь опциональное (#182).
  • Правки замечаний по codacy.

Тайп хинты! 2019-12-29 11:33:17

Переломные изменения

  • Поле account переименовано в me и теперь содержит объект Status, вместо Account (#162).
  • Убрано использование зарезервированных имён в аргументах конструкторов (теперь они с _ на конце). Имена с нижними подчёркиваниями есть как при сериализации так и при десериализации (#168).

Крупные изменения

  • Добавлены аннотации типов во всей библиотеке!

Незначительные изменения и/или исправления

  • Добавлен аргумент fetch_account_status для опциональности получения информации об аккаунте при инициализации клиента (#162).
  • Добавлены тесты c передачей пустого словаря в 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).
  • Исправлена иницилазиация клиента при помощи логина и пароля с использованием прокси (#159).
  • Исправлен баг в загрузке обложки альбома.

2019-12-01 15:04:09

Переломные изменения

  • У классов Artist, Track и Playlist изменился перечень полей для генерации хеша.

Крупные изменения

  • Добавлена возможность выполнять запросы через прокси-сервер для использовании библиотеки на зарубежных серверах (#139).
    • Добавлен пример использования в README.
  • Добавлена обработка капчи при авторизации с возможностью использования callback-функции для её обработки (#140):
    • Новые исключения:
      • Captcha:
        • CaptchaRequired.
        • CaptchaWrong.
    • Новые классы:
      • CaptchaResponse.
    • Новые примеры в README:
      • Пример обработки с использованием callback-функции.
      • Пример полностью своей обработки капчи.
  • Добавлена документация для класса Search (#83).
  • Добавлена возможность получения всех альбомов исполнителя (#141):
    • Новые классы:
      • ArtistAlbums.
    • Новые методы:
      • artists_direct_albums у Client.
      • get_albums у Artist.
  • Добавлена обработка несуществующего плейлиста (#147):
    • Новые классы:
      • PlaylistAbsence.

Незначительные изменения и/или исправления

  • Исправлен баг с загрузкой файлов (#149).
  • Исправлен баг некорректной десериализации плейлиста при отсутствии прав на него (#147).
  • Исправлен баг неправильной десериализации треков и артистов у собственных загруженных файлов (#154).

2019-11-10 01:22:22

Переломные изменения

  • Практически у всех классов был обновлён список полей участвующих при сравнении объектов.
  • Если в атрибутах для стравнения объектов присутствуют списки, то они будут преобразованы к frozenset.
  • Убрано конвертирование даты из строки в объект. Теперь все даты представляны строками в ISO формате.
  • Классы AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult были объединены в один - SearchResult.

Крупные изменения

  • Добавлен метод получения треков исполнителя.
  • Добавлены классы-обёртки над пагинацией (Pager) и списка треков артиста (ArtistsTracks).
  • Добавлено 554 unit-теста для всех классов-обёрток над объектами API.
  • Добавлен codecov и workflows для GitHub Actions.

Незначительные изменения и/или исправления

  • Поле 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