No description
  • Python 96.9%
  • HTML 2.6%
  • Dockerfile 0.5%
Find a file
Eduard Tantsev 2347632a08
Some checks failed
CI / test (push) Has been cancelled
Update quality mode labels to clarify API and fallback behavior
2026-08-31 13:12:51 +03:00
.github/workflows Add CI workflow and refine download quality settings 2026-08-31 07:33:10 +03:00
app Update quality mode labels to clarify API and fallback behavior 2026-08-31 13:12:51 +03:00
tests Update quality mode labels to clarify API and fallback behavior 2026-08-31 13:12:51 +03:00
.dockerignore Add Docker support with compose and healthcheck 2026-08-29 17:59:05 +03:00
.gitignore Add Docker support with compose and healthcheck 2026-08-29 17:59:05 +03:00
docker-compose.yml Add Docker support with compose and healthcheck 2026-08-29 17:59:05 +03:00
Dockerfile Add Docker support with compose and healthcheck 2026-08-29 17:59:05 +03:00
pyproject.toml Add CI workflow and refine download quality settings 2026-08-31 07:33:10 +03:00
README.md Update quality mode labels to clarify API and fallback behavior 2026-08-31 13:12:51 +03:00

Локальный загрузчик Яндекс Музыки

Небольшой локальный веб-интерфейс для поиска музыки, просмотра жанров, новинок и чарта и постановки доступных треков в очередь скачивания. Он слушает только 127.0.0.1 по умолчанию и не передаёт токен сторонним сервисам.

В строку поиска можно вставить полную ссылку на публичный плейлист вида https://music.yandex.ru/users/<login>/playlists/<kind> или https://music.yandex.ru/playlists/<UUID> (включая региональные домены music.yandex.com, .by, .kz, query/fragment и ссылку на трек внутри пользовательского плейлиста). UUID должен иметь строгий формат 8-4-4-4-12 шестнадцатеричных символов. Появится карточка плейлиста; кнопка «Скачать плейлист» добавит все его доступные треки в очередь.

Это неофициальное использование библиотеки yandex-music. Соблюдайте условия Яндекса, авторские права и правила вашей подписки. Пользователь сам отвечает за законность сохранения файлов.

Установка и запуск

Нужен Python 3.11+ (включая Python 3.14).

python -m venv .venv
. .venv/bin/activate             # Windows: .venv\Scripts\activate
pip install -e .
python -m app
# или: uvicorn app.main:app

Откройте http://127.0.0.1:8765. Без токена интерфейс и /api/health доступны, а запросы к музыкальному API вернут понятную ошибку 503.

Docker

Нужны Docker Engine с Docker Compose plugin. Для локального запуска создайте каталоги для постоянных данных и соберите контейнер:

mkdir -p downloads token
docker compose up -d --build

Compose запускает процесс от UID/GID текущего пользователя (по умолчанию 1000:1000), поэтому созданные каталоги остаются доступны ему без chown. Если Docker запускается из окружения, где UID/GID не заданы или отличаются от владельца каталогов, задайте их явно, например: UID=$(id -u) GID=$(id -g) docker compose up -d --build.

Откройте http://127.0.0.1:8765. Остановить приложение: docker compose down; смотреть журналы: docker compose logs -f. Скачанные файлы сохраняются в ./downloads, а токен — в ./token/token; значение токена не передаётся через переменные окружения.

Чтобы включить FLAC при первом запуске контейнера, используйте YMD_REQUIRE_FLAC=1 docker compose up -d (переключатель также можно изменить в интерфейсе). Порт намеренно привязан только к 127.0.0.1: не меняйте binding на 0.0.0.0 без отдельной защиты доступа, так как приложение рассчитано на локальное использование.

Access token

Вставьте личный access token в стартовую форму. Токен не выводится в логах и сохраняется локально с правами 0600; удалить его можно кнопкой «Выйти».

Получение токена зависит от текущей версии и возможностей Яндекс Музыки/yandex-music. Обычно используют уже выданный OAuth/access token своей учётной записи (например, полученный через официальные механизмы Яндекса). Не вводите пароль от Яндекса в это приложение. Некоторые версии библиотеки могут иметь device-auth вспомогательные методы, но это приложение не заявляет и не гарантирует такой поток: используйте только документированный для вашей версии библиотеки и аккаунта способ получения access token.

Настройки окружения

Переменная По умолчанию Значение
YMD_HOST 127.0.0.1 адрес bind (не меняйте на публичный без понимания рисков)
YMD_PORT 8765 порт
YMD_DOWNLOAD_DIR ~/Music/Yandex Music корень загрузок
YMD_TOKEN_FILE $XDG_CONFIG_HOME/yandex-music-downloader/token или ~/.config/yandex-music-downloader/token файл токена; при незаданной XDG_CONFIG_HOME используется ~/.config
YMD_REQUIRE_FLAC не задана при значении 1 задаёт начальное состояние переключателя FLAC

Пример: YMD_PORT=9000 YMD_DOWNLOAD_DIR=/mnt/music python -m app.

Загрузки и качество

Задачи выполняются в одной фоновой очереди, поэтому HTTP-запрос не ждёт файл. Путь формируется как Исполнитель/Альбом/NN - Название.ext; компоненты очищаются, а совпадающие имена получают суффикс. Кнопка «Очистить очередь» удаляет задачи и отменяет текущую загрузку между сетевыми чанками, не удаляя уже скачанные файлы. На практике часто доступен MP3 320 кбит/с; FLAC не гарантируется. Доступность, прямые ссылки и качество зависят от API, региона и подписки Яндекс Плюс.

Режимы качества

Выберите режим в списке «Качество» перед постановкой треков в очередь; настройка применяется сразу, без перезапуска сервера:

  • Лучшее доступное (API v1) — используется только API v1; скачивается лучший доступный вариант.
  • FLAC (API v2), иначе API v1 — сначала API v2 (/get-file-info) пытается скачать FLAC. Если FLAC отсутствует или любой этап V2-загрузки, обработки либо сохранения завершается ошибкой, выполняется fallback на API v1 с лучшим доступным вариантом.
  • Только FLAC (API v2) — используется только API v2 для FLAC. Если FLAC отсутствует или V2-загрузка, обработка либо сохранение завершается ошибкой, задача завершается ошибкой без fallback на API v1.

Поддерживаемый lossless-поток сохраняется в соответствующем формате: зашифрованный FLAC-в-MP4 расшифровывается AES-CTR и remux'ится в обычный .flac с метаданными и обложкой, а другие поддерживаемые lossless-контейнеры сохраняются с корректным расширением. FLAC не гарантируется: доступность, прямые ссылки и качество зависят от API, региона и подписки Яндекс Плюс.

YMD_REQUIRE_FLAC=1 задаёт начальный режим «FLAC (API v2), иначе API v1»; его можно изменить в интерфейсе в любой момент.

Проверка

pip install -e ".[dev]"
pytest
python -m compileall app