No description
Find a file
maksimenko ad243c5741
All checks were successful
Build and publish Docker image / build-push-package (push) Has been skipped
Созданы релизноуты
2026-09-13 14:18:44 +03:00
.forgejo/workflows [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
[ReleaseNotes] Созданы релизноуты 2026-09-13 14:18:44 +03:00
Deployment [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
Docs [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
experiments/musicfm [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
src/MediaPlayerZ [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
tests [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.codevalidator-ignore.json [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.codevalidator.json [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.dockerignore [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.editorconfig [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.env.example [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.gitattributes [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
.gitignore [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
AGENTS.md [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
docker-compose.test.yml [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
docker-compose.yml [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
Dockerfile [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
dotnet-tools.json [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
global.json [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
MediaPlayerZ.sln [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00
README.md [BUILD] Initial commit: MediaPlayerZ с отдельным контейнером FFmpeg 2026-09-13 14:16:00 +03:00

MediaPlayerZ

Музыкальный веб-плеер на C# / .NET 10 и Blazor Web App с глобальным Interactive Server. Медиатека читается с диска, плейлисты хранятся в SQLite через Entity Framework. Аутентификации нет.

Быстрый запуск

Требуются .NET SDK 10.0, Git LFS и Docker Desktop для отдельного контейнера FFmpeg. global.json разрешает актуальные feature bands этой версии. Профиль разработки использует предоставленную медиатеку testAudio.

git lfs pull
$env:TEST_MEDIA_PATH = Join-Path $PWD 'testAudio'
$env:TEST_CACHE_PATH = Join-Path $PWD 'Cache'
New-Item -ItemType Directory -Force $env:TEST_CACHE_PATH | Out-Null
docker compose -f docker-compose.test.yml --profile test up -d ffmpeg-test
dotnet build .\MediaPlayerZ.sln
dotnet run --project .\src\MediaPlayerZ\MediaPlayerZ.csproj --launch-profile http

Приложение: http://localhost:5082/. Живость процесса: http://localhost:5082/health. Готовность медиатеки: http://localhost:5082/ready. Первый запуск показывает прогресс индексации; повторный использует сохранённые метаданные, превью и признаки MusicFM. Модель ONNX поставляется через Git LFS, занимает около 782 MB и работает на CPU. На первом проходе вычисление признаков может занять заметное время; прогресс показывает обработанные треки и фрагменты. Полный Python-стенд для запуска приложения не требуется.

Возможности

  • Плейлисты в SQLite, выбор вложенных папок и треков в ленивом дереве.
  • Альбомы FLAC и других поддерживаемых форматов с внешним CUE: отдельные дорожки, их названия, длительности, превью и рекомендации без физической нарезки оригинала.
  • Серверный поиск, группировка по папкам и виртуальная загрузка списка.
  • Прямое воспроизведение с Range, AAC/HLS для несовместимого аудио, перемотка, история Next/Previous и shuffle без повторов в текущем проходе.
  • Отдельный случайный проход всей медиатеки, включая музыку вне плейлистов.
  • Полный список медиатеки, закреплённое избранное и отметки сердцем.
  • Подбор похожих треков по фрагментам MusicFM и «Подбери мне...» по общей карте избранного с усилением часто встречающихся направлений.
  • Тексты LRCLIB в SQLite: правая выезжающая панель, сохранённые LRC-тайминги, подсветка текущих строк и прокрутка вслед за воспроизведением.
  • Редактирование плейлистов, контекстные меню и сохранение порядка перетаскиванием.
  • Нижняя панель с обложкой и живым спектром, верхней шкалой перемотки и всплывающей громкостью.
  • Повтор полного плейлиста, включая shuffle, и прокручиваемый редактор выбора музыки.
  • Обложки, анимированные WebP-превью и живая волна Web Audio/Canvas из viewer.
  • Независимые очереди вкладок, отменяемый FFmpeg, повторное использование кэша.
  • Централизованная локализация EN/RU по языку браузера, английский fallback.
  • Утверждённая тёмная палитра и локальный шрифт Material Icons.
  • Dockerfile для .NET 10, Compose и Forgejo pipeline публикации образа.
  • Правила разработки и проверки в AGENTS.md.

Продовый docker-compose.yml содержит отдельные пути музыки на HDD (D:\Jellyfin Media\Music) и кэша/БД на M.2 (C:\MediaPlayerZ\Cache, C:\MediaPlayerZ\Db). Compose запускает два контейнера: приложение на .NET и отдельный ffmpeg-universal. Приложение выполняет команды во втором контейнере через локальный Docker socket. Музыка подключается к обоим только для чтения, кэш общий, БД доступна только приложению. Доступ к Docker socket даёт приложению права управления Docker хоста; подробности настройки — в Docs/Run.md. Отдельный docker-compose.test.yml запускает профиль test с тестовой музыкой и изолированными записываемыми каталогами.

Альбомы с CUE автоматически разворачиваются при индексации. Подробности формата, обновления существующей коллекции и воспроизведения — в Docs/Cue.md.

Тексты песен

Оба compose-файла поддерживают отдельный SOCKS5-прокси для LRCLIB: LRCLIB_PROXY_ADDRESS, LRCLIB_PROXY_PORT, LRCLIB_PROXY_USERNAME, LRCLIB_PROXY_PASSWORD. Значения задаются в .env по образцу .env.example. Пустой адрес означает прямой запрос; при заданном адресе обхода прокси нет. Настройка и пример — в Docs/Run.md.

При индексации новые треки и записи без текста проверяются в LRCLIB. Название берётся из музыкальных тегов; имя файла используется только при их отсутствии. Запросы идут последовательно, с паузой не менее секунды. Для загрузки нужен доступ к https://lrclib.net/; ключ API не требуется. Найденные тексты сохраняются в БД, отказ внешнего сервиса не мешает воспроизведению, а пропуски проверяются при следующей индексации.

Кнопка текста находится слева от подбора похожих треков и доступна только при наличии слов. В шапке панели — название и группа, закрытие — крестиком, Escape или повторным нажатием кнопки. Текст без таймингов отображается без подсветки; LRC следует за воспроизведением и перемоткой. После ручной прокрутки автоматическое следование приостанавливается на 5 секунд.

Качество воспроизведения

Совместимый с браузером файл воспроизводится напрямую, с исходными характеристиками. При конвертации используется AAC-LC, стерео, HLS с сегментами MPEG-TS примерно по 2 секунды. Битрейт и частота берутся из исходной аудиодорожки и ограничиваются возможностями AAC и браузера. Например, 128 kbit/s / 44,1 kHz сохраняются при поддержке этого режима. Частота снижается только при необходимости совместимости. Нормализация громкости для воспроизведения не применяется. Mono 24 kHz, нормализация и окна до 30 секунд с перекрытием 2 секунды относятся к подготовке признаков MusicFM.

Документация

Репозиторий: ssh://git@git.zaharatot.ru:222/Zaharatot/MediaPlayerZ.git. Основная ветка: main.