Enhance video library management in PLib by introducing folder change tracking and improving video item metadata handling. Update IVideoRepository to include a method for loading video items with labels. Revise VideoPlayerViewModel to manage playback progress and integrate new UI elements for displaying watched status and resume options. Update MainWindowViewModel to observe folder changes for automatic rescanning. Enhance README.md to document these new features and usage instructions.
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
## Что уже работает
|
||||
|
||||
- Сканирование указанных папок, инкрементальное — файл, который не изменился, не переиндексируется.
|
||||
- Слежение за папками: новые файлы подхватываются сами, без кнопки.
|
||||
- Метаданные (длительность, разрешение, кодек) через ffprobe.
|
||||
- Постеры кадром из видео через ffmpeg, с кэшем на диске.
|
||||
- Виртуализированная сетка карточек, ленивая загрузка превью, поиск и сортировка.
|
||||
@@ -94,6 +95,16 @@ dotnet test
|
||||
экрана не доходили — чёрный экран и на GPU-, и на CPU-пути, при полностью рабочем в
|
||||
приложении `OpenGlControlBase`. Нативное окно VLC через `NativeControlHost`: картинка
|
||||
появилась, но окно поверх поверхности Avalonia не пропускает ни клик, ни оверлей.
|
||||
- **Теги и коллекции — одна сущность.** `LibraryLabel` с `LabelKind`: связь с видео у них
|
||||
одинаковая, различается только назначение. Одна сущность — одна таблица связей, один
|
||||
репозиторий и одно правило именования; разделить потом можно переименованием и миграцией,
|
||||
а держать два почти одинаковых агрегата синхронными пришлось бы всегда. Уникальность —
|
||||
по нормализованному имени в паре с видом, так что «Комедия» и «комедия» не разойдутся,
|
||||
а тег и коллекция с одним именем сосуществуют.
|
||||
- **Наблюдатель говорит только «посмотри снова».** `FileSystemWatcher` шлёт несколько
|
||||
событий на файл, а копирование — поток событий на всё время копирования. Восстанавливать
|
||||
из этого точную дельту — гадание, поэтому события гасятся тремя секундами тишины, а
|
||||
разницу и так умеет считать сканирование.
|
||||
- **Кэш превью самовосстанавливается.** Диск — ключ `sha256(путь|размер|mtime)`, память — LRU
|
||||
на 256 декодированных битмапов. Сканирование проверяет, что запомненный кадр физически
|
||||
на месте (`IThumbnailGenerator.IsAvailable`), и перерисовывает удалённые; после полного
|
||||
@@ -110,5 +121,11 @@ dotnet test
|
||||
перечитывается на лету;
|
||||
- `logs/` — Serilog, ротация по дням.
|
||||
|
||||
Схема создаётся через `EnsureCreated`. Когда форма таблицы устоится — заменить на
|
||||
миграции EF Core (`DatabaseInitializer` — единственное место, которое надо будет тронуть).
|
||||
Схема ведётся миграциями EF Core (`src/PLib.Infrastructure/Persistence/Migrations`) и
|
||||
применяется при старте. База, созданная сборками до появления миграций, распознаётся по
|
||||
отсутствию истории и пересоздаётся: она кэш над файловой системой, поэтому цена — одно
|
||||
пересканирование, а превью привязаны к файлам и переживают это нетронутыми.
|
||||
|
||||
```bash
|
||||
dotnet ef migrations add ИмяМиграции --project src/PLib.Infrastructure --startup-project src/PLib.Infrastructure --output-dir Persistence/Migrations
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user