Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/llms-txt-hub / apps/web/app/api/rss-feed/route.ts |
| Date | Not specified in source |
| Repository | Janady13/llms-txt-hub |
| Revision | e0f4bf978d4df168369c7601d9c5f5ea89e84377 |
| Branch | main |
| Path or archive member | apps/web/app/api/rss-feed/route.ts |
| Original SHA-256 | 5eb7b014093024dfea330bfc1084262f51478d1a01139f550b0c2008324f4980 |
| Git blob SHA | 895f3a9358000283cabbb1ed9ee0d8e37e89705d |
| Reading-copy SHA-256 | 5eb7b014093024dfea330bfc1084262f51478d1a01139f550b0c2008324f4980 |
Recovered source transcript
Download complete source text ↓58 lines · 1.8 KB
import { logger } from '@thedaviddias/logging'
import { XMLParser } from 'fast-xml-parser'
import { NextResponse } from 'next/server'
export const RSS_FEED_URL = process.env.RSS_FEED_URL || 'https://bg.raindrop.io/rss/public/52790163'
// Segment Config
export const dynamic = 'force-dynamic'
export const fetchCache = 'force-no-store'
export const revalidate = 0
async function fetchWithRetry(url: string, retries = 3): Promise<Response> {
for (let i = 0; i < retries; i++) {
try {
const response = await fetch(url, {
next: { revalidate: 172800 },
headers: {
'User-Agent': 'Mozilla/5.0 (compatible; RSS-Reader/1.0)'
}
})
if (response.ok) return response
} catch (error) {
if (i === retries - 1) throw error
await new Promise(resolve => setTimeout(resolve, 1000 * 2 ** i))
}
}
throw new Error('Failed to fetch after retries')
}
export async function GET() {
try {
const response = await fetchWithRetry(RSS_FEED_URL)
const xmlData = await response.text()
const parser = new XMLParser()
const result = parser.parse(xmlData)
if (!result?.rss?.channel?.item) {
return NextResponse.json({ items: [] })
}
const items = Array.isArray(result.rss.channel.item)
? result.rss.channel.item
: [result.rss.channel.item]
const formattedItems = items.map((item: any) => ({
title: item.title || '',
link: item.link || '',
pubDate: item.pubDate || '',
description: item.description || ''
}))
return NextResponse.json({ items: formattedItems })
} catch (error) {
logger.error('Failed to fetch or parse RSS feed:', { data: error, tags: { type: 'api' } })
return NextResponse.json({ error: 'Failed to fetch or parse RSS feed' }, { status: 500 })
}
}