Make all site content editable from admin; add per-page content blocks
This commit is contained in:
@@ -2003,7 +2003,7 @@ function extractCdata(raw) {
|
||||
return cdata ? cdata[1].trim() : raw.trim()
|
||||
}
|
||||
|
||||
function parseRssItems(xml, limit = 6) {
|
||||
function parseRssItems(xml, limit = Infinity) {
|
||||
const items = []
|
||||
const itemRegex = /<item>([\s\S]*?)<\/item>/g
|
||||
let match
|
||||
@@ -2034,24 +2034,39 @@ function parseRssItems(xml, limit = 6) {
|
||||
return items
|
||||
}
|
||||
|
||||
app.get('/api/episodes', async (_req, res) => {
|
||||
async function fetchAllEpisodes() {
|
||||
const now = Date.now()
|
||||
if (episodesCache && (now - episodesCacheAt) < EPISODES_CACHE_TTL) {
|
||||
return res.json({ episodes: episodesCache })
|
||||
return episodesCache
|
||||
}
|
||||
const controller = new AbortController()
|
||||
const timeout = setTimeout(() => controller.abort(), 8000)
|
||||
const response = await fetch(RSS_FEED_URL, { signal: controller.signal })
|
||||
clearTimeout(timeout)
|
||||
if (!response.ok) throw new Error(`RSS fetch failed: ${response.status}`)
|
||||
const xml = await response.text()
|
||||
const episodes = parseRssItems(xml)
|
||||
episodesCache = episodes
|
||||
episodesCacheAt = now
|
||||
return episodes
|
||||
}
|
||||
|
||||
app.get('/api/episodes', async (_req, res) => {
|
||||
try {
|
||||
const controller = new AbortController()
|
||||
const timeout = setTimeout(() => controller.abort(), 8000)
|
||||
const response = await fetch(RSS_FEED_URL, { signal: controller.signal })
|
||||
clearTimeout(timeout)
|
||||
if (!response.ok) throw new Error(`RSS fetch failed: ${response.status}`)
|
||||
const xml = await response.text()
|
||||
const episodes = parseRssItems(xml, 6)
|
||||
episodesCache = episodes
|
||||
episodesCacheAt = now
|
||||
res.json({ episodes })
|
||||
const episodes = await fetchAllEpisodes()
|
||||
res.json({ episodes: episodes.slice(0, 6) })
|
||||
} catch (err) {
|
||||
console.error('[episodes] RSS fetch error:', err.message)
|
||||
res.json({ episodes: (episodesCache ?? []).slice(0, 6) })
|
||||
}
|
||||
})
|
||||
|
||||
app.get('/api/episodes/all', async (_req, res) => {
|
||||
try {
|
||||
const episodes = await fetchAllEpisodes()
|
||||
res.json({ episodes })
|
||||
} catch (err) {
|
||||
console.error('[episodes/all] RSS fetch error:', err.message)
|
||||
res.json({ episodes: episodesCache ?? [] })
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user