🎵 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
📄 Лицензия
Metadata
Release files for spondex 0.1.0.post1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| spondex-0.1.0.post1.tar.gz | 255.6 kB | Without provenance | Details for spondex-0.1.0.post1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| spondex-0.1.0.post1-py3-none-any.whl | Python 3 | none | any | Details for spondex-0.1.0.post1-py3-none-any.whl |
Total release size: 368.1 kB
Release files / spondex-0.1.0.post1.tar.gz
| Download URL | spondex-0.1.0.post1.tar.gz |
|---|---|
| Size | 255.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3830f28aa43c330b43d075cae300ce79846b622e160db1ee2524a797785721f6
|
|
BLAKE2b-256 checksum How to use checksums |
90238b5691e44e2a9dd2d821d9585567d67cacd2565e6454e0104266846b9a2a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / spondex-0.1.0.post1-py3-none-any.whl
| Download URL | spondex-0.1.0.post1-py3-none-any.whl |
|---|---|
| Size | 112.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
62cb57c995e0181624b76804ba37829e3ffc8a462536fba441ae719810691dbb
|
|
BLAKE2b-256 checksum How to use checksums |
b4ebc698fd2a3fa85b55b3d1e2c55b4a387e6927850183123fd0979fc441ee6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Security for spondex 0.1.0.post1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.