Files
navidrome-music-sync/README.md
T
Antigravity e5afeb06cc feat: Phase 3 AI Radio (DJ Host & interleaved playlist) and Like/Dislike/Delete actions
- Add Like button: promotes wave track to permanent library and refills buffer
- Add Dislike button: blacklists track in SQLite disliked_tracks, removes audio, refills buffer
- Add Delete button in history table for library file removal
- Add AI Radio module: wttr.in weather, Qwen 2.5 host monologues, speech synthesis, ID3 tags
- Generate interleaved 'AI Радио.m3u8' alongside clean 'Моя Волна.m3u8'
- Update Web UI with Radio DJ card, voice selection, and track actions
2026-10-12 16:34:46 +03:00

94 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🎵 Navidrome Music Sync
Мультисервисный импортер и синхронизатор музыки для **Navidrome**.
Позволяет в один клик или по расписанию импортировать треки, альбомы и плейлисты из **Яндекс Музыки**, **Spotify**, **Apple Music** и **YouTube Music** напрямую в медиатеку Navidrome с сохранением оригинальных тегов, обложек в высоком разрешении и синхронизированных караоке-текстов (`.lrc`).
---
## 🚀 Возможности
- **Прямой импорт из Яндекс Музыки (320 kbps)**:
- Скачивание отдельных треков, альбомов и плейлистов.
- Полная синхронизация личного плейлиста **«Мне нравится»** (880+ треков).
- **Импорт из Spotify и Apple Music**:
- Без необходимости платных подписок и зарубежных аккаунтов.
- Извлечение точных метаданных через официальные открытые каталоги и аудио-матчинг с YouTube Music CDN (Opus 160 / MP3 320k).
- **Обход цензуры и региональных блокировок**:
- Если трек в каталоге РФ заблокирован или зацензурен («запикан»), движок автоматически переключается на глобальные источники и скачивает полноценную **Explicit (18+)** версию.
- **Мультисервисный поиск & Предпрослушивание**:
- Параллельный поиск по **Spotify** (приоритетный источник), **Яндекс Музыке**, **SoundCloud**, **YouTube** и **Apple Music**.
- **Приоритет Spotify**: треки и альбомы со Spotify получают бонус релевантности и всегда выводятся первыми в выдаче.
- Сквозное ранжирование по точности совпадения: лучшие совпадения сразу со всех платформ показываются вверху.
- Определение цензуры: бейджи `🔞 18+ Explicit` (без цензуры) и `⚠️ Clean` (зацензуренная версия).
- Встроенный аудиоплеер предпрослушивания с возможностью перемотки на лету (**HTTP Range 206**).
- Прямое скачивание в браузер или добавление в очередь сервера в 1 клик.
- **🔐 Защита & Авторизация через Navidrome**:
- Панель синхронизации защищена авторизацией. Для входа используются те же имя пользователя и пароль, что и в Navidrome.
- Сессионные токены HMAC (30 дней) для браузера и поддержка HTTP Basic Auth для API / автоматизации.
- **🌊 Моя Волна (Smart Wave V2 & V3)**:
- Автономный генератор персональных рекомендаций на основе профиля вкусов (звёздочки, скробблы, топ артистов из `navidrome.db`).
- **Контекстный LLM-реранкер**: локальная Ollama (`qwen2.5:1.5b` с `keep_alive: 0`, 0 МБ RAM в простое) анализирует расширенный пул кандидатов и отбирает треки под время суток (*утро / день / вечер / ночь*) или выбранное настроение (*Энергия*, *Чилл*, *Андеграунд*).
- **⭐ Лайк («В коллекцию»)**: моментальный перенос трека в постоянную медиатеку `/music/{Artist}/{Album}/{Title}.mp3` и мгновенное пополнение Волны свежим кандидатом.
- **👎 Дизлайк**: моментальное удаление файла и занесение исполнителя и трека в persistent черный список `disliked_tracks`, исключающий его из всех будущих рекомендаций навсегда.
- Скользящий буфер на 25 треков в `/music/AI Recommendations/Моя Волна/` (~180 МБ).
- **Авто-ротация**: если трек лайкнут в Navidrome — переносится в основную библиотеку навсегда; если лежит более 7 дней без лайка — автоматически удаляется.
- **Фоновое расписание**: автоматическая ротация и пополнение буфера каждые 6 часов.
- Автоматическая генерация умного плейлиста `Моя Волна.nsp` и `Моя Волна.m3u8` для всех Subsonic клиентов.
- **🎙️ AI Радио (AI DJ Host & AI Радио.m3u8)**:
- Персональный радиоэфир: виртуальный ведущий радиостанции приветствует слушателей по времени суток, объявляет погоду за окном в реальном времени (`wttr.in`) и делает короткие живые подводки к трекам.
- Нейросетевая генерация реплик диктора через `qwen2.5:1.5b` (`keep_alive: 0`).
- Нейросинтез речи с нулевой нагрузкой на GPU и сохранением MP3-реплик с ID3-тегами `AI Радио (DJ)`.
- Отдельный интерливинг-плейлист `AI Радио.m3u8` (реплики ведущего чередуются перед музыкальными треками каждые 2–3 песни), сохраняя `Моя Волна` полностью чистой от разговоров.
- Автоматическое уведомление Navidrome через Subsonic API (`startScan`) для мгновенного появления радиоэфира в клиентах.
- **Интеграция с Navidrome**:
- Организация каталога по стандарту: `/music/{Artist}/{Album}/{Track_Number} - {Title}.mp3`.
- Автоматическое скачивание построчных караоке-текстов (`.lrc`).
- Уведомление Navidrome через Subsonic API (`startScan`) сразу после завершения загрузки.
- **Веб-интерфейс & REST API**:
- Адаптивный темный Web UI с прогресс-баром задач, переключателем настроения Волны, карточкой AI Радио с выбором голоса ведущего, кнопками Лайк/Дизлайк и удалением треков.
- Фоновый асинхронный воркер без блокировки интерфейса.
- Дедупликация (не скачивает повторно треки, которые уже есть в библиотеке).
---
## 🛠️ Установка и запуск
### 1. Конфигурация (.env)
Скопируйте пример конфигурации и укажите токен Яндекс Музыки:
```bash
cp .env.example .env
```
### 2. Запуск через Docker Compose
```bash
docker compose up -d --build
```
Сервис доступен по адресу: `http://127.0.0.1:8005` (или `https://music.qpid.pro/sync/`).
---
## 🔌 API Эндпоинты
- `GET /` — Веб-интерфейс управления (требуется авторизация).
- `GET /login` / `POST /login` — Страница и эндпоинт авторизации (валидация через Navidrome).
- `GET /logout` / `POST /logout` — Завершение сессии.
- `GET /api/search?q={query}` — Сквозной поиск по всем платформам с ранжированием.
- `GET /api/stream?url={url}` — Аудио-стриминг для плеера с поддержкой Range-запросов и перемотки.
- `GET /api/direct-download?url={url}` — Прямая отдача файла в браузер.
- `POST /api/download` — Запуск задачи на скачивание по ссылке:
```json
{ "url": "https://music.yandex.ru/album/123/track/456" }
```
- `POST /api/sync/yandex-likes` — Запуск полной синхронизации понравившихся треков из Яндекс Музыки.
- `GET /api/wave/status` — Статус буфера «Моей Волны» и якорные артисты.
- `POST /api/wave/generate` — Генерация свежих рекомендаций и наполнение буфера Волны.
- `POST /api/wave/rotate` — Ротация буфера (перенос лайкнутых в библиотеку, очистка устаревших).
- `POST /api/wave/like` — Лайк трека в Волне (мгновенный перенос в постоянную библиотеку и докачка нового слота).
- `POST /api/wave/dislike` — Дизлайк трека в Волне (удаление, занесение в blacklist и докачка замены).
- `DELETE /api/track?file_path={path}` — Удаление любого трека с диска и из истории.
- `GET /api/radio/status` — Статус AI Радиовещания и количество реплик ведущего.
- `POST /api/radio/generate` — Генерация реплик ведущего и сборка плейлиста «AI Радио.m3u8».
- `GET /api/tasks` — Список активных задач и прогресс выполнения.
- `GET /api/history` — История и статистика загруженной музыки.