Add Nuggets to global search and RSS-sourced scripture refs to index; v2.0.26
Publish Container / docker (push) Successful in 15m20s

- Raise RSS description truncation from 220 → 800 chars so scripture
  references in episode descriptions are preserved
- Global search now indexes Nuggets podcast episodes from
  /api/nuggets/episodes/all (title, subtitle, description via Fuse)
- Scripture Index (/api/public/scripture-index) now extracts verse
  references from both main podcast and Nuggets RSS descriptions
  using a regex built from the shared BIBLE_BOOKS list; duplicate refs
  across sources are merged by the existing client-side dedup logic
- Export fetchNuggetsEpisodes from nuggets.js for reuse

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 4.6 committed 2026-09-17 10:27:12 -04:00
1 parent 590885f6b1
commit 1ddb8ee7be
5 files changed
+77 -5

No files matched your search

+20 -1
View File
@@ -35,6 +35,7 @@ export function useGlobalSearch(content: SiteContent) {
const [query, setQuery] = useState('')
const [questions, setQuestions] = useState<PublicQuestion[]>([])
const [episodeItems, setEpisodeItems] = useState<SearchResult[]>([])
const [nuggetsItems, setNuggetsItems] = useState<SearchResult[]>([])
const [scriptResults, setScriptResults] = useState<SearchResult[]>([])
const scriptDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)
@@ -75,6 +76,24 @@ export function useGlobalSearch(content: SiteContent) {
.catch(() => {})
}, [content.podcastFeaturedLinks])
// Fetch nuggets episodes once on mount
useEffect(() => {
fetch('/api/nuggets/episodes/all')
.then(r => r.ok ? r.json() : Promise.reject())
.then((data: { episodes?: Array<{ title: string; link: string; description?: string; episode?: string }> }) => {
const eps: SearchResult[] = (data.episodes ?? []).map(ep => ({
id: `nuggets-${ep.episode ?? ep.title}`,
type: 'episode' as const,
title: ep.title,
subtitle: ep.episode ? `Nuggets Ep. ${ep.episode}` : 'Nuggets',
description: ep.description,
href: '/nuggets',
}))
setNuggetsItems(eps)
})
.catch(() => {})
}, [])
// Debounced server-side script search — runs whenever query changes
useEffect(() => {
if (scriptDebounceRef.current) clearTimeout(scriptDebounceRef.current)
@@ -132,7 +151,7 @@ export function useGlobalSearch(content: SiteContent) {
return results
}, [content, questions])
const allFuseItems = useMemo(() => [...episodeItems, ...staticItems], [episodeItems, staticItems])
const allFuseItems = useMemo(() => [...episodeItems, ...nuggetsItems, ...staticItems], [episodeItems, nuggetsItems, staticItems])
const fuse = useMemo(() => new Fuse(allFuseItems, {
keys: [