Giter VIP home page Giter VIP logo

marshalx / yandex-music-api Goto Github PK

View Code? Open in Web Editor NEW
866.0 27.0 79.0 1.52 MB

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

Home Page: https://yandex-music.rtfd.io

License: GNU Lesser General Public License v3.0

Python 99.97% Makefile 0.03%
python yandex yandex-music api library yandexmusic yandex-api async asyncio asynchronous

yandex-music-api's Introduction

Yandex Music API

Делаю то, что по определённым причинам не сделала компания Yandex.

⚠️ Это неофициальная библиотека.

Сообщество разработчиков общаются и помогают друг другу в Telegram чате, присоединяйтесь!

Поддерживаемые Python версии Покрытие кода тестами Качество кода Статус тестов Статус документации Лицензия LGPLv3

Содержание

Введение

Эта библиотека предоставляет 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:

Больше примеров тут: proxies - advanced usage - requests

Выполнение запросов с использованием прокси в асинхронной версии:

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

Изучение по примерам

Вот несколько примеров для обзора. Даже если это не ваш подход к обучению, пожалуйста, возьмите и бегло просмотрите их.

Код примеров опубликован в открытом доступе, поэтому вы можете взять его и начать писать вокруг него свой.

Посетите эту страницу, чтобы изучить официальные примеры.

Особенности использования асинхронного клиента

При работе с асинхронной версией библиотеке стоит всегда помнить следующие особенности:

  • Клиент следует импортировать с названием 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.

Получение помощи

Получить помощь можно несколькими путями:

Список изменений

Весь список изменений ведётся в файле CHANGES.md.

Реализации на других языках

Внесение своего вклада в проект

Внесение своего вклада максимально приветствуется! Есть перечень пунктов, который стоит соблюдать. Каждый пункт перечня расписан в CONTRIBUTING.md.

Вы можете помочь и сообщив о баге или о новом поле пришедшем от API.

Спонсоры

JetBrains

JetBrains Logo (Main) logo.

JetBrains предоставляет бесплатный набор инструментов для разработки активным контрибьюторам некоммерческих проектов с открытым исходным кодом.

Лицензии для проектов с открытым исходным кодом — Программы поддержки

Лицензия

Вы можете копировать, распространять и модифицировать программное обеспечение при условии, что модификации описаны и лицензированы бесплатно в соответствии с LGPL-3. Произведения производных (включая модификации или что-либо статически связанное с библиотекой) могут распространяться только в соответствии с LGPL-3, но приложения, которые используют библиотеку, необязательно.

yandex-music-api's People

Contributors

andrew097 avatar angel777d avatar catinapoke avatar conk3r353 avatar dsolmann avatar eugenweissbart avatar forentfraps avatar glebliutsko avatar json1c avatar lemonpaul avatar lk2322 avatar lulzlol231 avatar marshalx avatar nyashkin avatar ownageismagic avatar rirusha avatar sibiryoff avatar superdima05 avatar thepeshka avatar ungeheurenungeziefer avatar zhanymkanov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

yandex-music-api's Issues

Сокращения

Всякие .like() и .dislike(), .add_to_playlist() у треков, альмобов, плейлистов и т.д. и т.п.

Необходимо сформировать список таких шорткатов.

Папка с примерами пуста

Папка с примерами, содержит в себе только ReadMe и License. Может стоит туда что-нибудь добавить? Учитывая, что в основном ReadMe рекомендуется смотреть на эти самые примеры.

Отсутствие метода brief-info у artists

Только что был замечен метод, который вызывается при переходе на артиста, например, из поисковой выдачи или просто списка артисов приложения "Яндекс.Музыка" из Microsoft Store.

Пример URL'a запроса: https://api.music.yandex.net/artists/1613497/brief-info
Ответ внушительный (огромная простыня json'a): https://codepaste.ml/28832948/

Если есть желание помочь - оберните этот метод, напишите класс(ы) для result'a (большинство уже готово).

Поддержка Я.Радио

Возможно ли сделать интерфейс, для получения и обновления списка треков какого-либо радио? Или же получения трека, который надо играть в данный момент?

Изменён путь к прямым ссылкам на mp3

Добрый день. Спасибо за Ваш труд, Илья.

Не могли бы Вы помочь в исправлении получения прямой ссылки на mp3? Теперь в пути

f'https://{host}/get-{self.codec}/randomTrash/{ts}{path}'

randomTrash изменён на генерируемое значение, но как его получить не совсем понятно :(

По старой маске 400-ая ошибка.

[Проблема] Не создается экземпляр клиента.

2019-07-13 02:25:07,855 - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): oauth.yandex.ru:443
***/venv/lib/python3.7/site-packages/urllib3/connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
2019-07-13 02:25:08,351 - urllib3.connectionpool - DEBUG - https://oauth.yandex.ru:443 "POST /token HTTP/1.1" 200 125
2019-07-13 02:25:08,364 - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): api.music.yandex.net:443
***/venv/lib/python3.7/site-packages/urllib3/connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
2019-07-13 02:25:09,168 - urllib3.connectionpool - DEBUG - https://api.music.yandex.net:443 "GET /account/status HTTP/1.1" 200 None
Traceback (most recent call last):
  File "***/PycharmProjects/RadioListener_CLI/listener.py", line 42, in <module>
    muscle = Client(db["username"], db["password"])
  File "***/venv/lib/python3.7/site-packages/yandex_music/client.py", line 67, in __init__
    self.account = self.account_status().account
  File "***/PycharmProjects/RadioListener_CLI/venv/lib/python3.7/site-packages/yandex_music/client.py", line 159, in account_status
    return Status.de_json(result, self)
  File "***/PycharmProjects/RadioListener_CLI/venv/lib/python3.7/site-packages/yandex_music/status/status.py", line 94, in de_json
    data['account'] = Account.de_json(data.get('account'), client)
  File "***/PycharmProjects/RadioListener_CLI/venv/lib/python3.7/site-packages/yandex_music/status/account.py", line 104, in de_json
    return cls(client=client, **data)
TypeError: __init__() missing 1 required positional argument: 'birthday'

[Проблема] Не получается залогиниться по email:pasword

Вылезает следующая ошибка:

C:\ProgramData\Anaconda3\lib\site-packages\yandex_music\client.py in __init__(self, username, password, token, base_url, oauth_url, request)
     65             self.request.set_authorization(self.token)
     66 
---> 67         self.account = self.account_status().account
     68 
     69     @classmethod

C:\ProgramData\Anaconda3\lib\site-packages\yandex_music\client.py in account_status(self, timeout, *args, **kwargs)
    160         result = self._request.get(url, timeout=timeout, *args, **kwargs)
    161 
--> 162         return Status.de_json(result, self)
    163 
    164     def settings(self, timeout=None, *args, **kwargs):

C:\ProgramData\Anaconda3\lib\site-packages\yandex_music\status\status.py in de_json(cls, data, client)
     94         data['account'] = Account.de_json(data.get('account'), client)
     95         data['permissions'] = Permissions.de_json(data.get('permissions'), client)
---> 96         data['subscription'] = Subscription.de_json(data.get('subscription'), client)
     97         data['plus'] = Plus.de_json(data.get('plus'), client)
     98 

C:\ProgramData\Anaconda3\lib\site-packages\yandex_music\status\subscription.py in de_json(cls, data, client)
     58         data = super(Subscription, cls).de_json(data, client)
     59         from yandex_music import AutoRenewable
---> 60         data['auto_renewable'] = AutoRenewable.de_list(data.get('auto_renewable'), client)
     61 
     62         return cls(client=client, **data)

C:\ProgramData\Anaconda3\lib\site-packages\yandex_music\status\auto_renewable.py in de_list(cls, data, client)
     89         auto_renewables = list()
     90         for auto_renewable in data:
---> 91             auto_renewables.append(cls.de_json(auto_renewable, client))
     92 
     93         return auto_renewables

C:\ProgramData\Anaconda3\lib\site-packages\yandex_music\status\auto_renewable.py in de_json(cls, data, client)
     70         data['product'] = Product.de_json(data.get('product'), client)
     71 
---> 72         return cls(client=client, **data)
     73 
     74     @classmethod

TypeError: __init__() missing 1 required positional argument: 'order_id'

Декоратор у методов Client'a сломал доку

После добавление декоратора логирования sphinx теперь не знает о настоящих сигнатурах методов. В гугле предлагают руками указать валидные сигнатуы в .rst файле. Мне этот способ не подходит. У других видел что работает и так. Надо найти как это сделать.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.