From dfdaeacaa34c8f60a1bb8d4f647900ce6cab82fb Mon Sep 17 00:00:00 2001 From: HighImKevin Date: Sun, 18 Oct 2026 11:23:34 -0400 Subject: [PATCH] Ensure sections edited from the configuration popover on the home screen correctly sync to the native jellyfin homeSectionN prefs --- .../homeScreen-user-configuration.js | 80 +++++++++++++++++++ scripts/homeScreenSectionConfigure.js | 12 ++- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/configuration/homeScreen-user-configuration.js b/configuration/homeScreen-user-configuration.js index 3de343a..8dd9bdc 100644 --- a/configuration/homeScreen-user-configuration.js +++ b/configuration/homeScreen-user-configuration.js @@ -1628,6 +1628,85 @@ } } + /** + * Persist kefinTweaks.homeScreen and rewrite Jellyfin homesection0–9 to match + * (same outbound pairing as saveUserPreferences / getConfig). Single displayPrefs write. + * Used by the home section configure popover after order/enable changes. + * @param {Object} homeScreen + * @returns {Promise} + */ + async function saveKefinTweaksHomeScreenAndSyncNative(homeScreen) { + if (!window.userHelper?.getUserDisplayPreferences && !window.userHelper?.getUserDisplayPreferencesForUser) { + ERR('userHelper not available for homeScreen + native sync save'); + return false; + } + try { + const displayPrefs = await getEditorDisplayPreferences(); + if (!displayPrefs) { + ERR('Could not load display preferences for homeScreen + native sync'); + return false; + } + if (!displayPrefs.CustomPrefs) displayPrefs.CustomPrefs = {}; + + const sanitized = sanitizeHomeScreenSections(homeScreen).homeScreen; + const kefin = typeof window.userHelper?.parseKefinTweaks === 'function' + ? window.userHelper.parseKefinTweaks(displayPrefs) + : {}; + kefin.homeScreen = sanitized; + displayPrefs.CustomPrefs.kefinTweaks = JSON.stringify(kefin); + displayPrefs.CustomPrefs.kefinHomeScreen = JSON.stringify(homeScreenToLegacyArray(sanitized)); + + // Build effective sections for slot packing (no inbound native→Kefin enable pass) + let sections = []; + const sectionsApi = window.KefinHomeScreen?.getSections; + if (typeof sectionsApi === 'function') { + const sectionsResult = await Promise.resolve(sectionsApi()); + const { enabledHomeSections = [] } = sectionsResult || {}; + const serverSections = [...enabledHomeSections]; + const pinnedSections = buildPinnedSectionConfigs(sanitized); + const serverSectionsById = await buildServerSectionsById(); + serverSections.forEach((section) => { + if (section?.id && !serverSectionsById.has(section.id)) { + serverSectionsById.set(section.id, section); + } + }); + sections = deduplicateHomeScreenSections([...serverSections, ...pinnedSections]); + sections = applyUserSectionOverrides(sections, sanitized, { serverSectionsById }); + try { + sections = await resolveRecentlyAddedSectionsForUser(sections); + sections = applyUserSectionOverrides(sections, sanitized, { serverSectionsById }); + } catch (e) { + WARN('resolveRecentlyAddedSectionsForUser failed during native sync save:', e); + } + sections = sections.filter((section) => ( + section.enabled + || section.userConfigurable === true + || section.userConfigurable === undefined + )); + sections = deduplicateHomeScreenSections(sections); + } else { + WARN('KefinHomeScreen.getSections unavailable; saving homeScreen without native slot rebuild'); + } + + if (sections.length) { + syncNativeHomeSectionsFromKefin( + sections, + displayPrefs.CustomPrefs, + sanitized, + { syncUi: false } + ); + } + + const ok = await saveEditorDisplayPreferences(displayPrefs); + if (ok) LOG('kefinTweaks homeScreen saved (+ native homesectionN sync)'); + else ERR('Failed to save homeScreen + native sync'); + return ok; + } catch (e) { + ERR('Error saving homeScreen + syncing native homesectionN:', e); + return false; + } + } + /** * Persist items layout UI preference for a section (row|grid). * Home / seasonal / discovery → kefinTweaks.homeScreen; otherwise → kefinTweaks.sectionState. @@ -2739,6 +2818,7 @@ applyUserSectionOverrides, buildPinnedSectionConfigs, saveKefinTweaksHomeScreen, + saveKefinTweaksHomeScreenAndSyncNative, loadKefinTweaksHomeScreenFromDisplayPrefs, createEmptyHomeScreen, parsePinnedListString, diff --git a/scripts/homeScreenSectionConfigure.js b/scripts/homeScreenSectionConfigure.js index 1b132cf..0ee9005 100644 --- a/scripts/homeScreenSectionConfigure.js +++ b/scripts/homeScreenSectionConfigure.js @@ -180,6 +180,14 @@ return window.KefinUserHomeScreenConfig; } + /** Persist homeScreen and rewrite Jellyfin homesectionN when the syncing API is available. */ + async function saveHomeScreenPreferNativeSync(api, homeScreen) { + if (typeof api?.saveKefinTweaksHomeScreenAndSyncNative === 'function') { + return api.saveKefinTweaksHomeScreenAndSyncNative(homeScreen); + } + return api.saveKefinTweaksHomeScreen(homeScreen); + } + function getCachePresetOptions() { const presets = window.KefinHomeScreenAdvancedEditor?.getCachePresets?.() || buildFallbackCachePresets(); @@ -624,7 +632,7 @@ ); homeScreen = api.upsertSectionPref(homeScreen, prefStr); pendingHomeScreen = homeScreen; - await api.saveKefinTweaksHomeScreen(homeScreen); + await saveHomeScreenPreferNativeSync(api, homeScreen); pendingHomeScreen = null; applyPresentationToElement(entry); @@ -651,7 +659,7 @@ homeScreen = api.upsertSectionPref(homeScreen, prefStr); }); pendingHomeScreen = homeScreen; - await api.saveKefinTweaksHomeScreen(homeScreen); + await saveHomeScreenPreferNativeSync(api, homeScreen); pendingHomeScreen = null; } catch (e) { WARN('Failed to save section preferences:', e);