260 行
15 KiB
Markdown
260 行
15 KiB
Markdown
## Yandex Music API
|
||
|
||
> Делаю то, что по определённым причинам не сделала компания Yandex.
|
||
|
||
⚠️ Это неофициальная библиотека.
|
||
|
||
Сообщество разработчиков общаются и помогают друг другу в [Telegram чате](https://t.me/yandex_music_api), присоединяйтесь!
|
||
|
||
[![Поддерживаемые Python версии](https://img.shields.io/badge/python-3.7+-blue.svg)](https://pypi.org/project/yandex-music/)
|
||
[![Покрытие кода тестами](https://codecov.io/gh/MarshalX/yandex-music-api/branch/main/graph/badge.svg)](https://codecov.io/gh/MarshalX/yandex-music-api)
|
||
[![Качество кода](https://api.codacy.com/project/badge/Grade/27011a5a8d9f4b278d1bfe2fe8725fed)](https://app.codacy.com/gh/MarshalX/yandex-music-api)
|
||
[![Статус тестов](https://github.com/MarshalX/yandex-music-api/actions/workflows/test.yml/badge.svg)](https://github.com/MarshalX/yandex-music-api/actions/workflows/test.yml)
|
||
[![Статус документации](https://readthedocs.org/projects/yandex-music/badge/?version=latest)](https://yandex-music.readthedocs.io/en/latest/?badge=latest)
|
||
[![Лицензия LGPLv3](https://img.shields.io/badge/license-LGPLv3-lightgrey.svg)](https://www.gnu.org/licenses/lgpl-3.0.html)
|
||
|
||
### Содержание
|
||
- [Введение](#введение)
|
||
1. [Доступ к вашим данным Яндекс.Музыка](#доступ-к-вашим-данным-яндексмузыка)
|
||
- [Установка](#установка)
|
||
- [Начало работы](#начало-работы)
|
||
1. [Изучение по примерам](#изучение-по-примерам)
|
||
2. [Особенности использования асинхронного клиента](#особенности-использования-асинхронного-клиента)
|
||
3. [Логирование](#логирование)
|
||
4. [Документация](#документация)
|
||
- [Получение помощи](#получение-помощи)
|
||
- [Список изменений](#список-изменений)
|
||
- [Реализации на других языках](#реализации-на-других-языках)
|
||
- [Внесение своего вклада в проект](#внесение-своего-вклада-в-проект)
|
||
- [Спонсоры](#спонсоры)
|
||
- [Лицензия](#лицензия)
|
||
|
||
### Введение
|
||
|
||
Эта библиотека предоставляет Python интерфейс для никем незадокументированного и сделанного только для себя API Яндекс Музыки.
|
||
|
||
Она совместима с версиями Python 3.7+ и поддерживает работу как с синхронным, так и с асинхронным (asyncio) кодом.
|
||
|
||
В дополнение к реализации чистого API данная библиотека имеет ряд классов-обёрток — объектов высокого уровня, дабы сделать разработку клиентов и скриптов простой и понятной. Вся документация была написана с нуля исходя из логического анализа в ходе обратной разработки (reverse engineering) API.
|
||
|
||
#### Доступ к вашим данным Яндекс.Музыка
|
||
|
||
Задача по получению токена для доступа к данным лежит на плечах разработчиков, использующих данную библиотеку. О том как получить токен читайте в [документации](https://yandex-music.readthedocs.io/en/main/token.html).
|
||
|
||
### Установка
|
||
|
||
Вы можете установить или обновить Yandex Music API с помощью команды:
|
||
|
||
``` shell
|
||
pip install -U yandex-music
|
||
```
|
||
|
||
Или вы можете установить из исходного кода с помощью команды:
|
||
|
||
``` shell
|
||
git clone https://github.com/MarshalX/yandex-music-api
|
||
cd yandex-music-api
|
||
python setup.py install
|
||
```
|
||
|
||
### Начало работы
|
||
|
||
Приступив к работе, первым делом необходимо создать экземпляр клиента.
|
||
|
||
Инициализация синхронного клиента:
|
||
|
||
``` python
|
||
from yandex_music import Client
|
||
|
||
client = Client()
|
||
client.init()
|
||
|
||
# или
|
||
|
||
client = Client().init()
|
||
```
|
||
|
||
Инициализация асинхронного клиента:
|
||
|
||
``` python
|
||
from yandex_music import ClientAsync
|
||
|
||
client = ClientAsync()
|
||
await client.init()
|
||
|
||
# или
|
||
|
||
client = await Client().init()
|
||
```
|
||
|
||
Вызов `init()` необходим для получения информации — упрощения будущих запросов.
|
||
|
||
Работа без авторизации ограничена. Так, например, для загрузки будут доступны только первые 30 секунд аудиофайла. Для понимания всех ограничений зайдите на сайт Яндекс.Музыка в режиме инкогнито и воспользуйтесь сервисом.
|
||
|
||
Для доступа к личным данным следует авторизоваться. Это осуществляется через токен аккаунта Яндекс.Музыка.
|
||
|
||
Авторизация:
|
||
|
||
``` python
|
||
from yandex_music import Client
|
||
|
||
client = Client('token').init()
|
||
```
|
||
|
||
После успешного создания клиента вы вольны в выборе необходимого метода из API. Все они доступны у объекта класса `Client`. Подробнее в методах клиента в [документации](https://yandex-music.readthedocs.io/en/latest/yandex_music.client.html).
|
||
|
||
Пример получения первого трека из плейлиста "Мне нравится" и его загрузки:
|
||
|
||
``` 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:
|
||
|
||
``` 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**
|
||
|
||
Выполнение запросов с использованием прокси в синхронной версии:
|
||
|
||
``` python
|
||
from yandex_music.utils.request import Request
|
||
from yandex_music import Client
|
||
|
||
request = Request(proxy_url='socks5://user:password@host:port')
|
||
client = Client(request=request).init()
|
||
```
|
||
|
||
Примеры Proxy URL:
|
||
- socks5://user:<password@host>:port
|
||
- <http://host:port>
|
||
- <https://host:port>
|
||
- <http://user:password@host>
|
||
|
||
Больше примеров тут: [proxies - advanced usage - requests](https://2.python-requests.org/en/master/user/advanced/#proxies)
|
||
|
||
Выполнение запросов с использованием прокси в асинхронной версии:
|
||
|
||
``` python
|
||
from yandex_music.utils.request_async import Request
|
||
from yandex_music import ClientAsync
|
||
|
||
request = Request(proxy_url='http://user:pass@some.proxy.com')
|
||
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`.
|
||
|
||
Пояснение ко второму пункту:
|
||
|
||
``` 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`. Чтобы настроить логирование на стандартный вывод, поместите в начало вашего скрипта следующий код:
|
||
|
||
``` python
|
||
import logging
|
||
logging.basicConfig(
|
||
level=logging.DEBUG,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||
)
|
||
```
|
||
|
||
Вы также можете использовать логирование в вашем приложении, вызвав `logging.getLogger()` и установить уровень какой вы хотите:
|
||
|
||
``` python
|
||
logger = logging.getLogger()
|
||
logger.setLevel(logging.INFO)
|
||
```
|
||
|
||
Если вы хотите `DEBUG` логирование:
|
||
|
||
``` 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.md](https://github.com/MarshalX/yandex-music-api/blob/main/CHANGES.md).
|
||
|
||
### Реализации на других языках
|
||
|
||
- [OpenAPI спецификация](https://github.com/acherkashin/yandex-music-open-api/blob/main/src/yandex-music.yaml)
|
||
- [C#](https://github.com/K1llMan/Yandex.Music.Api)
|
||
- [PHP](https://github.com/LuckyWins/yandex-music-api)
|
||
- [TS](https://github.com/acherkashin/yandex-music-open-api)
|
||
- [JS](https://github.com/kontsevoye/ym-api)
|
||
|
||
### Внесение своего вклада в проект
|
||
|
||
Внесение своего вклада максимально приветствуется! Есть перечень пунктов, который стоит соблюдать. Каждый пункт перечня расписан в [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).
|
||
|
||
### Спонсоры
|
||
|
||
#### JetBrains
|
||
|
||
<img height="150" width="150" src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.png" alt="JetBrains Logo (Main) logo.">
|
||
|
||
> JetBrains предоставляет бесплатный набор инструментов для разработки активным контрибьюторам некоммерческих проектов с открытым исходным кодом.
|
||
|
||
[Лицензии для проектов с открытым исходным кодом — Программы поддержки](https://jb.gg/OpenSourceSupport)
|
||
|
||
### Лицензия
|
||
|
||
Вы можете копировать, распространять и модифицировать программное обеспечение при условии, что модификации описаны и лицензированы бесплатно в соответствии с [LGPL-3](https://www.gnu.org/licenses/lgpl-3.0.html). Произведения производных (включая модификации или что-либо статически связанное с библиотекой) могут распространяться только в соответствии с LGPL-3, но приложения, которые используют библиотеку, необязательно.
|