Add media playback functionality to PLib video library manager. Integrate MediaPlayer.Controls and VideoLAN.LibVLC for enhanced video playback capabilities. Update MainWindow and ViewModels to manage video player state and commands, allowing users to play videos within the application. Enhance README.md to document new player features and requirements.

This commit is contained in:
Leonid Pershin
2026-08-08 14:46:40 +03:00
parent bf2c825244
commit 09d2a553a8
10 changed files with 379 additions and 9 deletions
+14 -2
View File
@@ -13,12 +13,16 @@
библиотеки с удалением, параметры превью и сканирования, тема, очистка кэша. Всё пишется
в `settings.json` и подхватывается без перезапуска.
- Светлая, тёмная и системная темы; выбор запоминается.
- Клик или Enter по карточке открыть в системном плеере, правая кнопка — контекстное меню.
- Встроенный плеер: клик по карточке открывает страницу медиа прямо в окне — видео,
перемотка, громкость, кнопка «назад». Внешний плеер и «показать в папке» остались
в контекстном меню карточки.
## Требования
- .NET 10 SDK
- `ffmpeg` и `ffprobe` в `PATH`
- `ffmpeg` и `ffprobe` в `PATH` (для превью и метаданных)
Нативный LibVLC приезжает пакетом и в системе не нужен.
## Запуск
@@ -74,6 +78,14 @@ dotnet test
только по «Сохранить», так что отмена не оставляет следов. Пересканирование запускается
только если изменилось то, что влияет на состав библиотеки, — смена темы или ширины кадра
его не вызывает.
- **Плеер — `GpuMediaPlayer` из `MediaPlayer.Controls`.** Он наследует `OpenGlControlBase`,
то есть рисует внутрь композиции Avalonia, а не в нативное дочернее окно: контролы можно
класть поверх видео, чего дал бы не всякий плеер. Транспорт (позиция, длительность,
play/pause) — свойства самого контрола, поэтому им управляет code-behind страницы;
дублировать это состояние во вьюмодель значило бы держать вторую копию и синхронизировать её.
Закрытие страницы обнуляет `OpenedVideo`, вью уходит из дерева — и декодер останавливается.
- **Нативный LibVLC подключён намеренно.** Без него бэкенд откатывается на Media Foundation,
который не открывает MKV, AVI и WebM — то есть половину того, что сканер кладёт в библиотеку.
- **Кэш превью самовосстанавливается.** Диск — ключ `sha256(путь|размер|mtime)`, память — LRU
на 256 декодированных битмапов. Сканирование проверяет, что запомненный кадр физически
на месте (`IThumbnailGenerator.IsAvailable`), и перерисовывает удалённые; после полного