Files
blackBarRemover/JellyfinPlugin/Configuration/configPage.html
T
karol 526ee3d165
Build and Release Plugin / release (push) Successful in 45s
feat: add live subtitle offset configuration and real-time player hotkeys
2026-09-19 22:25:12 +02:00

98 lines
5.9 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Black Bar Remover</title>
</head>
<body>
<div data-role="page" class="page type-interior pluginConfigurationPage" data-require="emby-input,emby-button,emby-select,emby-checkbox">
<div data-role="content">
<div class="content-primary">
<form class="blackBarRemoverConfigForm">
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input type="checkbox" is="emby-checkbox" id="chkEnablePlugin" />
<span>Enable Black Bar Detection</span>
</label>
<div class="fieldDescription checkboxFieldDescription">Enables automatic scanning of new and updated video files in the library.</div>
</div>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="txtCropLimit">Black Bar Detection Tolerance (0.001 - 1.0):</label>
<input type="number" step="0.001" min="0.001" max="1.0" id="txtCropLimit" is="emby-input" required />
<div class="fieldDescription">Default is 0.094. Increase this value (e.g., to 0.15) if the plugin fails to detect black bars on heavily compressed WEB-DLs with noise. Decrease it if the plugin aggressively crops dark scenes.</div>
</div>
<div class="selectContainer">
<label class="selectLabel" for="selectPlaybackMode">Black Bar Removal Method:</label>
<select is="emby-select" id="selectPlaybackMode" class="emby-select-withcolor">
<option value="Auto">Auto (CSS clip in Web, Transcode on Native Apps / Transcoded streams)</option>
<option value="Server">Server Only (FFmpeg Transcoding)</option>
<option value="Client">Client Only (CSS Clip in Jellyfin Web)</option>
</select>
<div class="fieldDescription">Choose how the plugin should remove black bars. Auto mode uses lightweight CSS clipping for Web browser DirectPlay, and falls back to FFmpeg transcoding for native apps or unsupported video formats.</div>
</div>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="txtMaxParallelScans">Max Parallel Scans (1 - 16):</label>
<input type="number" step="1" min="1" max="16" id="txtMaxParallelScans" is="emby-input" required />
<div class="fieldDescription">Number of files to analyze concurrently during library scheduled tasks. Default is 4. Higher values speed up library scans on multi-core CPUs.</div>
</div>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="txtSubtitleOffsetVh">Client Subtitle Offset (0.0 - 25.0 vh):</label>
<input type="number" step="0.5" min="0.0" max="25.0" id="txtSubtitleOffsetVh" is="emby-input" required />
<div class="fieldDescription">Vertical offset shift for subtitles in Jellyfin Web player (in viewport height % / vh). Default is 5.0. Increase to move subtitles higher up into the video, or decrease if they appear too high.</div>
</div>
<div>
<button is="emby-button" type="submit" class="raised button-submit block emby-button">
<span>Save</span>
</button>
</div>
</form>
</div>
</div>
<script type="text/javascript">
var BlackBarRemoverConfig = {
pluginUniqueId: "12345678-1234-1234-1234-1234567890ab"
};
$('.pluginConfigurationPage').on('pageshow', function (event) {
var page = event.target;
Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(BlackBarRemoverConfig.pluginUniqueId).then(function (config) {
$('#chkEnablePlugin', page).prop('checked', config.IsEnabled !== false);
$('#txtCropLimit', page).val(config.CropDetectLimit || 0.094);
var mode = config.PlaybackMode || "Auto";
if (mode === "Both") mode = "Auto";
$('#selectPlaybackMode', page).val(mode);
$('#txtMaxParallelScans', page).val(config.MaxParallelScans || 4);
$('#txtSubtitleOffsetVh', page).val(config.SubtitleOffsetVh !== undefined ? config.SubtitleOffsetVh : 5.0);
Dashboard.hideLoadingMsg();
});
});
$('.blackBarRemoverConfigForm').on('submit', function (event) {
event.preventDefault();
var form = event.target;
Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(BlackBarRemoverConfig.pluginUniqueId).then(function (config) {
config.IsEnabled = $('#chkEnablePlugin', form).prop('checked');
config.CropDetectLimit = parseFloat($('#txtCropLimit', form).val());
config.PlaybackMode = $('#selectPlaybackMode', form).val();
config.MaxParallelScans = parseInt($('#txtMaxParallelScans', form).val(), 10) || 4;
config.SubtitleOffsetVh = parseFloat($('#txtSubtitleOffsetVh', form).val());
ApiClient.updatePluginConfiguration(BlackBarRemoverConfig.pluginUniqueId, config).then(function (result) {
Dashboard.processPluginConfigurationUpdateResult(result);
});
});
});
</script>
</div>
</body>
</html>