Основные изменения: укрупнены use case-интерфейсы, контроллеры переведены на цельные зависимости, логика доступных фильмов перенесена в FilmLibraryService, добавлены проверки существования фильма и улучшена обработка ошибок API. Метрики: FilmService больше не зависит напрямую от Micrometer для counters, используется BusinessMetricsPort; добавлены TimedAspect и duration-метрики через @Timed для create/edit/delete фильмов. Jellyfin: event handling переведен на транзакционную модель, sync учитывает runtime-ошибки, добавлены plugin-token/web-url настройки, webhook и sync endpoints защищены X-MovieNight-Plugin-Token. Плагин: добавлен Jellyfin plugin в plugins/jellyfin, backend принимает push-sync payload, sync-state доступен плагину, pull-sync вынесен в /api/integrations/jellyfin/pull-sync, README описывает фактический контракт. API и DTO: добавлены RecommendationResponse, ContentTypeParser, validation annotations, обработка validation errors и ResponseStatusException, endpoint /api/users/me. БД: добавлена V7 cleanup-миграция для legacy ratings/jellyfin_id объектов; V4/V5 в этот коммит не включались. Проверка: .\gradlew.bat check --stacktrace проходит полностью.
75 lines
3.6 KiB
HTML
75 lines
3.6 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>MovieNight</title>
|
|
</head>
|
|
<body>
|
|
<div
|
|
id="MovieNightConfigPage"
|
|
data-role="page"
|
|
class="page type-interior pluginConfigurationPage"
|
|
data-controller="__plugin/MovieNight.js">
|
|
<div data-role="content">
|
|
<div class="content-primary">
|
|
<form id="MovieNightConfigForm">
|
|
<div class="inputContainer">
|
|
<label class="inputLabel inputLabelUnfocused" for="BackendBaseUrl">Backend URL</label>
|
|
<input is="emby-input" id="BackendBaseUrl" name="BackendBaseUrl" type="url" placeholder="http://localhost:8080" />
|
|
</div>
|
|
|
|
<div class="inputContainer">
|
|
<label class="inputLabel inputLabelUnfocused" for="ApiToken">Plugin token</label>
|
|
<input is="emby-input" id="ApiToken" name="ApiToken" type="password" autocomplete="new-password" />
|
|
</div>
|
|
|
|
<div class="inputContainer">
|
|
<label class="inputLabel inputLabelUnfocused" for="SyncIntervalMinutes">Sync interval minutes</label>
|
|
<input is="emby-input" id="SyncIntervalMinutes" name="SyncIntervalMinutes" type="number" min="1" max="1440" />
|
|
</div>
|
|
|
|
<div class="inputContainer">
|
|
<label class="inputLabel inputLabelUnfocused" for="StrmOutputPath">STRM output path</label>
|
|
<input is="emby-input" id="StrmOutputPath" name="StrmOutputPath" type="text" placeholder="/data/movies/movienight" />
|
|
<div class="fieldDescription">Directory where .strm files will be created for new films.</div>
|
|
</div>
|
|
|
|
<label class="checkboxContainer">
|
|
<input id="Enabled" name="Enabled" type="checkbox" is="emby-checkbox" />
|
|
<span>Enable MovieNight integration</span>
|
|
</label>
|
|
|
|
<label class="checkboxContainer">
|
|
<input id="EnablePeriodicSync" name="EnablePeriodicSync" type="checkbox" is="emby-checkbox" />
|
|
<span>Enable periodic backend sync</span>
|
|
</label>
|
|
|
|
<label class="checkboxContainer">
|
|
<input id="EnablePlaybackEvents" name="EnablePlaybackEvents" type="checkbox" is="emby-checkbox" />
|
|
<span>Send playback stop events</span>
|
|
</label>
|
|
|
|
<div>
|
|
<button is="emby-button" type="submit" class="raised button-submit block">
|
|
<span>Save</span>
|
|
</button>
|
|
</div>
|
|
|
|
<div>
|
|
<button is="emby-button" type="button" id="TestConnection" class="raised block">
|
|
<span>Test connection</span>
|
|
</button>
|
|
</div>
|
|
|
|
<div style="margin-top: 2em; padding: 1em; background: #333; border-radius: 4px;">
|
|
<h3>UI Integration</h3>
|
|
<p>To enable the "Recommend Film" button and Rating UI in the main Jellyfin interface, you must add the following script URL to your Jellyfin <strong>Custom JavaScript</strong> setting (Dashboard > General):</p>
|
|
<code id="UIScriptUrl" style="display: block; padding: 0.5em; background: #000; word-break: break-all;"></code>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|