CLI daemon for syncing music libraries between Yandex Music and Spotify
Project description
🎵 Spondex
Двусторонняя синхронизация музыкальных библиотек между Spotify и Яндекс Музыкой
Установка • Быстрый старт • Команды • Настройка • Архитектура • Разработка
⚡ Важно: Проект полностью переработан с нуля. Старая версия приложения доступна в архиве: alesha-pro/spondex-archive
Spondex работает в фоне как daemon и периодически синхронизирует лайки между платформами. Новые треки с любой стороны автоматически переносятся на другую — с учётом нечёткого сопоставления, транслитерации и проверки длительности.
💡 Лайкнул трек в Spotify — он появится в Яндекс Музыке. И наоборот.
📋 Требования
- Python 3.12+
- uv — менеджер пакетов и окружений
- macOS / Linux — нативная поддержка
- Windows — только через WSL (не протестировано)
Установка uv
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# или через Homebrew
brew install uv
📦 Установка
# Глобальная установка — одна команда
uv tool install spondex
# Или из исходников
git clone https://github.com/alesha-pro/spondex.git && cd spondex
uv sync
🚀 Быстрый старт
spondex start # Первый запуск → мастер настройки
spondex status # Проверить статус
spondex sync # Запустить синхронизацию
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 |
Статистика БД и данные последней синхронизации |
Подробная документация: docs/CLI.md
⚙️ Настройка
Предварительные требования
Перед первым запуском понадобятся учётные данные обоих сервисов. Мастер настройки запросит их интерактивно.
🟡 Токен Яндекс Музыки
OAuth-токен можно получить через браузер (DevTools) или по инструкции:
spondex config set yandex.token <ваш_токен>
🟢 Настройка приложения Spotify
- Откройте Spotify Developer Dashboard
- Создайте новое приложение (Create app)
- Скопируйте Client ID и Client Secret
- В Redirect URIs добавьте:
http://127.0.0.1:8888/callback - Сохраните изменения
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"
При первом запуске wizard откроет браузер для авторизации и сохранит refresh_token автоматически.
Конфигурация
Хранится в ~/.spondex/config.toml, создаётся автоматически при первом spondex start.
spondex config show # просмотр
spondex config set sync.interval_minutes 15 # изменение
| Секция | Параметры |
|---|---|
| daemon | dashboard_port, log_level |
| sync | interval_minutes, mode (full/incremental), propagate_deletions |
| spotify | client_id, client_secret, redirect_uri, refresh_token |
| yandex | token |
🏗 Архитектура
┌─────────────────────────────────────────┐
│ Daemon Process │
│ │
CLI (typer) ──UDS──►│ FastAPI RPC ──► SyncEngine │
│ /rpc ├ SpotifyClient │
│ ├ YandexClient │
│ └ Database (SQLite) │
│ │
│ Dashboard (React SPA) │
│ :9847 ──► WebSocket (real-time) │
└─────────────────────────────────────────┘
| Компонент | Роль |
|---|---|
| CLI | Тонкий клиент — JSON-команды через Unix Domain Socket |
| Daemon | Double-fork daemonization, PID-файл, signal handling, structlog |
| RPC Server | FastAPI на UDS, POST /rpc {"cmd": "...", "params": {}} |
| Sync Engine | Двунаправленная синхронизация с 3-уровневым fuzzy matching |
| Dashboard | React SPA, WebSocket-обновления, графики, управление треками |
🎯 Алгоритм сопоставления треков
Tier 1 → Нормализация (lowercase, strip feat/remix, убрать акценты)
Tier 2 → Транслитерация (кириллица ↔ латиница)
Tier 3 → Fuzzy matching (Levenshtein) + проверка длительности (±5 сек)
🛠 Разработка
uv sync --extra dev # dev-зависимости
uv run pytest tests/ -v # тесты
uv run pytest tests/ --cov=spondex # покрытие
uv run ruff check src/ tests/ # линтинг
uv run ruff format src/ tests/ # форматирование
uv run mypy src/ # проверка типов
Сборка пакета
bash scripts/build.sh # фронтенд → wheel
🔒 Безопасность
- Конфиг
~/.spondex/config.tomlсоздаётся с правами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.post1.tar.gz.
File metadata
- Download URL: spondex-0.1.0.post1.tar.gz
- Upload date:
- Size: 255.6 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 |
3830f28aa43c330b43d075cae300ce79846b622e160db1ee2524a797785721f6
|
|
| MD5 |
ba8851def060b03b9101652c8e294700
|
|
| BLAKE2b-256 |
90238b5691e44e2a9dd2d821d9585567d67cacd2565e6454e0104266846b9a2a
|
File details
Details for the file spondex-0.1.0.post1-py3-none-any.whl.
File metadata
- Download URL: spondex-0.1.0.post1-py3-none-any.whl
- Upload date:
- Size: 112.5 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 |
62cb57c995e0181624b76804ba37829e3ffc8a462536fba441ae719810691dbb
|
|
| MD5 |
3de4d12f78d0ad4249ed525e279677aa
|
|
| BLAKE2b-256 |
b4ebc698fd2a3fa85b55b3d1e2c55b4a387e6927850183123fd0979fc441ee6f
|