Files
silo-server/internal/collections/templates/builtin.go
T
Silo Server Migration e37d753a0c Port collection templates with poster support and async syncs
- Add poster URLs through collection import and template apply flows
- Queue large template bundle syncs and preserve existing collection posters
- Update template bundle assets, docs, and limit handling
2026-05-23 12:31:08 -04:00

1884 lines
73 KiB
Go

package templates
// Built-in template catalog. Each entry pairs a curated source configuration
// with presentation metadata (icon, description, sync cadence). The IDs are
// stable strings so they can be referenced across the API and UI without
// drifting when descriptions are tweaked.
//
// Sync cadences favour conservative defaults — a heavy library does not need
// "Trending" to refresh more than every six hours, and TMDB rate-limits make
// hourly refreshes wasteful for shared servers.
const builtinDefaultLimit = 50
var builtinTemplates = []Template{
// ── Trending (TMDB) ─────────────────────────────────────────────────────
{
ID: "tmdb_trending_all_today",
Title: "Trending Today (All)",
Description: "Movies and TV shows trending across TMDB in the last 24 hours.",
Icon: "🔥",
Category: CategoryTrending,
Source: SourceTMDB,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 */6 * * *",
Featured: true,
Tags: []string{"daily", "discovery"},
TMDB: &TMDBSpec{Preset: "trending", MediaType: "all", TimeWindow: "day"},
},
{
ID: "tmdb_trending_movies_week",
Title: "Trending Movies This Week",
Description: "Top trending movies on TMDB over the past seven days.",
Icon: "🎬",
Category: CategoryTrending,
Source: SourceTMDB,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
Featured: true,
TMDB: &TMDBSpec{Preset: "trending", MediaType: "movie", TimeWindow: "week"},
},
{
ID: "tmdb_trending_tv_week",
Title: "Trending TV This Week",
Description: "Top trending TV shows on TMDB over the past seven days.",
Icon: "📺",
Category: CategoryTrending,
Source: SourceTMDB,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
Featured: true,
TMDB: &TMDBSpec{Preset: "trending", MediaType: "tv", TimeWindow: "week"},
},
{
ID: "trakt_trending_movies",
Title: "Trakt Trending Movies",
Description: "Movies with the most active watchers on Trakt right now.",
Icon: "📈",
Category: CategoryTrending,
Source: SourceTrakt,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 */6 * * *",
Trakt: &TraktSpec{Preset: "trending", MediaType: "movie"},
},
{
ID: "trakt_trending_shows",
Title: "Trakt Trending Shows",
Description: "Shows with the most active watchers on Trakt right now.",
Icon: "📈",
Category: CategoryTrending,
Source: SourceTrakt,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 */6 * * *",
Trakt: &TraktSpec{Preset: "trending", MediaType: "tv"},
},
// ── Popular ────────────────────────────────────────────────────────────
{
ID: "tmdb_popular_movies",
Title: "Popular Movies",
Description: "Perennial favourites ranked by TMDB's popularity score.",
Icon: "⭐",
Category: CategoryPopular,
Source: SourceTMDB,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 4 * * *",
TMDB: &TMDBSpec{Preset: "popular", MediaType: "movie"},
},
{
ID: "tmdb_popular_tv",
Title: "Popular TV Shows",
Description: "Perennial favourites ranked by TMDB's popularity score.",
Icon: "⭐",
Category: CategoryPopular,
Source: SourceTMDB,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 4 * * *",
TMDB: &TMDBSpec{Preset: "popular", MediaType: "tv"},
},
{
ID: "trakt_popular_movies",
Title: "Trakt Popular Movies",
Description: "Trakt's all-time most-watched movies.",
Icon: "🌟",
Category: CategoryPopular,
Source: SourceTrakt,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 4 * * *",
Trakt: &TraktSpec{Preset: "popular", MediaType: "movie"},
},
{
ID: "trakt_popular_shows",
Title: "Trakt Popular Shows",
Description: "Trakt's all-time most-watched shows.",
Icon: "🌟",
Category: CategoryPopular,
Source: SourceTrakt,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 4 * * *",
Trakt: &TraktSpec{Preset: "popular", MediaType: "tv"},
},
// ── Top Rated ──────────────────────────────────────────────────────────
{
ID: "tmdb_top_rated_movies",
Title: "Top Rated Movies",
Description: "TMDB's highest-rated movies of all time.",
Icon: "🏆",
Category: CategoryTopRated,
Source: SourceTMDB,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
TMDB: &TMDBSpec{Preset: "top_rated", MediaType: "movie"},
},
{
ID: "tmdb_top_rated_tv",
Title: "Top Rated TV",
Description: "TMDB's highest-rated TV shows of all time.",
Icon: "🏆",
Category: CategoryTopRated,
Source: SourceTMDB,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
TMDB: &TMDBSpec{Preset: "top_rated", MediaType: "tv"},
},
// ── In Theaters / Now Playing ──────────────────────────────────────────
{
ID: "tmdb_now_playing",
Title: "Now Playing in Theaters",
Description: "Movies currently playing in theatrical release.",
Icon: "🎟️",
Category: CategoryInTheaters,
Source: SourceTMDB,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * *",
TMDB: &TMDBSpec{Preset: "now_playing", MediaType: "movie"},
},
// ── Upcoming ───────────────────────────────────────────────────────────
{
ID: "tmdb_upcoming",
Title: "Upcoming Movies",
Description: "Theatrical releases coming soon, sourced from TMDB.",
Icon: "🗓️",
Category: CategoryUpcoming,
Source: SourceTMDB,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * *",
TMDB: &TMDBSpec{Preset: "upcoming", MediaType: "movie"},
},
// ── Airing TV ──────────────────────────────────────────────────────────
{
ID: "tmdb_airing_today",
Title: "Airing Today",
Description: "TV shows broadcasting new episodes today.",
Icon: "📡",
Category: CategoryAiring,
Source: SourceTMDB,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 */6 * * *",
TMDB: &TMDBSpec{Preset: "airing_today", MediaType: "tv"},
},
{
ID: "tmdb_on_the_air",
Title: "On The Air This Week",
Description: "TV shows airing new episodes within the week.",
Icon: "📺",
Category: CategoryAiring,
Source: SourceTMDB,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * *",
TMDB: &TMDBSpec{Preset: "on_the_air", MediaType: "tv"},
},
// ── Editorial / Profile-personalised ───────────────────────────────────
{
ID: "trakt_recommended_movies",
Title: "Trakt Recommended Movies",
Description: "Personalised movie picks for a connected Trakt profile.",
Icon: "🎯",
Category: CategoryEditorial,
Source: SourceTrakt,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 7 * * *",
RequiresProfile: true,
Trakt: &TraktSpec{Preset: "recommended", MediaType: "movie"},
},
{
ID: "trakt_recommended_shows",
Title: "Trakt Recommended Shows",
Description: "Personalised show picks for a connected Trakt profile.",
Icon: "🎯",
Category: CategoryEditorial,
Source: SourceTrakt,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 7 * * *",
RequiresProfile: true,
Trakt: &TraktSpec{Preset: "recommended", MediaType: "tv"},
},
// ── Streaming Services (MDBList, community-curated) ────────────────────
// These point at top-ranked public lists from the MDBList /toplists/ page.
// They are user-maintained, so the URLs may eventually be retired by the
// list owner; if that happens the import will fail loudly during sync and
// the template can be retired or repointed in this file.
{
ID: "mdblist_netflix_movies",
Title: "Netflix Movies",
Description: "Movies currently available on Netflix (community-maintained MDBList).",
Icon: "🅽",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/netflix-movies/json"},
},
{
ID: "mdblist_netflix_shows",
Title: "Netflix Shows",
Description: "TV shows currently available on Netflix (community-maintained MDBList).",
Icon: "🅽",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/netflix-shows/json"},
},
{
ID: "mdblist_disney_movies",
Title: "Disney+ Movies",
Description: "Movies currently available on Disney+ (community-maintained MDBList).",
Icon: "🏰",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/disney-movies/json"},
},
{
ID: "mdblist_disney_shows",
Title: "Disney+ Shows",
Description: "TV shows currently available on Disney+ (community-maintained MDBList).",
Icon: "🏰",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/disney-shows/json"},
},
{
ID: "mdblist_hbo_shows",
Title: "HBO Shows",
Description: "TV shows currently on HBO/Max (community-maintained MDBList).",
Icon: "🎭",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/hbo-shows/json"},
},
{
ID: "mdblist_amazon_movies",
Title: "Amazon Prime Movies",
Description: "Movies on Amazon Prime Video (community-maintained MDBList).",
Icon: "📦",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/amazon-prime-movies/json"},
},
{
ID: "mdblist_amazon_shows",
Title: "Amazon Prime Shows",
Description: "TV shows on Amazon Prime Video (community-maintained MDBList).",
Icon: "📦",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/amazon-prime-shows/json"},
},
{
ID: "mdblist_hulu_shows",
Title: "Hulu Shows",
Description: "TV shows on Hulu (community-maintained MDBList).",
Icon: "🟢",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/garycrawfordgc/hulu-shows/json"},
},
// ── Top Rated (MDBList: IMDb Top 250) ──────────────────────────────────
{
ID: "mdblist_imdb_top_250_movies",
Title: "IMDb Top 250 Movies",
Description: "The IMDb Top 250 movies list, kept in sync from MDBList.",
Icon: "🥇",
Category: CategoryTopRated,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/snoak/imdb-top-250-movies/json"},
},
{
ID: "mdblist_imdb_top_250_shows",
Title: "IMDb Top 250 Shows",
Description: "The IMDb Top 250 TV shows list, kept in sync from MDBList.",
Icon: "🥇",
Category: CategoryTopRated,
Source: SourceMDBList,
MediaKind: MediaTV,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/snoak/imdb-top-250-shows/json"},
},
// ── Editorial (MDBList: hand-picked themes) ────────────────────────────
{
ID: "mdblist_mindfuck_movies",
Title: "Mindfuck Movies",
Description: "Twist-heavy and reality-bending movies, curated on MDBList by hdlists.",
Icon: "🌀",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/hdlists/mindfuck-movies/json"},
},
{
ID: "mdblist_top_documentaries",
Title: "Top Documentary Movies",
Description: "Top-rated documentaries from 1980 to today (MDBList by hdlists).",
Icon: "🎥",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
MDBList: &MDBListSpec{
URL: "https://mdblist.com/lists/hdlists/latest-hd-documentary-movies-1980-to-today/json",
},
},
{
ID: "mdblist_top_horror",
Title: "Top Horror Movies",
Description: "Top-rated horror from 1980 to today (MDBList by hdlists).",
Icon: "👻",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 5 * * 0",
MDBList: &MDBListSpec{
URL: "https://mdblist.com/lists/hdlists/latest-hd-horror-movies-top-rated-from-1980-to-today/json",
},
},
// ── Streaming Originals (MDBList, Kometa-curated) ──────────────────────
// Phase-1 templates that mirror the PMM `movies_streaming` and
// `shows_streaming` originals sets. Lists come from MDBList user
// `k0meta` (the Kometa team) so the data ages well alongside PMM users
// who already trust that source. Default sort orders land in the 4000s
// band, sequenced alphabetically by service name so the gallery shows a
// predictable column ordering.
{
ID: "mdblist_streaming_apple_tv_plus",
Title: "Apple TV+",
Description: "Apple TV+ originals across films and series, curated by the Kometa team on MDBList.",
Icon: "🍎",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4001,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/appletv-originals/json"},
},
{
ID: "mdblist_streaming_disney_plus_originals",
Title: "Disney+ Originals",
Description: "Disney+ originals across films and series, curated by the Kometa team on MDBList.",
Icon: "🏰",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4002,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/disney-originals/json"},
},
{
ID: "mdblist_streaming_hbo_max_originals",
Title: "HBO Max Originals",
Description: "Max (formerly HBO Max) originals across films and series, curated by the Kometa team on MDBList.",
Icon: "🎭",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4003,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/max-originals/json"},
},
{
ID: "mdblist_streaming_hulu_originals",
Title: "Hulu Originals",
Description: "Hulu originals across films and series, curated by the Kometa team on MDBList.",
Icon: "🟢",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4004,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/hulu-originals/json"},
},
{
ID: "mdblist_streaming_netflix_originals",
Title: "Netflix Originals",
Description: "Netflix-produced films and series, curated by the Kometa team on MDBList.",
Icon: "🅽",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4005,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/netflix-originals/json"},
},
{
ID: "mdblist_streaming_peacock_originals",
Title: "Peacock Originals",
Description: "Peacock originals across films and series, curated by the Kometa team on MDBList.",
Icon: "🦚",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4006,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/peacock-originals/json"},
},
{
ID: "mdblist_streaming_prime_video_originals",
Title: "Prime Video Originals",
Description: "Amazon Prime Video originals across films and series, curated by the Kometa team on MDBList.",
Icon: "📦",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4007,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/amazon-originals/json"},
},
{
ID: "mdblist_streaming_shudder",
Title: "Shudder",
Description: "Recent horror and thriller titles available on Shudder (MDBList by snoak).",
Icon: "🩸",
Category: CategoryStreaming,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 4008,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/snoak/latest-shudder-movies/json"},
},
// ── Awards (MDBList) ───────────────────────────────────────────────────
// Sorted within the 3000s band so awards land between Best-of-Year
// (2000s) and Streaming Originals (4000s) in apply-time sort_order.
{
ID: "mdblist_awards_oscar_winners",
Title: "Oscar Winners",
Description: "Academy Award winners across categories, sourced from MDBList (atalante421).",
Icon: "🏆",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 3001,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"awards", "oscars"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/atalante421/oscar-winners/json"},
},
{
ID: "mdblist_awards_golden_globes_winners",
Title: "Golden Globes Winners",
Description: "Golden Globe winning films across categories, sourced from MDBList (atalante421).",
Icon: "🏆",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 3002,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"awards", "golden-globes"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/atalante421/golden-globe-winners/json"},
},
// ── Best of Year (MDBList) ─────────────────────────────────────────────
// Year-specific best-of lists drawn from siskourso's Rotten-Tomatoes
// roll-ups. Only the years with active public lists ship; older years
// (2018-2022) had no maintained equivalent on MDBList at template
// authoring time and are intentionally skipped — see Phase-1 report.
{
ID: "mdblist_best_of_2023",
Title: "Best of 2023",
Description: "Top-rated 2023 releases from Rotten Tomatoes' end-of-year picks (MDBList by siskourso).",
Icon: "📅",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 2023,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"best-of-year"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/siskourso/rotten-tomatoes-best-of-2023/json"},
},
{
ID: "mdblist_best_of_2024",
Title: "Best of 2024",
Description: "Top-rated 2024 releases from Rotten Tomatoes' end-of-year picks (MDBList by siskourso).",
Icon: "📅",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 2024,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"best-of-year"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/siskourso/rotten-tomatoes-best-of-2024-ed84tni24k/json"},
},
{
ID: "mdblist_best_of_2025",
Title: "Best of 2025",
Description: "Top-rated 2025 releases from Rotten Tomatoes' end-of-year picks (MDBList by siskourso).",
Icon: "📅",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 2025,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"best-of-year"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/siskourso/rotten-tomatoes-best-of-2025/json"},
},
// ── Charts (MDBList) ───────────────────────────────────────────────────
// 1000s band. "Top Rated Movies" is already covered by the existing
// `mdblist_imdb_top_250_movies` template under CategoryTopRated, so this
// chart only contributes a Popular-Movies entry.
{
ID: "mdblist_charts_popular_movies",
Title: "Popular Movies",
Description: "IMDb MovieMeter's most-popular movies right now, kept in sync from MDBList (linaspurinis).",
Icon: "📊",
Category: CategoryPopular,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 1001,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"chart"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/linaspurinis/imdb-moviemeter-top-100/json"},
},
// ── Seasonal / Holiday (MDBList) ───────────────────────────────────────
// 8000s band. Most entries source from `fuzi0n` for a consistent
// curatorial style across the holidays they cover. Heritage-month
// entries come from `k0meta`. Several PMM seasonal entries
// (St. Patrick's Day, Independence Day, Black History Month, Women's
// History Month) had no MDBList equivalent and are skipped — see
// Phase-1 report.
{
ID: "mdblist_seasonal_halloween",
Title: "Halloween",
Description: "A deep cut of Halloween-coded horror and family fright (MDBList by fuzi0n).",
Icon: "🎃",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8001,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "holiday"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/fuzi0n/halloween-movies/json"},
},
{
ID: "mdblist_seasonal_christmas",
Title: "Christmas",
Description: "Christmas-themed movies for the holiday season (MDBList by fuzi0n).",
Icon: "🎄",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8002,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "holiday"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/fuzi0n/christmas-movies/json"},
},
{
ID: "mdblist_seasonal_valentines_day",
Title: "Valentine's Day",
Description: "Romance films for Valentine's Day viewing (MDBList by fuzi0n).",
Icon: "❤️",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8003,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "holiday"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/fuzi0n/valentines-day-movies/json"},
},
{
ID: "mdblist_seasonal_easter",
Title: "Easter",
Description: "Easter-season films across family and reflective titles (MDBList by fuzi0n).",
Icon: "🐣",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8004,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "holiday"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/fuzi0n/easter-movies/json"},
},
{
ID: "mdblist_seasonal_thanksgiving",
Title: "Thanksgiving",
Description: "Thanksgiving-themed films for the long-weekend rotation (MDBList by fuzi0n).",
Icon: "🦃",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8005,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "holiday"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/fuzi0n/thanksgiving-movies/json"},
},
{
ID: "mdblist_seasonal_new_year",
Title: "New Year",
Description: "Films set around New Year's Eve and the turn of the year (MDBList by fuzi0n).",
Icon: "🎆",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8006,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "holiday"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/fuzi0n/new-years-movies/json"},
},
{
ID: "mdblist_seasonal_aapi_heritage_month",
Title: "AAPI Heritage Month",
Description: "Films and series highlighting Asian American and Pacific Islander voices (MDBList by k0meta).",
Icon: "🌸",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8007,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "heritage"},
MDBList: &MDBListSpec{
URL: "https://mdblist.com/lists/k0meta/asian-american-pacific-islander-heritage-month/json",
},
},
{
ID: "mdblist_seasonal_latinx_heritage_month",
Title: "Latinx Heritage Month",
Description: "Films and series celebrating Latinx storytellers and themes (MDBList by k0meta).",
Icon: "🌶️",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8008,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "heritage"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/k0meta/latinx-heritage-month/json"},
},
{
ID: "mdblist_seasonal_pride_month",
Title: "Pride Month",
Description: "Recent LGBTQ-led films and series — the closest available MDBList proxy for Pride Month (by apollocat).",
Icon: "🏳️‍🌈",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 8009,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"seasonal", "heritage", "pride"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/apollocat/new-in-lgbtq/json"},
},
// ── Editorial / Misc (MDBList) ─────────────────────────────────────────
// 9000s band. Studio and distributor catalogs the operator's PMM
// `movies_misc` set typically includes.
{
ID: "mdblist_misc_criterion_collection",
Title: "Criterion Collection",
Description: "The complete Criterion Collection of films, kept in sync from MDBList (shtluck).",
Icon: "🎞️",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 9001,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"editorial", "studio"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/shtluck/the-complete-criterion-collection/json"},
},
{
ID: "mdblist_misc_a24",
Title: "A24",
Description: "Films distributed by A24, kept in sync from MDBList (irvingbeano).",
Icon: "🎬",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 9002,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"editorial", "studio"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/irvingbeano/a24/json"},
},
{
ID: "mdblist_misc_ifc_films",
Title: "IFC Films",
Description: "IFC Films catalog spanning movies and series (MDBList by notamongo5).",
Icon: "🎬",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 9003,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"editorial", "studio"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/notamongo5/ifc/json"},
},
{
ID: "mdblist_misc_studio_ghibli",
Title: "Studio Ghibli",
Description: "Studio Ghibli's animated feature catalog, kept in sync from MDBList (jukebox8786).",
Icon: "🐉",
Category: CategoryEditorial,
Source: SourceMDBList,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 9004,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"editorial", "studio"},
MDBList: &MDBListSpec{URL: "https://mdblist.com/lists/jukebox8786/studio-ghibli-anime/json"},
},
// ── Custom MDBList ─────────────────────────────────────────────────────
// "Bring your own URL" template that opens the standard MDBList import
// form so admins can paste any public list URL. Operators who want their
// own curated MDBList templates can register additional Template values
// against the Default registry at startup.
{
ID: "mdblist_custom",
Title: "Custom MDBList",
Description: "Paste any public MDBList JSON URL to seed a synced collection.",
Icon: "📋",
Category: CategoryCustom,
Source: SourceMDBList,
MediaKind: MediaMixed,
DefaultLimit: builtinDefaultLimit,
DefaultSyncSchedule: "0 6 * * *",
MDBList: &MDBListSpec{URL: ""},
},
// ── Popular by Genre (TMDB Discover) ─────────────────────────────────────
// 5000s band. Each entry runs TMDB's /discover/movie endpoint sorted by
// popularity.desc with a 300-vote floor to keep emerging-but-thin titles
// from polluting the top of the list. Daily refresh at 04:00 matches the
// existing tmdb_popular_* cadence.
{
ID: "tmdb_discover_popular_action",
Title: "Popular Action",
Description: "Crowd-pleasing action films sorted by current TMDB popularity.",
Icon: "💥",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5001,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{28},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_adventure",
Title: "Popular Adventure",
Description: "Trending adventure movies driving the most TMDB attention right now.",
Icon: "🗺️",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5002,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{12},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_animation",
Title: "Popular Animation",
Description: "Animated features riding high on TMDB popularity, from family fare to adult animation.",
Icon: "🎨",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5003,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{16},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_comedy",
Title: "Popular Comedy",
Description: "Comedies pulling the most viewers across TMDB this week.",
Icon: "😂",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5004,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{35},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_crime",
Title: "Popular Crime",
Description: "Heists, mobsters, and procedurals dominating TMDB's crime charts.",
Icon: "🕵️",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5005,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{80},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_documentary",
Title: "Popular Documentary",
Description: "Most-watched documentary features on TMDB right now.",
Icon: "🎥",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5006,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{99},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_drama",
Title: "Popular Drama",
Description: "Drama films riding the top of TMDB's popularity rankings.",
Icon: "🎭",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5007,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{18},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_family",
Title: "Popular Family",
Description: "Family-friendly hits with the biggest current TMDB audience.",
Icon: "👨‍👩‍👧",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5008,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10751},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_fantasy",
Title: "Popular Fantasy",
Description: "Magic, myths, and quests — the fantasy slate trending on TMDB.",
Icon: "🧙",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5009,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{14},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_history",
Title: "Popular History",
Description: "Historical dramas and period pieces ranked by TMDB popularity.",
Icon: "🏛️",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5010,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{36},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_horror",
Title: "Popular Horror",
Description: "The horror titles drawing the biggest TMDB crowds right now.",
Icon: "👻",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5011,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{27},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_music",
Title: "Popular Music",
Description: "Music biopics, concert films, and musicals climbing TMDB's charts.",
Icon: "🎵",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5012,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10402},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_mystery",
Title: "Popular Mystery",
Description: "Whodunits and puzzlers with the most active TMDB audience.",
Icon: "🔍",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5013,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{9648},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_romance",
Title: "Popular Romance",
Description: "Love stories pulling the most viewers across TMDB's romance shelf.",
Icon: "💞",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5014,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10749},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_science_fiction",
Title: "Popular Science Fiction",
Description: "Sci-fi blockbusters and cult favourites sorted by TMDB heat.",
Icon: "🚀",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5015,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{878},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_thriller",
Title: "Popular Thriller",
Description: "Tense, fast-moving thrillers ranked by current TMDB popularity.",
Icon: "🗡️",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5016,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{53},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_war",
Title: "Popular War",
Description: "War films and combat dramas trending on TMDB this week.",
Icon: "⚔️",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5017,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10752},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
{
ID: "tmdb_discover_popular_western",
Title: "Popular Western",
Description: "Westerns drawing the most TMDB attention, from classics to revisionist tales.",
Icon: "🤠",
Category: CategoryPopular,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 5018,
DefaultSyncSchedule: "0 4 * * *",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{37},
SortBy: "popularity.desc",
VoteCountGte: 300,
},
},
// ── Top Rated by Genre (TMDB Discover) ───────────────────────────────────
// 6000s band. Sorted by vote_average.desc with a 1000-vote floor — high
// enough to filter out fluke perfect scores while still leaving room for
// well-regarded mid-tier titles. Refresh weekly on Sunday at 05:00.
{
ID: "tmdb_discover_top_rated_action",
Title: "Top Rated Action",
Description: "The highest-scoring action films on TMDB with enough votes to count.",
Icon: "💥",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6001,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{28},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_adventure",
Title: "Top Rated Adventure",
Description: "Best-reviewed adventure films across TMDB, weighted by user votes.",
Icon: "🗺️",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6002,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{12},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_animation",
Title: "Top Rated Animation",
Description: "The animated films TMDB users score highest, from Pixar to anime.",
Icon: "🎨",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6003,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{16},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_comedy",
Title: "Top Rated Comedy",
Description: "The best-rated comedies on TMDB, surfacing classics over flash-in-the-pan hits.",
Icon: "😂",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6004,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{35},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_crime",
Title: "Top Rated Crime",
Description: "The most acclaimed crime films on TMDB, gathered by user vote.",
Icon: "🕵️",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6005,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{80},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_documentary",
Title: "Top Rated Documentary",
Description: "Documentaries with the strongest TMDB scores and a solid vote count.",
Icon: "🎥",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6006,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{99},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_drama",
Title: "Top Rated Drama",
Description: "TMDB's best-rated dramas — character-led, story-first cinema.",
Icon: "🎭",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6007,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{18},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_family",
Title: "Top Rated Family",
Description: "Family films that earn TMDB's highest user scores.",
Icon: "👨‍👩‍👧",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6008,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10751},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_fantasy",
Title: "Top Rated Fantasy",
Description: "Fantasy films with the best TMDB ratings across the genre.",
Icon: "🧙",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6009,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{14},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_history",
Title: "Top Rated History",
Description: "The most acclaimed historical films on TMDB, sorted by vote average.",
Icon: "🏛️",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6010,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{36},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_horror",
Title: "Top Rated Horror",
Description: "The best-rated horror films on TMDB, vote-weighted to keep the bar honest.",
Icon: "👻",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6011,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{27},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_music",
Title: "Top Rated Music",
Description: "Music films that earn TMDB's strongest user reception, from biopics to musicals.",
Icon: "🎵",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6012,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10402},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_mystery",
Title: "Top Rated Mystery",
Description: "Mystery films with the highest TMDB scores and a healthy vote base.",
Icon: "🔍",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6013,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{9648},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_romance",
Title: "Top Rated Romance",
Description: "Romance films with TMDB's best-loved ratings and a real audience behind them.",
Icon: "💞",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6014,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10749},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_science_fiction",
Title: "Top Rated Science Fiction",
Description: "Science fiction films at the very top of TMDB's vote averages.",
Icon: "🚀",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6015,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{878},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_thriller",
Title: "Top Rated Thriller",
Description: "Thrillers that crowd the upper end of TMDB's vote averages.",
Icon: "🗡️",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6016,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{53},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_war",
Title: "Top Rated War",
Description: "The most acclaimed war films on TMDB, sorted by user vote average.",
Icon: "⚔️",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6017,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10752},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
{
ID: "tmdb_discover_top_rated_western",
Title: "Top Rated Western",
Description: "Westerns with the best TMDB scores, from classic horse operas to modern revisions.",
Icon: "🤠",
Category: CategoryTopRated,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 6018,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{37},
SortBy: "vote_average.desc",
VoteCountGte: 1000,
},
},
// ── Kids Movies (TMDB Discover) ──────────────────────────────────────────
// 9000s band (Misc/Kids slot). Combines TMDB's Family genre with a PG
// certification ceiling so the result tracks something an actual kid can
// watch, not just a soft-PG-13 family-marketed action film.
{
ID: "tmdb_discover_kids_movies",
Title: "Kids Movies",
Description: "Family-genre films capped at a PG certification — safe picks for younger viewers.",
Icon: "🧸",
Category: CategoryEditorial,
Source: SourceTMDBDiscover,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 9050,
DefaultSyncSchedule: "0 5 * * 0",
TMDBDiscover: &TMDBDiscoverSpec{
MediaType: "movie",
WithGenres: []int{10751},
SortBy: "popularity.desc",
CertificationLte: "PG",
VoteCountGte: 100,
},
},
// ── Franchises (TMDB Collection) ─────────────────────────────────────────
// 7000s band. Curated movie franchises that resolve to a TMDB
// `/collection/{id}` payload. Sort orders are sparsely allocated so
// future franchise additions can slot in without disturbing existing
// entries. The placeholder template at 7099 ships with CollectionID=0
// (a permitted sentinel — see validateTMDBCollection) and an empty sync
// schedule so applying it produces a collection the admin can edit
// before any sync runs.
//
// Two plan-listed franchises are intentionally absent because TMDB has
// no usable umbrella collection for them:
// - Marvel Cinematic Universe (plan ID 86311 resolves to "The
// Avengers Collection" — a 6-film subset, not the full MCU).
// - DC Extended Universe (plan ID 573436 resolves to "Spider-Man:
// Spider-Verse Collection" — completely unrelated; no DCEU
// umbrella exists on TMDB).
// Both are best surfaced via TMDB Discover company filters or MDBList
// in a follow-up; shipping a wrong ID would mis-populate the
// resulting collection.
{
ID: "tmdb_franchise_star_wars",
Title: "Star Wars Saga",
Description: "The Skywalker-era Star Wars feature films as catalogued by TMDB.",
Icon: "⚔️",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7002,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 10},
},
{
ID: "tmdb_franchise_james_bond",
Title: "James Bond",
Description: "Six decades of Eon Productions' James Bond films, tracked through TMDB's collection.",
Icon: "🕴️",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7003,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 645},
},
{
ID: "tmdb_franchise_wizarding_world",
Title: "Wizarding World",
Description: "The Harry Potter octalogy — TMDB's canonical Wizarding World grouping (Fantastic Beasts lives in a separate collection).",
Icon: "🪄",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7004,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 1241},
},
{
ID: "tmdb_franchise_fast_furious",
Title: "Fast & Furious",
Description: "Dom's family and every quarter-mile of the Fast & Furious main series.",
Icon: "🏎️",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7006,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 9485},
},
{
ID: "tmdb_franchise_lord_of_the_rings",
Title: "The Lord of the Rings",
Description: "Peter Jackson's three-part adaptation of Tolkien's Middle-earth epic.",
Icon: "💍",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7007,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 119},
},
{
ID: "tmdb_franchise_hobbit",
Title: "The Hobbit",
Description: "The Hobbit prequel trilogy, set in Middle-earth before the One Ring.",
Icon: "🗡️",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7008,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 121938},
},
{
ID: "tmdb_franchise_jurassic_park",
Title: "Jurassic Park",
Description: "Every entry in the Jurassic Park and Jurassic World dinosaur saga.",
Icon: "🦖",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7009,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 328},
},
{
ID: "tmdb_franchise_pirates_of_the_caribbean",
Title: "Pirates of the Caribbean",
Description: "Captain Jack Sparrow's swashbuckling Disney pirate cycle.",
Icon: "🏴‍☠️",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7010,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 295},
},
{
ID: "tmdb_franchise_mission_impossible",
Title: "Mission: Impossible",
Description: "Ethan Hunt and the IMF across the Mission: Impossible film series.",
Icon: "💼",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7011,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 87359},
},
{
ID: "tmdb_franchise_monsterverse",
Title: "MonsterVerse",
Description: "Legendary's MonsterVerse Godzilla titles — the closest TMDB collection to the Titans cycle.",
Icon: "👹",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7012,
DefaultSyncSchedule: "0 5 * * 0",
Tags: []string{"franchise"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 535313},
},
{
ID: "tmdb_franchise_placeholder",
Title: "TMDB Franchise",
Description: "Placeholder for any TMDB collection ID — apply this template via a bundle, then edit the resulting collection's source config to set the franchise ID.",
Icon: "🎞️",
Category: CategoryEditorial,
Source: SourceTMDBCollection,
MediaKind: MediaMovie,
DefaultLimit: builtinDefaultLimit,
DefaultSortOrder: 7099,
DefaultSyncSchedule: "",
Tags: []string{"franchise", "placeholder"},
TMDBCollection: &TMDBCollectionSpec{CollectionID: 0},
},
}
var builtinBundles = withAllDefaultsBundle([]Bundle{
{
ID: "core_defaults",
Title: "Core Defaults",
Description: "A focused starter set of movie and TV collections inspired by common Kometa libraries.",
TemplateIDs: []string{
"tmdb_trending_movies_week",
"tmdb_popular_movies",
"tmdb_top_rated_movies",
"tmdb_now_playing",
"tmdb_upcoming",
"mdblist_imdb_top_250_movies",
"mdblist_top_documentaries",
"mdblist_top_horror",
"mdblist_mindfuck_movies",
"tmdb_trending_tv_week",
"tmdb_popular_tv",
"tmdb_top_rated_tv",
"tmdb_airing_today",
"tmdb_on_the_air",
"mdblist_imdb_top_250_shows",
},
},
{
ID: "streaming_expanded",
Title: "Streaming Originals",
Description: "Provider-specific originals and specialty streaming shelves.",
TemplateIDs: []string{
"mdblist_streaming_apple_tv_plus",
"mdblist_streaming_disney_plus_originals",
"mdblist_streaming_hbo_max_originals",
"mdblist_streaming_hulu_originals",
"mdblist_streaming_netflix_originals",
"mdblist_streaming_peacock_originals",
"mdblist_streaming_prime_video_originals",
"mdblist_streaming_shudder",
},
},
{
ID: "awards_and_years",
Title: "Awards & Yearly Picks",
Description: "Oscar, Golden Globe, yearly best-of, and movie chart collections.",
TemplateIDs: []string{
"mdblist_awards_oscar_winners",
"mdblist_awards_golden_globes_winners",
"mdblist_best_of_2023",
"mdblist_best_of_2024",
"mdblist_best_of_2025",
"mdblist_charts_popular_movies",
},
},
{
ID: "seasonal_collections",
Title: "Seasonal Collections",
Description: "Holiday, observance, and calendar-driven collection shelves.",
TemplateIDs: []string{
"mdblist_seasonal_halloween",
"mdblist_seasonal_christmas",
"mdblist_seasonal_valentines_day",
"mdblist_seasonal_easter",
"mdblist_seasonal_thanksgiving",
"mdblist_seasonal_new_year",
"mdblist_seasonal_aapi_heritage_month",
"mdblist_seasonal_latinx_heritage_month",
"mdblist_seasonal_pride_month",
},
},
{
ID: "studio_collections",
Title: "Studios & Labels",
Description: "Curated studio, label, and collection-brand shelves.",
TemplateIDs: []string{
"mdblist_misc_criterion_collection",
"mdblist_misc_a24",
"mdblist_misc_ifc_films",
"mdblist_misc_studio_ghibli",
},
},
{
ID: "popular_genres",
Title: "Popular Genres",
Description: "TMDB Discover genre shelves sorted by current popularity.",
TemplateIDs: []string{
"tmdb_discover_popular_action",
"tmdb_discover_popular_adventure",
"tmdb_discover_popular_animation",
"tmdb_discover_popular_comedy",
"tmdb_discover_popular_crime",
"tmdb_discover_popular_documentary",
"tmdb_discover_popular_drama",
"tmdb_discover_popular_family",
"tmdb_discover_popular_fantasy",
"tmdb_discover_popular_history",
"tmdb_discover_popular_horror",
"tmdb_discover_popular_music",
"tmdb_discover_popular_mystery",
"tmdb_discover_popular_romance",
"tmdb_discover_popular_science_fiction",
"tmdb_discover_popular_thriller",
"tmdb_discover_popular_war",
"tmdb_discover_popular_western",
"tmdb_discover_kids_movies",
},
},
{
ID: "top_rated_genres",
Title: "Top Rated Genres",
Description: "TMDB Discover genre shelves sorted by vote average with vote floors.",
TemplateIDs: []string{
"tmdb_discover_top_rated_action",
"tmdb_discover_top_rated_adventure",
"tmdb_discover_top_rated_animation",
"tmdb_discover_top_rated_comedy",
"tmdb_discover_top_rated_crime",
"tmdb_discover_top_rated_documentary",
"tmdb_discover_top_rated_drama",
"tmdb_discover_top_rated_family",
"tmdb_discover_top_rated_fantasy",
"tmdb_discover_top_rated_history",
"tmdb_discover_top_rated_horror",
"tmdb_discover_top_rated_music",
"tmdb_discover_top_rated_mystery",
"tmdb_discover_top_rated_romance",
"tmdb_discover_top_rated_science_fiction",
"tmdb_discover_top_rated_thriller",
"tmdb_discover_top_rated_war",
"tmdb_discover_top_rated_western",
},
},
{
ID: "franchise_collections",
Title: "Franchise Collections",
Description: "TMDB franchise and saga collections for major movie series.",
TemplateIDs: []string{
"tmdb_franchise_star_wars",
"tmdb_franchise_james_bond",
"tmdb_franchise_wizarding_world",
"tmdb_franchise_fast_furious",
"tmdb_franchise_lord_of_the_rings",
"tmdb_franchise_hobbit",
"tmdb_franchise_jurassic_park",
"tmdb_franchise_pirates_of_the_caribbean",
"tmdb_franchise_mission_impossible",
"tmdb_franchise_monsterverse",
"tmdb_franchise_placeholder",
},
},
})
func withAllDefaultsBundle(bundles []Bundle) []Bundle {
seen := make(map[string]struct{})
allTemplateIDs := make([]string, 0)
for _, bundle := range bundles {
for _, id := range bundle.TemplateIDs {
if _, ok := seen[id]; ok {
continue
}
seen[id] = struct{}{}
allTemplateIDs = append(allTemplateIDs, id)
}
}
allDefaults := Bundle{
ID: "all_defaults",
Title: "All Defaults",
Description: "Every default bulk-add template, including core, streaming, awards, seasonal, genre, and franchise collections.",
TemplateIDs: allTemplateIDs,
}
out := make([]Bundle, 0, len(bundles)+1)
out = append(out, allDefaults)
out = append(out, bundles...)
return out
}
func init() {
for _, t := range builtinTemplates {
if t.PosterPath == "" {
t.PosterPath = defaultPosterPath(t.ID)
}
Default.Register(t)
}
for _, b := range builtinBundles {
Default.RegisterBundle(b)
}
}
func defaultPosterPath(templateID string) string {
if templateID == "" {
return ""
}
return "/images/collection-templates/" + templateID + ".jpg"
}