// KefinTweaks Thumbnail Scrubber Configuration UI // Modular configuration modal for managing thumbnail scrubber settings (function() { 'use strict'; const LOG = (...args) => console.log('[KefinTweaks ThumbnailScrubber Config]', ...args); const ERR = (...args) => console.error('[KefinTweaks ThumbnailScrubber Config]', ...args); const MODAL_ID = 'kefin-thumbnailscrubber-config'; /** * Load configuration from window.KefinTweaksConfig */ async function loadConfig() { const config = window.KefinTweaksConfig || {}; return config.thumbnailScrubber || {}; } /** * Save configuration to JS Injector */ async function saveConfig(thumbnailScrubberConfig) { try { // Ensure window.KefinTweaksConfig exists if (!window.KefinTweaksConfig) { window.KefinTweaksConfig = {}; } // Update thumbnailScrubber config window.KefinTweaksConfig.thumbnailScrubber = thumbnailScrubberConfig; // Save to JS Injector using utils if (window.KefinTweaksUtils && window.KefinTweaksUtils.saveConfigToJavaScriptInjector) { await window.KefinTweaksUtils.saveConfigToJavaScriptInjector(); LOG('Configuration saved to JS Injector'); return true; } else { // Fallback: use findJavaScriptInjectorPlugin and saveConfigToJavaScriptInjector from configuration.js if (window.KefinTweaksConfiguration && window.KefinTweaksConfiguration.findJavaScriptInjectorPlugin) { const pluginId = await window.KefinTweaksConfiguration.findJavaScriptInjectorPlugin(); if (pluginId) { await window.KefinTweaksConfiguration.saveConfigToJavaScriptInjector(window.KefinTweaksConfig); LOG('Configuration saved to JS Injector (fallback)'); return true; } } ERR('saveConfigToJavaScriptInjector not available'); return false; } } catch (error) { ERR('Error saving config:', error); return false; } } /** * Build configuration HTML */ function buildConfigHTML(config) { const previewOnHover = config.PreviewOnHover === true; const useVideoStream = config.UseVideoStream !== false; let fallbackAfterMs = 500; if (Number.isFinite(config.FallbackAfterMs * 1) && config.FallbackAfterMs >= 0) { fallbackAfterMs = config.FallbackAfterMs * 1; } else if (Number.isFinite(config.FallbackAfterSeconds * 1) && config.FallbackAfterSeconds >= 0) { fallbackAfterMs = config.FallbackAfterSeconds * 1000; } const hoverDelay = Number.isFinite(config.HOVER_PREVIEW_TIMEOUT_MS * 1) ? config.HOVER_PREVIEW_TIMEOUT_MS * 1 : (Number.isFinite(config.HOVER_TIMEOUT * 1) ? config.HOVER_TIMEOUT * 1 : 800); const hoverSpeed = Number.isFinite(config.HOVER_PREVIEW_FRAME_MS * 1) ? config.HOVER_PREVIEW_FRAME_MS * 1 : 250; const scrubDelay = Number.isFinite(config.SCRUB_ACTIVATION_DELAY_MS * 1) ? config.SCRUB_ACTIVATION_DELAY_MS * 1 : 300; return `
/Videos/{id}/stream)
instead of cycling trickplay images as the card background.