Add Finished Books feature with episode playlists

- New FinishedBook type in content.ts + finishedBooks[] field on SiteContent
- RSS parser now extracts itunes:season into each episode object
- /finished grid page and /finished/:id playlist page (filters episodes by season)
- Episodes nav link replaced with dropdown: Current Series / Finished Books
- Finished Books link added to footer
- Admin: "End Current Series & Start New Book" wizard on Current Series tab
- Admin: Finished Books management tab (add/edit/remove entries)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 4.6 committed 2026-06-30 10:22:37 -04:00
1 parent a8f6024234
commit 2eb98b66d0
5 files changed
+576 -470

No files matched your search

+11 -31
View File
@@ -47,35 +47,6 @@ export interface WhereToNextCard {
path: string
}
export interface ArchivedSeriesResourceLink {
id: string
label: string
description?: string
url: string
amazonUrl?: string
amazonLabel?: string
}
export interface ArchivedSeriesNote {
id: string
heading: string
body: string
}
export interface ArchivedSeries {
id: string
label: string
title: string
description: string
imageUrl: string
listenUrl: string
studyGuideTitle: string
studyGuideDescription: string
studyGuideUrl: string
resourceLinks: ArchivedSeriesResourceLink[]
notes: ArchivedSeriesNote[]
episodeRange?: { from: number; to: number }
}
export interface RedirectRule {
id: string
@@ -95,6 +66,14 @@ export interface PodcastFeaturedLink {
discussionQuestions?: string[]
}
export interface FinishedBook {
id: string
title: string
description: string
imageUrl: string
season: number
}
export interface SeoSettings {
title: string
description: string
@@ -260,13 +239,14 @@ export interface SiteContent {
// ── Arrays ──
customLinks: CustomLink[]
customBlocks: CustomBlock[]
archivedSeries: ArchivedSeries[]
redirects: RedirectRule[]
podcastFeaturedLinks: PodcastFeaturedLink[]
seo: SeoSettings
legal: LegalSettings
// ── Episodes page ──
episodesSeoIntro: string
// ── Finished Books ──
finishedBooks: FinishedBook[]
}
export const DEFAULTS: SiteContent = {
@@ -445,7 +425,6 @@ export const DEFAULTS: SiteContent = {
cookieBannerText: 'We use optional analytics cookies to better understand how people find and engage with this content. By accepting, you allow us to measure how you interact with the site — no personal data is sold or shared.',
customLinks: [],
customBlocks: [],
archivedSeries: [],
redirects: [
{
id: 'spotify',
@@ -467,6 +446,7 @@ export const DEFAULTS: SiteContent = {
},
],
podcastFeaturedLinks: [],
finishedBooks: [],
episodesSeoIntro: 'Verse by Verse with Nate is an expository Bible teaching podcast where we go through Scripture one verse at a time. Each episode digs into the text carefully and practically, helping you understand what the Bible says, what it means, and how to live it out. New episodes released regularly — subscribe on Spotify or your favorite podcast platform.',
seo: {
title: 'Verse by Verse with Nate',