Files
KefinTweaks/scripts/homeScreenConfig2.js
T

2822 lines
71 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// KefinTweaks Home Screen Configuration 2
// Streamlined configuration with queries array format
// Defines default sections, discovery templates, and cache settings
(function () {
"use strict";
// Default Cache Configuration (times in milliseconds)
const CACHE_CONFIG = {
DEFAULT_TTL: 60 * 60 * 1000, // 1 hour
VERY_SHORT_TTL: 1 * 60 * 1000, // 1 minute
SHORT_TTL: 5 * 60 * 1000, // 5 minutes
LONG_TTL: 24 * 60 * 60 * 1000, // 24 hours
STATIC_TTL: 7 * 24 * 60 * 60 * 1000, // 1 week
DISCOVERY_TTL: 6 * 60 * 60 * 1000, // 6 hours
FORCE_REFRESH_TTL: 0, // 0
};
// Standard Home Sections (non-seasonal)
// New streamlined format with queries array, organized into groups
const KEFINTWEAKS_HOME_SECTION_GROUPS = [
// My Media Sections
{
id: "home-my-media",
name: "My Media",
sections: [
{
id: "my-media",
name: "My Media",
jellyfinId: "smalllibrarytiles",
enabled: false,
order: 5,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.LONG_TTL,
userConfigurable: true,
queries: [
{
path: "/UserViews",
queryOptions: {
Limit: 0,
Recursive: false,
SortBy: "Default",
},
},
],
},
{
id: "my-media-small",
name: "My Media (Small)",
jellyfinId: "librarybuttons",
enabled: false,
order: 6,
cardFormat: "Button",
ttl: CACHE_CONFIG.LONG_TTL,
userConfigurable: true,
queries: [
{
path: "/UserViews",
queryOptions: {
Limit: 0,
Recursive: false,
SortBy: "Default",
},
},
],
},
],
},
// Continue Watching Group
{
id: "home-continue-watching",
name: "Continue Watching",
sections: [
{
id: "continueWatching",
name: "Continue Watching",
jellyfinId: "resume",
enabled: false,
order: 10,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
userConfigurable: true,
queries: [
{
path: "/UserItems/Resume",
queryOptions: {
MediaTypes: "Video",
Fields: "PrimaryImageAspectRatio",
Limit: 12,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
],
},
{
id: "nextUp",
name: "Next Up",
jellyfinId: "nextup",
enabled: false,
order: 11,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
userConfigurable: true,
queries: [
{
path: "/Shows/NextUp",
queryOptions: {
Fields: "PrimaryImageAspectRatio,DateCreated,Path,MediaSourceCount",
Limit: 24,
EnableResumable: "false",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
],
},
{
id: "continueWatchingAndNextUp",
name: "Continue Watching and Next Up",
jellyfinId: "resume",
enabled: false,
order: 10,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
sortBy: "DatePlayed", // Used to sort merged results from both queries
sortOrder: "Descending", // Most recent first
userConfigurable: true,
queries: [
{
path: "/UserItems/Resume",
queryOptions: {
MediaTypes: "Video",
IncludeItemTypes: ["Movie"],
Fields: "PrimaryImageAspectRatio",
Limit: 12,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
{
path: "/Shows/NextUp",
queryOptions: {
Fields: "PrimaryImageAspectRatio,DateCreated,Path,MediaSourceCount",
Limit: 24,
EnableResumable: "true",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
],
},
{
id: "continueListening",
name: "Continue Listening",
jellyfinId: "resumeaudio",
enabled: false,
order: 10,
cardFormat: "Square",
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
userConfigurable: true,
queries: [
{
path: "/UserItems/Resume",
queryOptions: {
MediaTypes: "Audio",
Fields: "PrimaryImageAspectRatio",
Limit: 12,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
],
},
{
id: "continueReading",
name: "Continue Reading",
jellyfinId: "resumebook",
enabled: false,
order: 10,
cardFormat: "Poster",
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
userConfigurable: true,
queries: [
{
path: "/UserItems/Resume",
queryOptions: {
MediaTypes: "Book",
Fields: "PrimaryImageAspectRatio",
Limit: 12,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
],
},
],
},
// Upcoming Group
{
id: "home-upcoming",
name: "Upcoming",
sections: [
{
id: "upcoming",
name: "Coming Soon",
enabled: true,
order: 60,
cardFormat: "Thumb",
flattenSeries: true,
ttl: CACHE_CONFIG.LONG_TTL,
userConfigurable: true,
sectionCssClass: "hideIndicators",
queries: [
{
path: "/Shows/Upcoming",
queryOptions: {
Limit: 48,
},
},
],
},
],
},
// Recently Released Group
{
id: "home-recently-released",
name: "Recently Released",
sections: [
{
id: "recentlyReleased.movies",
name: "Recently Released Movies",
enabled: true,
order: 20,
cardFormat: "Poster",
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
minAge: 0,
maxAge: 30,
queryOptions: {
IncludeItemTypes: ["Movie"],
SortBy: "PremiereDate",
SortOrder: "Descending",
Limit: 16,
Fields: "PremiereDate",
},
},
],
},
{
id: "recentlyReleased.episodes",
name: "Recently Aired Episodes",
enabled: true,
order: 21,
cardFormat: "Thumb",
flattenSeries: true,
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
minAge: 0,
maxAge: 7,
queryOptions: {
IncludeItemTypes: ["Episode"],
IsMissing: "false",
SortBy: "PremiereDate",
SortOrder: "Descending",
Limit: 100, // Fetch more for dedupe
},
},
],
},
],
},
// Recently Added (sections added by verifyLibrarySectionsConfig from server libraries)
{
id: "home-recently-added",
name: "Recently Added",
sections: [],
},
// Live TV
{
id: "home-live-tv",
name: "Live TV",
sections: [
{
id: "liveTv-recordings",
name: "Recordings",
jellyfinId: "activerecordings",
enabled: false,
order: 90,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Recordings",
queryOptions: {
IsInProgress: true,
Fields: "PrimaryImageAspectRatio",
Limit: 12,
EnableTotalRecordCount: "false",
ImageTypeLimit: 1,
},
},
],
},
{
id: "liveTv-timers",
name: "Scheduled Recordings",
enabled: false,
order: 91,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Timers",
queryOptions: {
IsActive: false,
IsScheduled: true,
Limit: 20,
},
},
],
},
{
id: "liveTv-browse",
name: "Live TV",
jellyfinId: "livetv",
enabled: false,
order: 91,
cardFormat: "Button",
userConfigurable: true,
items: [
{
Name: "Programs",
cardUrl: "#/livetv.html?tab=0",
},
{
Name: "Guide",
cardUrl: "#/livetv.html?tab=1",
},
{
Name: "Channels",
cardUrl: "#/livetv.html?tab=2",
},
{
Name: "Recordings",
cardUrl: "#/livetv.html?tab=3",
},
{
Name: "Schedule",
cardUrl: "#/livetv.html?tab=4",
},
{
Name: "Series",
cardUrl: "#/livetv.html?tab=5",
},
],
},
{
id: "liveTv-on-now",
name: "On Now",
jellyfinId: "livetv",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs/Recommended",
queryOptions: {
IsAiring: true,
Fields: "ChannelInfo,PrimaryImageAspectRatio",
Limit: 1,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: "false",
},
},
],
},
{
id: "liveTv-programs",
name: "Programs",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs",
queryOptions: {
Limit: 20,
SortBy: "Random",
HasAired: false,
},
},
],
},
{
id: "liveTv-channels",
name: "Channels",
enabled: false,
order: 92,
cardFormat: "Square",
hideCardFooter: true,
ttl: CACHE_CONFIG.LONG_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Channels",
queryOptions: {
Limit: 20,
SortBy: "Random",
},
},
],
},
{
id: "liveTv-series-on-now",
name: "Shows From Live TV",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs",
queryOptions: {
Limit: 10,
SortBy: "Random",
HasAired: false,
IsSeries: true,
IsMovie: false,
IsSports: false,
IsNews: false,
IsKids: false,
},
},
],
},
{
id: "liveTv-movies-on-now",
name: "Movies From Live TV",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs",
queryOptions: {
Limit: 10,
SortBy: "Random",
HasAired: false,
IsMovie: true,
},
},
],
},
{
id: "liveTv-sports-on-now",
name: "Sports From Live TV",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs",
queryOptions: {
Limit: 10,
SortBy: "Random",
HasAired: false,
IsSports: true,
},
},
],
},
{
id: "liveTv-news-on-now",
name: "News From Live TV",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs",
queryOptions: {
Limit: 10,
SortBy: "Random",
HasAired: false,
IsNews: true,
},
},
],
},
{
id: "liveTv-kids-on-now",
name: "Kids From Live TV",
enabled: false,
order: 92,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
userConfigurable: true,
queries: [
{
path: "/LiveTv/Programs",
queryOptions: {
Limit: 10,
SortBy: "Random",
HasAired: false,
IsKids: true,
},
},
],
},
],
},
// IMDb Top 250 Group
{
id: "home-imdb-top-250",
name: "IMDb Top 250",
sections: [
{
id: "imdbTop250",
name: "IMDb Top 250",
enabled: true,
order: 70,
cardFormat: "Poster",
ttl: CACHE_CONFIG.LONG_TTL,
userConfigurable: true,
queries: [
{
dataSource: "MoviesCache.getImdbTop250Movies",
queryOptions: {
Limit: 20,
SortBy: "Random",
IncludeItemTypes: ["Movie"],
},
},
],
},
],
},
// Popular TV Networks Group
{
id: "home-popular-studios",
name: "Popular Studios",
sections: [
{
id: "popularTVStudios",
name: "Popular TV Studios",
enabled: true,
order: 72,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.STATIC_TTL,
itemLimit: 20,
sortBy: "Random",
limitBeforeSort: true,
hideCardFooter: true,
userConfigurable: true,
queries: [
{
path: "/Studios",
queryOptions: {
IncludeItemTypes: ["Series"],
SortBy: "ChildCount",
SortOrder: "Descending",
Limit: 0,
},
},
],
},
{
id: "popularMovieStudios",
name: "Popular Movie Studios",
enabled: true,
order: 72,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.STATIC_TTL,
itemLimit: 20,
sortBy: "Random",
limitBeforeSort: true,
hideCardFooter: true,
userConfigurable: true,
queries: [
{
path: "/Studios",
queryOptions: {
IncludeItemTypes: ["Movie"],
SortBy: "ChildCount",
SortOrder: "Descending",
Limit: 0,
},
},
],
},
{
id: "popularStudios",
name: "Popular Studios",
enabled: false,
order: 72,
cardFormat: "Thumb",
ttl: CACHE_CONFIG.STATIC_TTL,
itemLimit: 20,
sortBy: "Random",
limitBeforeSort: true,
hideCardFooter: true,
userConfigurable: true,
queries: [
{
path: "/Studios",
queryOptions: {
IncludeItemTypes: ["Movie", "Series"],
SortBy: "ChildCount",
SortOrder: "Descending",
Limit: 0,
},
},
],
},
],
},
// Popular Genres (sections added by verifyLibrarySectionsConfig from server libraries)
{
id: "home-popular-genres",
name: "Popular Genres",
sections: [],
},
// Watch Again Group
{
id: "home-watch-again",
name: "Watch Again",
sections: [
{
id: "watchAgain",
name: "Watch Again",
enabled: true,
order: 73,
cardFormat: "Random",
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
queryOptions: {
Filters: "IsPlayed",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
// Watchlist Group
{
id: "home-watchlist",
name: "Watchlist",
sections: [
{
id: "watchlist",
name: "Watchlist",
enabled: true,
order: 71,
cardFormat: "Poster",
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
userConfigurable: true,
queries: [
{
queryOptions: {
Filters: "Likes",
SortBy: "DateCreated",
SortOrder: "Descending",
Limit: 20,
},
},
],
},
],
},
// Resume Playlists Group
{
id: "home-playlists-collections",
name: "Playlists & Collections",
sections: [
{
id: "resumePlaylists",
name: "Continue Watching Your Playlists",
enabled: false,
order: 74,
cardFormat: "Poster",
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
queryOptions: {
IsUnplayed: true,
IncludeItemTypes: ["Playlist"],
SortBy: "PlayedPercentage",
SortOrder: "Descending",
Limit: 0,
},
},
],
},
{
id: "completeCollections",
name: "Finish Watching Your Collections",
enabled: false,
order: 75,
cardFormat: "Poster",
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
queryOptions: {
IsUnplayed: true,
IncludeItemTypes: ["BoxSet"],
SortBy: "PlayedPercentage",
SortOrder: "Descending",
},
},
],
},
{
id: "playlists",
name: "Browse by Playlist",
enabled: false,
order: 76,
cardFormat: "Poster",
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Playlist"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "collections",
name: "Browse by Collection",
enabled: false,
order: 77,
cardFormat: "Poster",
ttl: CACHE_CONFIG.DEFAULT_TTL,
userConfigurable: true,
queries: [
{
queryOptions: {
IncludeItemTypes: ["BoxSet"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
// Thematic Picks (static items – no remote query)
{
id: "home-thematic-picks",
name: "Thematic Picks",
sections: [
{
id: "thematic-story-origins",
name: "Story Origins",
enabled: false,
userConfigurable: true,
order: 81,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "Based on a True Story",
imageUrl: "${kefinTweaksRoot}pages/images/collections/based-on-true-story.jpg",
cardUrl:
"#/list.html?type=tag&tag=based%20on%20a%20true%20story|based%20on%20true%20story&serverId=${serverId}",
},
{
Name: "Based on a Novel",
imageUrl: "${kefinTweaksRoot}pages/images/collections/based-on-novel.jpg",
cardUrl: "#/list.html?type=tag&tag=based%20on%20novel%20or%20book&serverId=${serverId}",
},
{
Name: "Based on a Comic Book",
imageUrl: "${kefinTweaksRoot}pages/images/collections/based-on-comic-book.jpg",
cardUrl: "#/list.html?type=tag&tag=based%20on%20comic|comic%20book&serverId=${serverId}",
},
{
Name: "Based on a Video Game",
imageUrl: "${kefinTweaksRoot}pages/images/collections/based-on-video-game.jpg",
cardUrl: "#/list.html?type=tag&tag=based%20on%20video%20game|video%20game&serverId=${serverId}",
},
{
Name: "Based on a Play or Musical",
imageUrl: "${kefinTweaksRoot}pages/images/collections/based-on-play-musical.jpg",
cardUrl: "#/list.html?type=tag&tag=based%20on%20play%20or%20musical&serverId=${serverId}",
},
{
Name: "Based on a Memoir",
imageUrl: "${kefinTweaksRoot}pages/images/collections/based-on-memoir.jpg",
cardUrl: "#/list.html?type=tag&tag=based%20on%20memoir%20or%20autobiography&serverId=${serverId}",
},
{
Name: "Biography",
imageUrl: "${kefinTweaksRoot}pages/images/collections/biography.jpg",
cardUrl: "#/list.html?type=tag&tag=biography&serverId=${serverId}",
},
{
Name: "Remake / Reboot",
imageUrl: "${kefinTweaksRoot}pages/images/collections/remake-reboot.jpg",
cardUrl: "#/list.html?type=tag&tag=remake|reboot&serverId=${serverId}",
},
],
},
{
id: "thematic-core-concepts",
name: "Core Concepts",
enabled: false,
userConfigurable: true,
order: 82,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "Superhero",
imageUrl: "${kefinTweaksRoot}pages/images/collections/superhero.jpg",
cardUrl: "#/list.html?type=tag&tag=superhero&serverId=${serverId}",
},
{
Name: "Super Power",
imageUrl: "${kefinTweaksRoot}pages/images/collections/super-power.jpg",
cardUrl: "#/list.html?type=tag&tag=super%20power&serverId=${serverId}",
},
{
Name: "Time Travel",
imageUrl: "${kefinTweaksRoot}pages/images/collections/time-travel.jpg",
cardUrl: "#/list.html?type=tag&tag=time%20travel&serverId=${serverId}",
},
{
Name: "Time Loop",
imageUrl: "${kefinTweaksRoot}pages/images/collections/time-loop.jpg",
cardUrl: "#/list.html?type=tag&tag=time%20loop&serverId=${serverId}",
},
{
Name: "Dystopia",
imageUrl: "${kefinTweaksRoot}pages/images/collections/dystopia.jpg",
cardUrl: "#/list.html?type=tag&tag=dystopia&serverId=${serverId}",
},
{
Name: "Post-Apocalyptic Future",
imageUrl: "${kefinTweaksRoot}pages/images/collections/post-apocalyptic.jpg",
cardUrl: "#/list.html?type=tag&tag=post-apocalyptic%20future&serverId=${serverId}",
},
{
Name: "Cyberpunk",
imageUrl: "${kefinTweaksRoot}pages/images/collections/cyberpunk.jpg",
cardUrl: "#/list.html?type=tag&tag=cyberpunk&serverId=${serverId}",
},
{
Name: "Parallel Universe",
imageUrl: "${kefinTweaksRoot}pages/images/collections/parallel-universe.jpg",
cardUrl: "#/list.html?type=tag&tag=parallel%20universe&serverId=${serverId}",
},
{
Name: "Alternative Reality",
imageUrl: "${kefinTweaksRoot}pages/images/collections/alternative-reality.jpg",
cardUrl: "#/list.html?type=tag&tag=alternative%20reality&serverId=${serverId}",
},
{
Name: "Virtual Reality",
imageUrl: "${kefinTweaksRoot}pages/images/collections/virtual-reality.jpg",
cardUrl: "#/list.html?type=tag&tag=virtual%20reality&serverId=${serverId}",
},
{
Name: "Artificial Intelligence",
imageUrl: "${kefinTweaksRoot}pages/images/collections/artificial-intelligence.jpg",
cardUrl:
"#/list.html?type=tag&tag=artificial%20intelligence|artificial%20intelligence%20(a.i.)&serverId=${serverId}",
},
{
Name: "Zombie",
imageUrl: "${kefinTweaksRoot}pages/images/collections/zombie.jpg",
cardUrl: "#/list.html?type=tag&tag=zombie|zombie%20apocalypse&serverId=${serverId}",
},
{
Name: "Kaiju / Giant Monster",
imageUrl: "${kefinTweaksRoot}pages/images/collections/kaiju.jpg",
cardUrl: "#/list.html?type=tag&tag=kaiju|giant%20monster&serverId=${serverId}",
},
{
Name: "Alien",
imageUrl: "${kefinTweaksRoot}pages/images/collections/alien.jpg",
cardUrl: "#/list.html?type=tag&tag=alien&serverId=${serverId}",
},
{
Name: "Vampire",
imageUrl: "${kefinTweaksRoot}pages/images/collections/vampire.jpg",
cardUrl: "#/list.html?type=tag&tag=vampire&serverId=${serverId}",
},
{
Name: "Werewolf",
imageUrl: "${kefinTweaksRoot}pages/images/collections/werewolf.jpg",
cardUrl: "#/list.html?type=tag&tag=werewolf&serverId=${serverId}",
},
{
Name: "Witchcraft",
imageUrl: "${kefinTweaksRoot}pages/images/collections/witchcraft.jpg",
cardUrl: "#/list.html?type=tag&tag=witchcraft&serverId=${serverId}",
},
{
Name: "Supernatural",
imageUrl: "${kefinTweaksRoot}pages/images/collections/supernatural.jpg",
cardUrl: "#/list.html?type=tag&tag=supernatural&serverId=${serverId}",
},
{
Name: "Ghost",
imageUrl: "${kefinTweaksRoot}pages/images/collections/ghost.jpg",
cardUrl: "#/list.html?type=tag&tag=ghost&serverId=${serverId}",
},
{
Name: "Mythology",
imageUrl: "${kefinTweaksRoot}pages/images/collections/mythology.jpg",
cardUrl: "#/list.html?type=tag&tag=mythology&serverId=${serverId}",
},
{
Name: "Magic",
imageUrl: "${kefinTweaksRoot}pages/images/collections/magic.jpg",
cardUrl: "#/list.html?type=tag&tag=magic&serverId=${serverId}",
},
],
},
{
id: "thematic-crime-stories",
name: "Crime Stories",
enabled: false,
userConfigurable: true,
order: 83,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "Heist",
imageUrl: "${kefinTweaksRoot}pages/images/collections/heist.jpg",
cardUrl: "#/list.html?type=tag&tag=heist|robbery&serverId=${serverId}",
},
{
Name: "True Crime",
imageUrl: "${kefinTweaksRoot}pages/images/collections/true-crime.jpg",
cardUrl: "#/list.html?type=tag&tag=true%20crime&serverId=${serverId}",
},
{
Name: "Serial Killer",
imageUrl: "${kefinTweaksRoot}pages/images/collections/serial-killer.jpg",
cardUrl: "#/list.html?type=tag&tag=serial%20killer&serverId=${serverId}",
},
{
Name: "Murder",
imageUrl: "${kefinTweaksRoot}pages/images/collections/murder.jpg",
cardUrl: "#/list.html?type=tag&tag=murder&serverId=${serverId}",
},
{
Name: "Organized Crime",
imageUrl: "${kefinTweaksRoot}pages/images/collections/organized-crime.jpg",
cardUrl: "#/list.html?type=tag&tag=organized%20crime&serverId=${serverId}",
},
{
Name: "Criminal Mastermind",
imageUrl: "${kefinTweaksRoot}pages/images/collections/criminal-mastermind.jpg",
cardUrl: "#/list.html?type=tag&tag=criminal%20mastermind&serverId=${serverId}",
},
{
Name: "Mafia / Mobster",
imageUrl: "${kefinTweaksRoot}pages/images/collections/mafia.jpg",
cardUrl: "#/list.html?type=tag&tag=mafia|mobster&serverId=${serverId}",
},
{
Name: "Gangster",
imageUrl: "${kefinTweaksRoot}pages/images/collections/gangster.jpg",
cardUrl: "#/list.html?type=tag&tag=gangster&serverId=${serverId}",
},
{
Name: "Prison",
imageUrl: "${kefinTweaksRoot}pages/images/collections/prison.jpg",
cardUrl: "#/list.html?type=tag&tag=prison&serverId=${serverId}",
},
{
Name: "Vigilante Justice",
imageUrl: "${kefinTweaksRoot}pages/images/collections/vigilante.jpg",
cardUrl: "#/list.html?type=tag&tag=vigilante%20justice|vigilante&serverId=${serverId}",
},
{
Name: "Conspiracy",
imageUrl: "${kefinTweaksRoot}pages/images/collections/conspiracy.jpg",
cardUrl: "#/list.html?type=tag&tag=conspiracy&serverId=${serverId}",
},
{
Name: "Courtroom Drama",
imageUrl: "${kefinTweaksRoot}pages/images/collections/courtroom.jpg",
cardUrl: "#/list.html?type=tag&tag=courtroom%20drama|courtroom&serverId=${serverId}",
},
{
Name: "Spy / Espionage",
imageUrl: "${kefinTweaksRoot}pages/images/collections/spy.jpg",
cardUrl: "#/list.html?type=tag&tag=spy|espionage&serverId=${serverId}",
},
],
},
{
id: "thematic-character-perspective",
name: "Character Perspective",
enabled: false,
userConfigurable: true,
order: 84,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "Anti Hero",
imageUrl: "${kefinTweaksRoot}pages/images/collections/anti-hero.jpg",
cardUrl: "#/list.html?type=tag&tag=anti%20hero&serverId=${serverId}",
},
{
Name: "Female Protagonist",
imageUrl: "${kefinTweaksRoot}pages/images/collections/female-protagonist.jpg",
cardUrl: "#/list.html?type=tag&tag=female%20protagonist&serverId=${serverId}",
},
{
Name: "Family",
imageUrl: "${kefinTweaksRoot}pages/images/collections/family.jpg",
cardUrl: "#/list.html?type=tag&tag=family&serverId=${serverId}",
},
{
Name: "Dysfunctional Family",
imageUrl: "${kefinTweaksRoot}pages/images/collections/dysfunctional-family.jpg",
cardUrl: "#/list.html?type=tag&tag=dysfunctional%20family&serverId=${serverId}",
},
{
Name: "LGBTQ+",
imageUrl: "${kefinTweaksRoot}pages/images/collections/lgbtq.jpg",
cardUrl: "#/list.html?type=tag&tag=lgbtq%2B|lgbtq|lgbt&serverId=${serverId}",
},
{
Name: "Unreliable Narrator",
imageUrl: "${kefinTweaksRoot}pages/images/collections/unreliable-narrator.jpg",
cardUrl: "#/list.html?type=tag&tag=unreliable%20narrator&serverId=${serverId}",
},
{
Name: "Underdog",
imageUrl: "${kefinTweaksRoot}pages/images/collections/underdog.jpg",
cardUrl: "#/list.html?type=tag&tag=underdog&serverId=${serverId}",
},
{
Name: "Mentor-Protégé",
imageUrl: "${kefinTweaksRoot}pages/images/collections/mentor.jpg",
cardUrl: "#/list.html?type=tag&tag=mentor%20prot%C3%A9g%C3%A9%20relationship|mentor&serverId=${serverId}",
},
{
Name: "Friendship",
imageUrl: "${kefinTweaksRoot}pages/images/collections/friendship.jpg",
cardUrl: "#/list.html?type=tag&tag=friendship&serverId=${serverId}",
},
{
Name: "Villain",
imageUrl: "${kefinTweaksRoot}pages/images/collections/villain.jpg",
cardUrl: "#/list.html?type=tag&tag=villain&serverId=${serverId}",
},
],
},
{
id: "thematic-settings",
name: "Settings",
enabled: false,
userConfigurable: true,
order: 85,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "High School",
imageUrl: "${kefinTweaksRoot}pages/images/collections/high-school.jpg",
cardUrl: "#/list.html?type=tag&tag=high%20school&serverId=${serverId}",
},
{
Name: "Workplace",
imageUrl: "${kefinTweaksRoot}pages/images/collections/workplace.jpg",
cardUrl: "#/list.html?type=tag&tag=workplace|workplace%20comedy|workplace%20romance&serverId=${serverId}",
},
{
Name: "Small Town",
imageUrl: "${kefinTweaksRoot}pages/images/collections/small-town.jpg",
cardUrl: "#/list.html?type=tag&tag=small%20town&serverId=${serverId}",
},
{
Name: "Road Trip",
imageUrl: "${kefinTweaksRoot}pages/images/collections/road-trip.jpg",
cardUrl: "#/list.html?type=tag&tag=road%20trip&serverId=${serverId}",
},
{
Name: "Island",
imageUrl: "${kefinTweaksRoot}pages/images/collections/island.jpg",
cardUrl: "#/list.html?type=tag&tag=island&serverId=${serverId}",
},
{
Name: "Period Piece",
imageUrl: "${kefinTweaksRoot}pages/images/collections/period-piece.jpg",
cardUrl: "#/list.html?type=tag&tag=period%20piece|period%20drama&serverId=${serverId}",
},
{
Name: "Victorian Era",
imageUrl: "${kefinTweaksRoot}pages/images/collections/victorian-era.jpg",
cardUrl: "#/list.html?type=tag&tag=victorian%20era|victorian%20england&serverId=${serverId}",
},
{
Name: "Medieval",
imageUrl: "${kefinTweaksRoot}pages/images/collections/medieval.jpg",
cardUrl: "#/list.html?type=tag&tag=medieval&serverId=${serverId}",
},
{
Name: "Western",
imageUrl: "${kefinTweaksRoot}pages/images/collections/western.jpg",
cardUrl: "#/list.html?type=tag&tag=western&serverId=${serverId}",
},
{
Name: "War",
imageUrl: "${kefinTweaksRoot}pages/images/collections/war.jpg",
cardUrl: "#/list.html?type=tag&tag=war|world%20war%20i|world%20war%20ii&serverId=${serverId}",
},
{
Name: "Space",
imageUrl: "${kefinTweaksRoot}pages/images/collections/space.jpg",
cardUrl: "#/list.html?type=tag&tag=space|spacecraft|space%20station|spaceship&serverId=${serverId}",
},
],
},
{
id: "thematic-tone-style",
name: "Tone & Style",
enabled: false,
userConfigurable: true,
order: 86,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "Dark Comedy",
imageUrl: "${kefinTweaksRoot}pages/images/collections/dark-comedy.jpg",
cardUrl: "#/list.html?type=tag&tag=dark%20comedy|black%20comedy&serverId=${serverId}",
},
{
Name: "Psychological Thriller",
imageUrl: "${kefinTweaksRoot}pages/images/collections/psychological-thriller.jpg",
cardUrl: "#/list.html?type=tag&tag=psychological%20thriller&serverId=${serverId}",
},
{
Name: "Camp",
imageUrl: "${kefinTweaksRoot}pages/images/collections/camp.jpg",
cardUrl: "#/list.html?type=tag&tag=camp&serverId=${serverId}",
},
{
Name: "Satire",
imageUrl: "${kefinTweaksRoot}pages/images/collections/satire.jpg",
cardUrl: "#/list.html?type=tag&tag=satire&serverId=${serverId}",
},
{
Name: "Mockumentary",
imageUrl: "${kefinTweaksRoot}pages/images/collections/mockumentary.jpg",
cardUrl: "#/list.html?type=tag&tag=mockumentary&serverId=${serverId}",
},
{
Name: "Neo-Noir",
imageUrl: "${kefinTweaksRoot}pages/images/collections/neo-noir.jpg",
cardUrl: "#/list.html?type=tag&tag=neo-noir&serverId=${serverId}",
},
{
Name: "Film Noir",
imageUrl: "${kefinTweaksRoot}pages/images/collections/film-noir.jpg",
cardUrl: "#/list.html?type=tag&tag=film%20noir|noir&serverId=${serverId}",
},
{
Name: "Surrealism",
imageUrl: "${kefinTweaksRoot}pages/images/collections/surrealism.jpg",
cardUrl: "#/list.html?type=tag&tag=surrealism&serverId=${serverId}",
},
],
},
{
id: "thematic-themes-topics",
name: "Themes & Topics",
enabled: false,
userConfigurable: true,
order: 87,
cardFormat: "Sqaure",
sortBy: "Random",
cardTitlePosition: "overlay-top-left",
cardTitleCapitalization: "uppercase",
cardTitleFontFamily: "oswald",
cardTitleFontSize: "large",
borderStyle: "stairstep",
items: [
{
Name: "Coming of Age",
imageUrl: "${kefinTweaksRoot}pages/images/collections/coming-of-age.jpg",
cardUrl: "#/list.html?type=tag&tag=coming%20of%20age&serverId=${serverId}",
},
{
Name: "Revenge",
imageUrl: "${kefinTweaksRoot}pages/images/collections/revenge.jpg",
cardUrl: "#/list.html?type=tag&tag=revenge&serverId=${serverId}",
},
{
Name: "Redemption",
imageUrl: "${kefinTweaksRoot}pages/images/collections/redemption.jpg",
cardUrl: "#/list.html?type=tag&tag=redemption&serverId=${serverId}",
},
{
Name: "Survival",
imageUrl: "${kefinTweaksRoot}pages/images/collections/survival.jpg",
cardUrl: "#/list.html?type=tag&tag=survival&serverId=${serverId}",
},
{
Name: "Sports",
imageUrl: "${kefinTweaksRoot}pages/images/collections/sports.jpg",
cardUrl: "#/list.html?type=tag&tag=sports&serverId=${serverId}",
},
{
Name: "Identity",
imageUrl: "${kefinTweaksRoot}pages/images/collections/identity.jpg",
cardUrl:
"#/list.html?type=tag&tag=identity|secret%20identity|fake%20identity|mistaken%20identity&serverId=${serverId}",
},
{
Name: "Mental Health",
imageUrl: "${kefinTweaksRoot}pages/images/collections/mental-health.jpg",
cardUrl: "#/list.html?type=tag&tag=mental%20health&serverId=${serverId}",
},
{
Name: "Addiction",
imageUrl: "${kefinTweaksRoot}pages/images/collections/addiction.jpg",
cardUrl: "#/list.html?type=tag&tag=addiction|drug%20addiction|sex%20addiction&serverId=${serverId}",
},
{
Name: "Class Differences",
imageUrl: "${kefinTweaksRoot}pages/images/collections/class-differences.jpg",
cardUrl: "#/list.html?type=tag&tag=class%20differences|upper%20class|working%20class&serverId=${serverId}",
},
{
Name: "Faith / Religion",
imageUrl: "${kefinTweaksRoot}pages/images/collections/faith-religion.jpg",
cardUrl: "#/list.html?type=tag&tag=faith|religion&serverId=${serverId}",
},
],
},
],
},
// Misc
{
id: "home-misc",
name: "Misc",
sections: [
{
id: "suggested-jellyfin-clients",
name: "Suggested Jellyfin Clients",
enabled: false,
order: 50,
cardFormat: "Thumb",
queries: [],
renderMode: "Normal",
type: "home",
userConfigurable: true,
ttl: 3600000,
items: [
{
Name: "AFinity",
Type: "Folder",
cardUrl: "https://afinity.vercel.app/",
imageUrl: "${kefinTweaksRoot}pages/images/clients/afinity.png",
},
{
Name: "Moonfin",
Type: "Folder",
cardUrl: "https://moonfin.io/",
imageUrl: "${kefinTweaksRoot}pages/images/clients/moonfin.png",
},
{
Name: "Neptune",
Type: "Folder",
cardUrl: "https://neptuneplayer.com/",
imageUrl: "${kefinTweaksRoot}pages/images/clients/neptune.png",
},
{
Name: "Pelagica",
Type: "Folder",
cardUrl: "https://pelagica.app/",
imageUrl: "${kefinTweaksRoot}pages/images/clients/pelagica.png",
},
{
Name: "Streamyfin",
Type: "Folder",
cardUrl: "https://streamyfin.app/",
imageUrl: "${kefinTweaksRoot}pages/images/clients/streamyfin.png",
},
{
Name: "Wholphin",
Type: "Folder",
cardUrl: "https://github.com/damontecres/Wholphin",
imageUrl: "${kefinTweaksRoot}pages/images/clients/wholphin.png",
},
],
},
],
},
];
// Seasonal Sections
// Sections that only appear during specific date ranges
const KEFINTWEAKS_SEASONAL_SECTION_GROUPS = [
// Seasonal Sections - Halloween
{
id: "seasonal-halloween",
name: "Halloween",
sections: [
{
id: "seasonal.halloween.halloween-tag",
name: "Halloween Movies",
enabled: true,
userConfigurable: true,
startDate: "10-01",
endDate: "10-31",
order: 50,
cardFormat: "Poster",
queries: [
{
queryOptions: {
Tags: "halloween",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.halloween.halloween-horror",
name: "Horror Movies",
enabled: true,
userConfigurable: true,
startDate: "10-01",
endDate: "10-31",
order: 51,
cardFormat: "Poster",
queries: [
{
queryOptions: {
Genres: "Horror",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.halloween.halloween-thriller",
name: "Thriller Movies",
enabled: true,
userConfigurable: true,
startDate: "10-01",
endDate: "10-31",
order: 52,
cardFormat: "Poster",
queries: [
{
queryOptions: {
Genres: "Thriller",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.halloween.halloween-episodes",
name: "Halloween Episodes",
enabled: true,
userConfigurable: true,
startDate: "10-01",
endDate: "10-31",
order: 53,
cardFormat: "Series Thumb",
queries: [
{
queryOptions: {
SearchTerm: "halloween",
IncludeItemTypes: ["Episode"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
// Seasonal Sections - Christmas
{
id: "seasonal-christmas",
name: "Christmas",
sections: [
{
id: "seasonal.christmas.christmas-movies",
name: "Christmas Movies",
enabled: true,
userConfigurable: true,
startDate: "12-01",
endDate: "12-31",
order: 50,
cardFormat: "Poster",
renderMode: "Spotlight",
queries: [
{
queryOptions: {
Tags: "christmas",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.christmas.christmas-episodes",
name: "Christmas Episodes",
enabled: true,
userConfigurable: true,
startDate: "12-01",
endDate: "12-31",
order: 51,
cardFormat: "Thumb",
queries: [
{
queryOptions: {
SearchTerm: "christmas",
IncludeItemTypes: ["Episode"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
// Seasonal Sections - New Year's
{
id: "seasonal-new-years",
name: "New Year's",
sections: [
{
id: "seasonal.new-years.new-years-movies",
name: "New Year's Movies",
enabled: true,
userConfigurable: true,
startDate: "01-01",
endDate: "01-02",
order: 50,
cardFormat: "Poster",
queries: [
{
queryOptions: {
Tags: "new year's eve",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.new-years.new-years-episodes",
name: "New Year's Episodes",
enabled: true,
userConfigurable: true,
startDate: "01-01",
endDate: "01-02",
order: 51,
cardFormat: "Thumb",
queries: [
{
queryOptions: {
SearchTerm: "new year",
IncludeItemTypes: ["Episode"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
// Seasonal Sections - Valentine's
{
id: "seasonal-valentines",
name: "Valentine's",
sections: [
{
id: "seasonal.valentines.valentines-movies",
name: "Valentine's Movies",
enabled: true,
userConfigurable: true,
startDate: "02-07",
endDate: "02-14",
order: 50,
cardFormat: "Poster",
queries: [
{
queryOptions: {
Tags: "valentine's day",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.valentines.valentines-episodes",
name: "Valentine's Episodes",
enabled: true,
userConfigurable: true,
startDate: "02-07",
endDate: "02-14",
order: 51,
cardFormat: "Thumb",
queries: [
{
queryOptions: {
SearchTerm: "valentine",
IncludeItemTypes: ["Episode"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
// Seasonal Sections - Thanksgiving
{
id: "seasonal-thanksgiving",
name: "Thanksgiving",
sections: [
{
id: "seasonal.thanksgiving.thanksgiving-movies",
name: "Thanksgiving Movies",
enabled: true,
userConfigurable: true,
startDate: "11-20",
endDate: "11-30",
order: 50,
cardFormat: "Poster",
queries: [
{
queryOptions: {
Tags: "thanksgiving",
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
},
},
],
},
{
id: "seasonal.thanksgiving.thanksgiving-episodes",
name: "Thanksgiving Episodes",
enabled: true,
userConfigurable: true,
startDate: "11-20",
endDate: "11-30",
order: 51,
cardFormat: "Poster",
queries: [
{
queryOptions: {
SearchTerm: "thanksgiving",
IncludeItemTypes: ["Episode"],
SortBy: "Random",
Limit: 20,
},
},
],
},
],
},
];
const DISCOVERY_CONTENT_FIELDS =
"PrimaryImageAspectRatio,DateCreated,Overview,Taglines,ProductionYear,RecursiveItemCount,ChildCount,UserData";
// Discovery Templates — discoverySourceQuery picks the entity; queries load content
const KEFINTWEAKS_DISCOVERY_SECTION_GROUPS = [
// Genre Movies Group
{
id: "discovery-genre-movies",
name: "Genre Movies",
sections: [
{
id: "genreMovies",
type: "discovery",
discoveryType: "Genre",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Genres",
queryOptions: { IncludeItemTypes: ["Movie"], Limit: 0 },
},
name: "{Genre} Movies",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "spotlightGenre",
type: "discovery",
discoveryType: "Genre",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Genres",
queryOptions: { IncludeItemTypes: ["Movie"], Limit: 0 },
},
name: "Top Rated {Genre}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "CommunityRating",
sortOrderDirection: "Descending",
renderMode: "Spotlight",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "CommunityRating",
SortOrder: "Descending",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// People Movies Group
{
id: "discovery-people-movies",
name: "People Movies",
sections: [
{
id: "directedByTopDirector",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Director",
discoveryItemType: "Movie",
discoverySourceQuery: {
dataSource: "PeopleCache.getTopDirectors",
dataSourceOptions: { ItemType: "Movie" },
queryOptions: { Limit: 100 },
},
name: "Directed by {Person}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "writtenByTopWriter",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Writer",
discoveryItemType: "Movie",
discoverySourceQuery: {
dataSource: "PeopleCache.getTopWriters",
dataSourceOptions: { ItemType: "Movie" },
queryOptions: { Limit: 100 },
},
name: "Written by {Person}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "starringTopActor",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Actor",
discoveryItemType: "Movie",
discoverySourceQuery: {
dataSource: "PeopleCache.getTopActors",
dataSourceOptions: { ItemType: "Movie" },
queryOptions: { Limit: 100 },
},
name: "Starring {Person}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Recently Watched People Group
{
id: "discovery-recently-watched-people",
name: "Recently Watched People",
sections: [
{
id: "starringActorRecentlyWatched",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Actor",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Starring {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "directedByDirectorRecentlyWatched",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Director",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Directed by {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "writtenByWriterRecentlyWatched",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Writer",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Written by {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Similar to Watched Group
{
id: "discovery-similar-to-watched",
name: "Similar to Watched",
sections: [
{
id: "becauseYouWatched",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "Random",
Limit: 20,
},
},
name: "Because you watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Movie"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouRecentlyWatched",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Movie"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouLiked",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "IsFavorite",
SortBy: "Random",
Limit: 20,
Fields: "UserData,People",
},
},
name: "Because you liked {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Movie"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouWatchlistedMovie",
type: "discovery",
discoveryType: "Watchlist",
discoveryItemType: "Movie",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Movie"],
Recursive: true,
Filters: "Likes",
SortBy: "Random",
Limit: 20,
Fields: "UserData,People",
},
},
name: "Because {Title} is on your Watchlist",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Movie"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Studios Group
{
id: "discovery-studios",
name: "Studios",
sections: [
{
id: "studioShows",
type: "discovery",
discoveryType: "Studio",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Studios",
queryOptions: {
IncludeItemTypes: ["Series"],
SortBy: "ChildCount",
SortOrder: "Descending",
Limit: 0,
},
},
name: "Shows from {Studio}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Series"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "spotlightNetwork",
type: "discovery",
discoveryType: "Studio",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Studios",
queryOptions: {
IncludeItemTypes: ["Series"],
SortBy: "ChildCount",
SortOrder: "Descending",
Limit: 0,
},
},
name: "Top Rated from {Studio}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "CommunityRating",
sortOrderDirection: "Descending",
renderMode: "Spotlight",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Series"],
SortBy: "CommunityRating",
SortOrder: "Descending",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Collections Group
{
id: "discovery-collections",
name: "Collections",
sections: [
{
id: "discoveryCollections",
type: "discovery",
discoveryType: "Collection",
discoveryItemType: "Movie",
minimumItems: 3,
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["BoxSet"],
Recursive: true,
Fields: "RecursiveItemCount,ChildCount,TotalRecordCount",
Limit: 500,
SortBy: "TotalRecordCount",
},
},
name: "{Collection}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Movie", "Series"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Genre Series Group
{
id: "discovery-genre-series",
name: "Genre Series",
sections: [
{
id: "genreSeries",
type: "discovery",
discoveryType: "Genre",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Genres",
queryOptions: { IncludeItemTypes: ["Series"], Limit: 0 },
},
name: "{Genre} Series",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Series"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "spotlightGenreSeries",
type: "discovery",
discoveryType: "Genre",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Genres",
queryOptions: { IncludeItemTypes: ["Series"], Limit: 0 },
},
name: "Top Rated {Genre} Series",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "CommunityRating",
sortOrderDirection: "Descending",
renderMode: "Spotlight",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Series"],
SortBy: "CommunityRating",
SortOrder: "Descending",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Series Similar / Watchlist Group
{
id: "discovery-series-similar",
name: "Series Similar",
sections: [
{
id: "becauseYouWatchedSeries",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Episode"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "Random",
Limit: 20,
},
},
name: "Because you watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Series"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouRecentlyWatchedSeries",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Episode"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Series"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouLiked-series",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Series"],
Recursive: true,
Filters: "IsFavorite",
SortBy: "Random",
Limit: 20,
Fields: "UserData,People",
},
},
name: "Because you liked {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Series"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouWatchlistedSeries",
type: "discovery",
discoveryType: "Watchlist",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Series"],
Recursive: true,
Filters: "Likes",
SortBy: "Random",
Limit: 20,
Fields: "UserData,People",
},
},
name: "Because {Title} is on your Watchlist",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Series"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "becauseYouFinishedSeries",
type: "discovery",
discoveryType: "Similar",
discoveryItemType: "Series",
discoverySourceQuery: {
dataSource: "SeriesCache.getCompletedSeries",
queryOptions: { Limit: 5, SortBy: "Random" },
},
name: "Because you finished {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
IncludeItemTypes: ["Series"],
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Series People Group
{
id: "discovery-people-series",
name: "People Series",
sections: [
{
id: "directedByTopDirectorSeries",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Director",
discoveryItemType: "Series",
discoverySourceQuery: {
dataSource: "PeopleCache.getTopDirectors",
dataSourceOptions: { ItemType: "Series" },
queryOptions: { Limit: 100 },
},
name: "Directed by {Person}",
enabled: false,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Thumb",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Episode"],
ExcludeLocationTypes: ["Virtual"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "writtenByTopWriterSeries",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Writer",
discoveryItemType: "Series",
discoverySourceQuery: {
dataSource: "PeopleCache.getTopWriters",
dataSourceOptions: { ItemType: "Series" },
queryOptions: { Limit: 100 },
},
name: "Written by {Person}",
enabled: false,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Thumb",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Episode"],
ExcludeLocationTypes: ["Virtual"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "starringTopActorSeries",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Actor",
discoveryItemType: "Series",
discoverySourceQuery: {
dataSource: "PeopleCache.getTopActors",
dataSourceOptions: { ItemType: "Series" },
queryOptions: { Limit: 100 },
},
name: "Starring {Person}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Series"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Recently Watched People Series Group
{
id: "discovery-recently-watched-people-series",
name: "Recently Watched People Series",
sections: [
{
id: "starringActorRecentlyWatchedSeries",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Actor",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Episode"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Starring {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Poster",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Series"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "directedByDirectorRecentlyWatchedSeries",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Director",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Episode"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Directed by {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Thumb",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Episode"],
ExcludeLocationTypes: ["Virtual"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
{
id: "writtenByWriterRecentlyWatchedSeries",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "Writer",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Episode"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Written by {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Thumb",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Episode"],
ExcludeLocationTypes: ["Virtual"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
// Guest Star Group
{
id: "discovery-guest-star",
name: "Guest Star",
sections: [
{
id: "guestStarringBecauseYouRecentlyWatched",
type: "discovery",
discoveryType: "Person",
discoveryPersonType: "GuestStar",
discoveryItemType: "Series",
discoverySourceQuery: {
path: "/Items",
queryOptions: {
IncludeItemTypes: ["Episode"],
Recursive: true,
Filters: "IsPlayed",
Fields: "UserData,People",
SortBy: "DatePlayed",
SortOrder: "Descending",
Limit: 5,
},
},
name: "Guest starring {Person}",
caption: "Because you recently watched {Title}",
enabled: true,
userConfigurable: true,
itemLimit: 20,
sortOrder: "Random",
cardFormat: "Thumb",
ttl: CACHE_CONFIG.DISCOVERY_TTL,
queries: [
{
queryOptions: {
Recursive: true,
IncludeItemTypes: ["Episode"],
ExcludeLocationTypes: ["Virtual"],
SortBy: "Random",
Limit: 20,
Fields: DISCOVERY_CONTENT_FIELDS,
},
},
],
},
],
},
];
const DISCOVERY_SETTINGS = {
enabled: true,
infiniteScroll: false,
minGenreMovieCount: 50,
minGenreSeriesCount: 10,
defaultItemLimit: 16,
defaultSortOrder: "Random",
defaultCardFormat: "Poster",
spotlightDiscoveryChance: 0.5,
renderSpotlightAboveMatching: false,
randomizeOrder: false,
fadeInSections: true,
};
const SEASONAL_THEME_SETTINGS = {
enabled: false,
enableSeasonalAnimations: false,
enableSeasonalBackground: false,
seasonalThemes: {
"seasonal-halloween": {
animation: "seasonalOverlay",
shape: "bat",
animationStyle: "fly",
backgroundImage: "url(../pages/images/halloween.jpg)",
},
"seasonal-christmas": {
animation: "seasonalOverlay",
shape: "snowflake",
animationStyle: "fall",
backgroundImage: "url(../pages/images/christmas.jpg)",
},
"seasonal-new-years": {
animation: "seasonalOverlay",
shape: "bell",
animationStyle: "fall",
backgroundImage: "url(../pages/images/new-years.jpg)",
},
"seasonal-valentines": {
animation: "seasonalOverlay",
shape: "heart",
animationStyle: "fall",
backgroundImage: "url(../pages/images/valentines.jpg)",
},
},
};
const HOME_SETTINGS = {
minimumSeriesForPopularTVNetworks: 10,
fadeInSections: false,
ensureThumbsForPopularTVNetworks: false,
showStaleDataBeforeRefresh: true,
dismissEmptySectionTimer: 0,
showCreateSectionButtonOnHome: false,
showCategoryFilters: true,
renderCategoriesSeparately: false,
minPeopleAppearancesTotal: 10,
minPeopleAppearancesMovies: 10,
minPeopleAppearancesSeries: 10,
minPeopleAppearancesEpisodes: 10,
maxPeopleCount: 100,
loadPeopleEpisodeData: false,
categories: [
{
id: "none",
name: "Home",
icon: "home",
},
{
id: "discovery",
name: "Discover",
icon: "explore",
},
{
id: "pinned",
name: "Pinned",
icon: "push_pin",
},
],
};
const USER_HOME_SCREEN_SETTINGS = {
inlineConfigure: true,
pinning: true,
pairNativeHomeSections: true,
};
const SPOTLIGHT_SETTINGS = {
autoPlay: true,
interval: 10000,
showDots: true,
showNavButtons: true,
showClearArt: false,
panAnimation: true,
};
// Expose configuration
window.KefinHomeConfig2 = {
CACHE: CACHE_CONFIG,
HOME_SECTION_GROUPS: KEFINTWEAKS_HOME_SECTION_GROUPS,
SEASONAL_SECTION_GROUPS: KEFINTWEAKS_SEASONAL_SECTION_GROUPS,
DISCOVERY_SECTION_GROUPS: KEFINTWEAKS_DISCOVERY_SECTION_GROUPS,
CUSTOM_SECTION_GROUPS: [], // Empty by default - user-created/imported sections
HOME_SETTINGS: HOME_SETTINGS,
USER_HOME_SCREEN_SETTINGS: USER_HOME_SCREEN_SETTINGS,
DISCOVERY_SETTINGS: DISCOVERY_SETTINGS,
SEASONAL_THEME_SETTINGS: SEASONAL_THEME_SETTINGS,
SPOTLIGHT_SETTINGS: SPOTLIGHT_SETTINGS,
LIBRARY_CACHE: {
movieChunkSize: 1000,
seriesChunkSize: 1000,
mdblistApiKey: "",
CACHE_TTL: 14 * 24 * 60 * 60 * 1000,
},
};
/*
window.KefinHomeUserConfig = {
CACHE: CACHE_CONFIG,
HOME_SECTION_GROUPS: KEFINTWEAKS_HOME_SECTION_GROUPS, // modified by user configuration
SEASONAL_SECTION_GROUPS: KEFINTWEAKS_SEASONAL_SECTION_GROUPS, // modified by user configuration`
DISCOVERY_SECTION_GROUPS: KEFINTWEAKS_DISCOVERY_SECTION_GROUPS, // modified by user configuration
CUSTOM_SECTION_GROUPS: [], // Empty by default - user-created/imported sections // modified by user configuration
REMOVE_CONFLICTING_SECTIONS: true,
HOME_SETTINGS: HOME_SETTINGS,
DISCOVERY_SETTINGS: DISCOVERY_SETTINGS,
SEASONAL_THEME_SETTINGS: SEASONAL_THEME_SETTINGS,
SPOTLIGHT_SETTINGS: SPOTLIGHT_SETTINGS
}
*/
console.log("[KefinTweaks HomeConfig2] Configuration loaded");
})();