mirror of
https://github.com/ranaldsgift/KefinTweaks.git
synced 2026-11-05 07:42:47 +01:00
2990 lines
76 KiB
JavaScript
2990 lines
76 KiB
JavaScript
// 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",
|
||
type: "home",
|
||
name: "My Media",
|
||
jellyfinId: "smalllibrarytiles",
|
||
enabled: false,
|
||
order: 5,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/UserViews",
|
||
queryOptions: {
|
||
Limit: 0,
|
||
Recursive: false,
|
||
SortBy: "Default",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "my-media-small",
|
||
type: "home",
|
||
name: "My Media",
|
||
description: "Small Buttons",
|
||
jellyfinId: "librarybuttons",
|
||
enabled: false,
|
||
order: 6,
|
||
cardFormat: "Button",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_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",
|
||
type: "home",
|
||
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,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "nextUp",
|
||
type: "home",
|
||
name: "Next Up",
|
||
jellyfinId: "nextup",
|
||
enabled: false,
|
||
order: 16,
|
||
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,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "continueWatchingAndNextUp",
|
||
type: "home",
|
||
name: "Continue Watching",
|
||
description: "Resumable and Next Up items combined into one section",
|
||
jellyfinId: "resume",
|
||
jellyfinId2: "nextup",
|
||
enabled: false,
|
||
order: 11,
|
||
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,
|
||
itemLimit: 24,
|
||
queries: [
|
||
{
|
||
name: "Resume",
|
||
path: "/UserItems/Resume",
|
||
queryOptions: {
|
||
MediaTypes: "Video",
|
||
IncludeItemTypes: ["Movie"],
|
||
Fields: "PrimaryImageAspectRatio",
|
||
Limit: 12,
|
||
ImageTypeLimit: 1,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
{
|
||
name: "Next Up",
|
||
path: "/Shows/NextUp",
|
||
queryOptions: {
|
||
Fields: "PrimaryImageAspectRatio,DateCreated,Path,MediaSourceCount",
|
||
Limit: 24,
|
||
EnableResumable: "true",
|
||
ImageTypeLimit: 1,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "continueListening",
|
||
type: "home",
|
||
name: "Continue Listening",
|
||
jellyfinId: "resumeaudio",
|
||
enabled: false,
|
||
order: 12,
|
||
cardFormat: "Square",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/UserItems/Resume",
|
||
queryOptions: {
|
||
MediaTypes: "Audio",
|
||
Fields: "PrimaryImageAspectRatio",
|
||
Limit: 12,
|
||
ImageTypeLimit: 1,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "continueReading",
|
||
type: "home",
|
||
name: "Continue Reading",
|
||
jellyfinId: "resumebook",
|
||
enabled: false,
|
||
order: 13,
|
||
cardFormat: "Poster",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/UserItems/Resume",
|
||
queryOptions: {
|
||
MediaTypes: "Book",
|
||
Fields: "PrimaryImageAspectRatio",
|
||
Limit: 12,
|
||
ImageTypeLimit: 1,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
// Upcoming Group
|
||
{
|
||
id: "home-upcoming",
|
||
name: "Upcoming",
|
||
sections: [
|
||
{
|
||
id: "upcoming",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
name: "Recently Released Movies",
|
||
enabled: true,
|
||
order: 40,
|
||
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",
|
||
type: "home",
|
||
name: "Recently Aired Episodes",
|
||
enabled: true,
|
||
order: 41,
|
||
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",
|
||
type: "home",
|
||
name: "Recordings",
|
||
jellyfinId: "activerecordings",
|
||
enabled: false,
|
||
order: 17,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Recordings",
|
||
queryOptions: {
|
||
IsInProgress: true,
|
||
Fields: "PrimaryImageAspectRatio",
|
||
Limit: 12,
|
||
EnableTotalRecordCount: "false",
|
||
ImageTypeLimit: 1,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-timers",
|
||
type: "home",
|
||
name: "Scheduled Recordings",
|
||
enabled: false,
|
||
order: 17,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Timers",
|
||
queryOptions: {
|
||
IsActive: false,
|
||
IsScheduled: true,
|
||
Limit: 20,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-browse",
|
||
type: "home",
|
||
name: "Live TV",
|
||
jellyfinId: "livetv",
|
||
enabled: false,
|
||
order: 14,
|
||
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",
|
||
type: "home",
|
||
name: "On Now",
|
||
jellyfinId: "livetv",
|
||
enabled: false,
|
||
order: 15,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Programs/Recommended",
|
||
queryOptions: {
|
||
IsAiring: true,
|
||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||
Limit: 20,
|
||
ImageTypeLimit: 1,
|
||
EnableTotalRecordCount: "false",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-programs",
|
||
type: "home",
|
||
name: "Programs",
|
||
enabled: false,
|
||
order: 18,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.VERY_SHORT_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Programs",
|
||
queryOptions: {
|
||
Limit: 20,
|
||
SortBy: "Random",
|
||
HasAired: false,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-channels",
|
||
type: "home",
|
||
name: "Channels",
|
||
enabled: false,
|
||
order: 19,
|
||
cardFormat: "Square",
|
||
hideCardFooter: true,
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Channels",
|
||
queryOptions: {
|
||
Limit: 20,
|
||
SortBy: "Random",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-series-on-now",
|
||
type: "home",
|
||
name: "Shows From Live TV",
|
||
enabled: false,
|
||
order: 20,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_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",
|
||
type: "home",
|
||
name: "Movies From Live TV",
|
||
enabled: false,
|
||
order: 20,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Programs",
|
||
queryOptions: {
|
||
Limit: 10,
|
||
SortBy: "Random",
|
||
HasAired: false,
|
||
IsMovie: true,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-sports-on-now",
|
||
type: "home",
|
||
name: "Sports From Live TV",
|
||
enabled: false,
|
||
order: 20,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Programs",
|
||
queryOptions: {
|
||
Limit: 10,
|
||
SortBy: "Random",
|
||
HasAired: false,
|
||
IsSports: true,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-news-on-now",
|
||
type: "home",
|
||
name: "News From Live TV",
|
||
enabled: false,
|
||
order: 20,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_TTL,
|
||
userConfigurable: true,
|
||
queries: [
|
||
{
|
||
path: "/LiveTv/Programs",
|
||
queryOptions: {
|
||
Limit: 10,
|
||
SortBy: "Random",
|
||
HasAired: false,
|
||
IsNews: true,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "liveTv-kids-on-now",
|
||
type: "home",
|
||
name: "Kids From Live TV",
|
||
enabled: false,
|
||
order: 20,
|
||
cardFormat: "Thumb",
|
||
ttl: CACHE_CONFIG.FORCE_REFRESH_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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "home",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
name: "Halloween Episodes",
|
||
enabled: true,
|
||
userConfigurable: true,
|
||
startDate: "10-01",
|
||
endDate: "10-31",
|
||
order: 53,
|
||
cardFormat: "Thumb",
|
||
queries: [
|
||
{
|
||
queryOptions: {
|
||
SearchTerm: "halloween",
|
||
IncludeItemTypes: ["Episode"],
|
||
SortBy: "Random",
|
||
Limit: 20,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: "seasonal.halloween.halloween-pick-your-poison",
|
||
name: "Pick Your Poison",
|
||
enabled: true,
|
||
order: 54,
|
||
category: "none",
|
||
cardFormat: "Poster",
|
||
ttl: 604800000,
|
||
queries: [
|
||
{
|
||
name: "Psychological Horror",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["psychological horror"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
{
|
||
name: "Slasher",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["slasher"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
{
|
||
name: "Paranormal",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["paranormal"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
{
|
||
name: "Supernatural",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["supernatural"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
{
|
||
name: "Body Horror",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["body horror"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
{
|
||
name: "Cosmic Horror",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["cosmic horror"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
{
|
||
name: "Horror-Comedy",
|
||
queryOptions: {
|
||
IncludeItemTypes: ["Movie"],
|
||
Tags: ["comedy horror", "horror comedy"],
|
||
SortBy: "Random",
|
||
SortOrder: "Ascending",
|
||
Limit: 50
|
||
}
|
||
},
|
||
],
|
||
userConfigurable: true,
|
||
renderMode: "Normal",
|
||
discoveryEnabled: false,
|
||
type: "seasonal",
|
||
startDate: "10-01",
|
||
endDate: "10-31",
|
||
useRandomQuery: true,
|
||
useMultiQueryPicker: true,
|
||
multiQueryPickerLabel: "Pick Your Poison",
|
||
useQueryNamesForSection: true,
|
||
itemLimit: 16,
|
||
useGaplessCards: false,
|
||
useParentCard: false,
|
||
isCustom: true,
|
||
caption: "Suggested for the Halloween season"
|
||
}
|
||
],
|
||
},
|
||
// Seasonal Sections - Christmas
|
||
{
|
||
id: "seasonal-christmas",
|
||
name: "Christmas",
|
||
sections: [
|
||
{
|
||
id: "seasonal.christmas.christmas-movies",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
type: "seasonal",
|
||
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",
|
||
description: "Movies by genre",
|
||
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}",
|
||
description: "Top rated movies by genre",
|
||
enabled: true,
|
||
userConfigurable: true,
|
||
itemLimit: 20,
|
||
sortBy: "Random",
|
||
renderMode: "Spotlight",
|
||
ttl: CACHE_CONFIG.DISCOVERY_TTL,
|
||
queries: [
|
||
{
|
||
queryOptions: {
|
||
Recursive: true,
|
||
IncludeItemTypes: ["Movie"],
|
||
MinCommunityRating: 7.5,
|
||
Limit: 100,
|
||
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}",
|
||
description: "Movies directed by popular directors",
|
||
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}",
|
||
description: "Movies written by popular writers",
|
||
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}",
|
||
description: "Movies starring popular actors",
|
||
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}",
|
||
description: "Movies starring actors from your recently watched movies",
|
||
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}",
|
||
description: "Movies by directors from your recently watched movies",
|
||
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}",
|
||
description: "Movies by writers from your recently watched movies",
|
||
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}",
|
||
description: "Movies similar to the ones you've watched",
|
||
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}",
|
||
description: "Movies similar to the ones you've recently watched",
|
||
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}",
|
||
description: "Movies similar to the ones you've liked",
|
||
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",
|
||
description: "Movies similar to the ones 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}",
|
||
description: "Shows from popular studios",
|
||
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}",
|
||
description: "Top rated shows from popular studios",
|
||
enabled: true,
|
||
userConfigurable: true,
|
||
itemLimit: 20,
|
||
sortBy: "Random",
|
||
renderMode: "Spotlight",
|
||
ttl: CACHE_CONFIG.DISCOVERY_TTL,
|
||
queries: [
|
||
{
|
||
queryOptions: {
|
||
Recursive: true,
|
||
IncludeItemTypes: ["Series"],
|
||
MinCommunityRating: 7.5,
|
||
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}",
|
||
description: "Movies from franchise or curated collections",
|
||
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 Shows",
|
||
sections: [
|
||
{
|
||
id: "genreSeries",
|
||
type: "discovery",
|
||
discoveryType: "Genre",
|
||
discoveryItemType: "Series",
|
||
discoverySourceQuery: {
|
||
path: "/Genres",
|
||
queryOptions: { IncludeItemTypes: ["Series"], Limit: 0 },
|
||
},
|
||
name: "{Genre} Shows",
|
||
description: "Shows by genre",
|
||
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} Shows",
|
||
description: "Top rated shows by genre",
|
||
enabled: true,
|
||
userConfigurable: true,
|
||
itemLimit: 20,
|
||
sortBy: "Random",
|
||
renderMode: "Spotlight",
|
||
ttl: CACHE_CONFIG.DISCOVERY_TTL,
|
||
queries: [
|
||
{
|
||
queryOptions: {
|
||
Recursive: true,
|
||
IncludeItemTypes: ["Series"],
|
||
MinCommunityRating: 7.5,
|
||
Limit: 100,
|
||
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: 50,
|
||
},
|
||
},
|
||
name: "Because you watched {Title}",
|
||
description: "Shows similar to the ones you've watched",
|
||
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: ["Series"],
|
||
Recursive: true,
|
||
Fields: "UserData,People",
|
||
SortBy: "SeriesDatePlayed",
|
||
SortOrder: "Descending",
|
||
Limit: 10,
|
||
},
|
||
},
|
||
name: "Because you recently watched {Title}",
|
||
description: "Shows similar to the ones you've recently watched",
|
||
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}",
|
||
description: "Shows similar to the ones you've liked",
|
||
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",
|
||
description: "Shows similar to the ones 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: 25, SortBy: "Random" },
|
||
},
|
||
name: "Because you finished {Title}",
|
||
description: "Shows similar to the ones you've finished",
|
||
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}",
|
||
description: "Episodes directed by popular directors",
|
||
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}",
|
||
description: "Episodes written by popular writers",
|
||
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}",
|
||
description: "Shows starring popular actors",
|
||
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: ["Series"],
|
||
Recursive: true,
|
||
Fields: "UserData,People",
|
||
SortBy: "SeriesDatePlayed",
|
||
SortOrder: "Descending",
|
||
Limit: 10,
|
||
},
|
||
},
|
||
name: "Starring {Person}",
|
||
description: "Shows starring actors from shows you've recently watched",
|
||
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: 15,
|
||
},
|
||
},
|
||
name: "Directed by {Person}",
|
||
description: "Episodes by directors of your recently watched episodes",
|
||
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: 15,
|
||
},
|
||
},
|
||
name: "Written by {Person}",
|
||
description: "Episodes by writers of your recently watched episodes",
|
||
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: 15,
|
||
},
|
||
},
|
||
name: "Guest starring {Person}",
|
||
description: "Episodes guest starring popular actors",
|
||
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,
|
||
minStudioMovieCount: 50,
|
||
minStudioSeriesCount: 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: "corners",
|
||
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");
|
||
})();
|