Skip to main content

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

  1. Откройте Spotify Developer Dashboard
  2. Создайте новое приложение (Create app)
  3. Скопируйте Client ID и Client Secret
  4. В Redirect URIs добавьте: http://127.0.0.1:8888/callback
  5. Сохраните изменения
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

📄 Лицензия

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spondex-0.1.0.post1.tar.gz (255.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

spondex-0.1.0.post1-py3-none-any.whl (112.5 kB view details)

Uploaded Python 3

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

Hashes for spondex-0.1.0.post1.tar.gz
Algorithm Hash digest
SHA256 3830f28aa43c330b43d075cae300ce79846b622e160db1ee2524a797785721f6
MD5 ba8851def060b03b9101652c8e294700
BLAKE2b-256 90238b5691e44e2a9dd2d821d9585567d67cacd2565e6454e0104266846b9a2a

See more details on using hashes here.

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

Hashes for spondex-0.1.0.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 62cb57c995e0181624b76804ba37829e3ffc8a462536fba441ae719810691dbb
MD5 3de4d12f78d0ad4249ed525e279677aa
BLAKE2b-256 b4ebc698fd2a3fa85b55b3d1e2c55b4a387e6927850183123fd0979fc441ee6f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page