CLI daemon for syncing music libraries between Yandex Music and Spotify
Project description
Spondex
CLI-демон для синхронизации музыкальных библиотек между Spotify и Яндекс Музыкой.
Spondex работает в фоне как демон и периодически синхронизирует любимые треки между платформами. Новые лайки с любой стороны автоматически переносятся на другую с учётом нечёткого сопоставления, транслитерации и проверки длительности.
Установка
# Клонировать и установить через uv
git clone <repo-url> && cd spondex
uv sync
Предварительная настройка
Перед первым запуском spondex start понадобятся учётные данные обоих сервисов. Мастер настройки запросит их интерактивно; ниже — как их получить заранее.
Токен Яндекс Музыки
OAuth-токен можно получить через браузер (DevTools) или по инструкции:
Полученный токен нужно будет ввести в wizard или позже задать командой:
spondex config set yandex.token <ваш_токен>
Настройка приложения Spotify
- Откройте Spotify Developer Dashboard.
- Создайте новое приложение (Create app).
- В настройках приложения скопируйте Client ID и Client Secret.
- В разделе Redirect URIs добавьте URI для OAuth:
http://127.0.0.1:8888/callback
- Сохраните изменения.
При первом запуске wizard настройки запросит Client ID и Client Secret, откроет браузер для авторизации в Spotify и сохранит refresh_token в ~/.spondex/config.toml.
При необходимости задать данные вручную:
spondex config set spotify.client_id <client_id>
spondex config set spotify.client_secret <client_secret>
spondex config set spotify.redirect_uri "http://127.0.0.1:8888/callback"
# refresh_token выдаётся после авторизации через браузер (wizard это делает автоматически)
Быстрый старт
# Первый запуск — запускает wizard настройки
spondex start
# Проверить статус
spondex status
# Запустить синхронизацию сразу
spondex sync --now
# Смотреть логи
spondex logs -f
# Открыть веб-дашборд
spondex dashboard
# Остановить демон
spondex stop
Команды
| Команда | Описание |
|---|---|
spondex start |
Запустить демон (при первом запуске — мастер настройки) |
spondex stop |
Остановить демон корректно |
spondex restart |
Остановить и снова запустить |
spondex status |
Состояние, аптайм, планировщик, счётчики треков |
spondex sync [--mode full] |
Запустить цикл синхронизации |
spondex logs [-n 50] [-f] |
Вывод логов демона |
spondex logs --sync |
JSON-лог синхронизации |
spondex dashboard |
Открыть веб-дашборд в браузере |
spondex config show |
Текущая конфигурация (секреты скрыты) |
spondex config set <key> <val> |
Задать значение (напр. sync.mode full) |
spondex db status |
Статистика БД и данные последней синхронизации |
Подробная документация по CLI со всеми опциями и примерами: docs/CLI.md.
Конфигурация
Конфигурация хранится в ~/.spondex/config.toml и создаётся мастером настройки при первом запуске spondex start.
# Просмотр
spondex config show
# Изменение
spondex config set sync.interval_minutes 15
spondex config set sync.mode full
spondex config set spotify.refresh_token <token>
spondex config set yandex.token <token>
Секции
- daemon —
dashboard_port,log_level - sync —
interval_minutes,mode(full/incremental),propagate_deletions - spotify —
client_id,client_secret,redirect_uri,refresh_token - yandex —
token
Архитектура
CLI (typer)
│
│ httpx (UDS)
▼
FastAPI RPC Server ──► DaemonState
│ ~/.spondex/daemon.sock │
│ ├── SyncEngine
│ ├── SyncScheduler
│ └── Database (SQLite)
│
Dashboard Server (Starlette + React SPA)
│ http://127.0.0.1:9847
CLI — тонкий клиент, отправляющий JSON-команды через Unix domain socket.
Daemon — даемонизация через double-fork с PID-файлом, обработкой сигналов и структурированным логированием (structlog → RotatingFileHandler).
RPC Server — FastAPI на UDS. Все команды идут через POST /rpc с телом {"cmd": "...", "params": {}}.
Sync Engine — двунаправленная синхронизация с трёхуровневым нечётким сопоставлением (нормализация, транслитерация, fuzzy с проверкой длительности). Режимы full и incremental.
Dashboard — React SPA на Starlette с обновлениями по WebSocket в реальном времени, графиками и управлением треками.
Разработка
# Установить dev-зависимости
uv sync --extra dev
# Запустить тесты
uv run pytest tests/ -v
# Тесты с покрытием
uv run pytest tests/ --cov=spondex --cov-report=term-missing
# Линтинг
uv run ruff check src/ tests/
# Форматирование
uv run ruff format src/ tests/
# Проверка типов
uv run mypy src/
Безопасность
- Файл конфигурации (
~/.spondex/config.toml) создаётся с правамиchmod 600 - Выводится предупреждение, если права на конфиг слишком открытые
- Демон выставляет
umask(0o077)— все runtime-файлы (сокет, логи) доступны только владельцу - API-токены хранятся как
SecretStrи не попадают в логи и вывод CLI
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spondex-0.1.0.tar.gz.
File metadata
- Download URL: spondex-0.1.0.tar.gz
- Upload date:
- Size: 255.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c859084105e7b3ec7d30cbb1864acaea7fad4fd5b33ca061ce651068bdae3e01
|
|
| MD5 |
1885a2a0e87c72e31afb15dfbc524d6d
|
|
| BLAKE2b-256 |
a963b2ddf768408c23ac92993bdfb284c7d4a23ad845f5f4cb7115046c597f6e
|
File details
Details for the file spondex-0.1.0-py3-none-any.whl.
File metadata
- Download URL: spondex-0.1.0-py3-none-any.whl
- Upload date:
- Size: 112.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a65429fe1c737010312a11efd18f55e0bf3623f81f8d6d4f2e2f5ae28ed9d818
|
|
| MD5 |
2edbd6946e940ada5217f69dcafbd638
|
|
| BLAKE2b-256 |
42dd5ff01550ca899c747fe951e40ae3034238631e1f21ee91cb639873a26452
|