Неофициальная Python библиотека для работы с API сервиса Яндекс.Музыка.
Project description
Yandex Music API
Делаю то, что по определённым причинам не сделала компания Yandex.
⚠️ Это неофициальная библиотека.
Сообщество разработчиков общаются и помогают друг другу в Telegram чате, присоединяйтесь!
Содержание
- Введение
- Установка
- Начало работы
- Получение помощи
- Список изменений
- Реализации на других языках
- Внесение своего вклада в проект
- Спонсоры
- Лицензия
Введение
Эта библиотека предоставляет Python интерфейс для никем незадокументированного и сделанного только для себя API Яндекс Музыки.
Она совместима с версиями Python 3.7+ и поддерживает работу как с синхронным, так и с асинхронным (asyncio) кодом.
В дополнение к реализации чистого API данная библиотека имеет ряд классов-обёрток — объектов высокого уровня, дабы сделать разработку клиентов и скриптов простой и понятной. Вся документация была написана с нуля исходя из логического анализа в ходе обратной разработки (reverse engineering) API.
Доступ к вашим данным Яндекс.Музыка
Задача по получению токена для доступа к данным лежит на плечах разработчиков, использующих данную библиотеку. О том как получить токен читайте в документации.
Установка
Вы можете установить или обновить Yandex Music API с помощью команды:
pip install -U yandex-music
Или вы можете установить из исходного кода с помощью команды:
git clone https://github.com/MarshalX/yandex-music-api
cd yandex-music-api
python setup.py install
Начало работы
Приступив к работе, первым делом необходимо создать экземпляр клиента.
Инициализация синхронного клиента:
from yandex_music import Client
client = Client()
client.init()
# или
client = Client().init()
Инициализация асинхронного клиента:
from yandex_music import ClientAsync
client = ClientAsync()
await client.init()
# или
client = await Client().init()
Вызов init()
необходим для получения информации — упрощения будущих запросов.
Работа без авторизации ограничена. Так, например, для загрузки будут доступны только первые 30 секунд аудиофайла. Для понимания всех ограничений зайдите на сайт Яндекс.Музыка в режиме инкогнито и воспользуйтесь сервисом.
Для доступа к личным данным следует авторизоваться. Это осуществляется через токен аккаунта Яндекс.Музыка.
Авторизация:
from yandex_music import Client
client = Client('token').init()
После успешного создания клиента вы вольны в выборе необходимого метода из API. Все они доступны у объекта класса Client
. Подробнее в методах клиента в документации.
Пример получения первого трека из плейлиста "Мне нравится" и его загрузки:
from yandex_music import Client
client = Client('token').init()
client.users_likes_tracks()[0].fetch_track().download('example.mp3')
В примере выше клиент получает список треков, которые были отмечены как понравившиеся. API возвращает объект TracksList, в котором содержится список с треками класса TrackShort. Данный класс содержит наиважнейшую информацию о треке и никаких подробностей, поэтому для получения полной версии трека со всей информацией необходимо обратиться к методу fetch_track()
. Затем можно скачать трек методом download()
.
Пример получения треков по ID:
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
Выполнение запросов с использованием прокси в синхронной версии:
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
Выполнение запросов с использованием прокси в асинхронной версии:
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
Изучение по примерам
Вот несколько примеров для обзора. Даже если это не ваш подход к обучению, пожалуйста, возьмите и бегло просмотрите их.
Код примеров опубликован в открытом доступе, поэтому вы можете взять его и начать писать вокруг него свой.
Посетите эту страницу, чтобы изучить официальные примеры.
Особенности использования асинхронного клиента
При работе с асинхронной версией библиотеке стоит всегда помнить следующие особенности:
- Клиент следует импортировать с названием
ClientAsync
, а не простоClient
. - При использовании методов-сокращений нужно выбирать метод с суффиксом
_async
.
Пояснение ко второму пункту:
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
. Чтобы настроить логирование на стандартный вывод, поместите в начало вашего скрипта следующий код:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
Вы также можете использовать логирование в вашем приложении, вызвав logging.getLogger()
и установить уровень какой вы хотите:
logger = logging.getLogger()
logger.setLevel(logging.INFO)
Если вы хотите DEBUG
логирование:
logger.setLevel(logging.DEBUG)
Документация
Документация yandex-music-api
расположена на readthedocs.io. Вашей отправной точкой должен быть класс Client
, а точнее его методы. Именно они выполняют все запросы на API и возвращают вам готовые объекты. Класс Client на readthedocs.io.
Получение помощи
Получить помощь можно несколькими путями:
- Задать вопрос в Telegram чате, где мы помогаем друг другу, присоединяйтесь!
- Сообщить о баге можно создав Bug Report.
- Предложить новую фичу или задать вопрос можно создав discussion.
- Найти ответ на вопрос в документации библиотеки.
Список изменений
Весь список изменений ведётся в файле CHANGES.md.
Реализации на других языках
Внесение своего вклада в проект
Внесение своего вклада максимально приветствуется! Есть перечень пунктов, который стоит соблюдать. Каждый пункт перечня расписан в CONTRIBUTING.md.
Вы можете помочь и сообщив о баге или о новом поле пришедшем от API.
Спонсоры
JetBrains
JetBrains предоставляет бесплатный набор инструментов для разработки активным контрибьюторам некоммерческих проектов с открытым исходным кодом.
Лицензии для проектов с открытым исходным кодом — Программы поддержки
Лицензия
Вы можете копировать, распространять и модифицировать программное обеспечение при условии, что модификации описаны и лицензированы бесплатно в соответствии с LGPL-3. Произведения производных (включая модификации или что-либо статически связанное с библиотекой) могут распространяться только в соответствии с LGPL-3, но приложения, которые используют библиотеку, необязательно.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file yandex-music-2.2.0.tar.gz
.
File metadata
- Download URL: yandex-music-2.2.0.tar.gz
- Upload date:
- Size: 168.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.7.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 46beaacf8206de212323264c89e0bd4f4e2e626483dfa58f95e78cacd1a102cf |
|
MD5 | eb138f3a2731f76f88bb86a69ece7957 |
|
BLAKE2b-256 | 42859f1d9e1327b558d74ee43e3d3f84b7b7e536c79a372cf83fcbf392ab2d3c |