Implement metadata management features in PLib video library manager. Introduce functionality to query and apply metadata from external sources based on video fingerprints. Update ILibraryService and LibraryService to support metadata lookup and application, enhancing video item descriptions and labels. Revise UI components in VideoPlayerView and SettingsView to facilitate user interaction with metadata sources. Update README.md to document new metadata features and usage instructions.
This commit is contained in:
@@ -17,6 +17,9 @@
|
||||
в `settings.json` и подхватывается без перезапуска.
|
||||
- Очистка собранных данных по видам — постеры, анимированные превью, отпечатки, технические
|
||||
метаданные — каждый со своей кнопкой и текущим объёмом.
|
||||
- Источники метаданных: список GraphQL-эндпойнтов (название, адрес, API-ключ) со схемой
|
||||
stash-box. Поиск по отпечатку запускается кнопкой на странице видео; найденное показывается
|
||||
списком, и применяется тем, что выбрали — название, описание, теги, актёры, студия.
|
||||
- Светлая, тёмная и системная темы; выбор запоминается.
|
||||
- Встроенный плеер: клик по карточке открывает страницу медиа прямо в окне — видео,
|
||||
перемотка, громкость, кнопка «назад». Полноэкранный режим по F11 или кнопке, выход —
|
||||
@@ -128,12 +131,29 @@ dotnet test
|
||||
системой непересекающихся множеств, чтобы цепочка «A похож на B, B на C» дала одну группу.
|
||||
**Побитовая совместимость со stash не проверена** — разные реализации ресайза способны
|
||||
перевернуть биты у коэффициентов рядом с медианой.
|
||||
- **Теги и коллекции — одна сущность.** `LibraryLabel` с `LabelKind`: связь с видео у них
|
||||
одинаковая, различается только назначение. Одна сущность — одна таблица связей, один
|
||||
репозиторий и одно правило именования; разделить потом можно переименованием и миграцией,
|
||||
а держать два почти одинаковых агрегата синхронными пришлось бы всегда. Уникальность —
|
||||
по нормализованному имени в паре с видом, так что «Комедия» и «комедия» не разойдутся,
|
||||
а тег и коллекция с одним именем сосуществуют.
|
||||
- **Теги, коллекции, актёры и студии — одна сущность.** `LibraryLabel` с `LabelKind`: связь
|
||||
с видео у них одинаковая, различается только назначение. Одна сущность — одна таблица
|
||||
связей, один репозиторий и одно правило именования; разделить потом можно переименованием
|
||||
и миграцией, а держать четыре почти одинаковых агрегата синхронными пришлось бы всегда.
|
||||
Появление актёров и студий это подтвердило: два новых значения перечисления, ноль новых
|
||||
таблиц. Уникальность — по нормализованному имени в паре с видом, так что «Комедия» и
|
||||
«комедия» не разойдутся, а тег и студия с одним именем сосуществуют.
|
||||
- **Метаданные — только по кнопке.** Никакой фоновой синхронизации: обращение к чужому
|
||||
серверу по поводу файлов пользователя происходит тогда, когда он нажал «Найти метаданные»,
|
||||
и больше никогда. Уходит один отпечаток — 16 шестнадцатеричных цифр; ни имён файлов, ни
|
||||
самих файлов.
|
||||
Источники опрашиваются по очереди и независимо: упавший попадает в список «не ответили»,
|
||||
но не прячет то, что нашли остальные. GraphQL отвечает двухсотым и массивом `errors`,
|
||||
поэтому он разбирается явно — иначе неверный ключ читался бы как «источник ничего не знает».
|
||||
Найденное не применяется само: отпечатки совпадают у перекодировок и трейлеров, а молча
|
||||
переписанное название откатывать куда дороже, чем нажать кнопку. Применение добавляет метки,
|
||||
но не удаляет чужие — то, что проставил пользователь, остаётся.
|
||||
Схема — stash-box (StashDB и родственники): именно поэтому список источников вообще имеет
|
||||
смысл, ведь это разные экземпляры одного сервера, отвечающие на один и тот же запрос.
|
||||
GraphQL-клиента в зависимостях нет: весь разговор — один POST с `{query, variables}` и один
|
||||
объект в ответе.
|
||||
**API-ключи лежат в `settings.json` открытым текстом** — там же и с той же защитой, что и
|
||||
остальные настройки, то есть правами файловой системы.
|
||||
- **Наблюдатель говорит только «посмотри снова».** `FileSystemWatcher` шлёт несколько
|
||||
событий на файл, а копирование — поток событий на всё время копирования. Восстанавливать
|
||||
из этого точную дельту — гадание, поэтому события гасятся тремя секундами тишины, а
|
||||
@@ -161,7 +181,8 @@ dotnet test
|
||||
- `library.db` — SQLite с метаданными, метками, прогрессом просмотра и pHash;
|
||||
- `thumbnails/` — кэш постеров (ключ = путь + размер + время изменения файла);
|
||||
- `previews/` — кэш анимированных превью, тот же ключ плюс число кадров в имени;
|
||||
- `settings.json` — папки, параметры превью и сканирования, тема, громкость;
|
||||
- `settings.json` — папки, параметры превью и сканирования, тема, громкость, источники
|
||||
метаданных вместе с их API-ключами;
|
||||
перечитывается на лету;
|
||||
- `logs/` — Serilog, ротация по дням.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user