diff --git a/src/routes/rss[.]xml.ts b/src/routes/rss[.]xml.ts index 732b7474c..172f38f16 100644 --- a/src/routes/rss[.]xml.ts +++ b/src/routes/rss[.]xml.ts @@ -12,6 +12,19 @@ function escapeXml(unsafe: string): string { .replace(/'/g, ''') } +export function getRssImageMediaType(src: string) { + const path = src.split(/[?#]/, 1)[0] + const extension = path.match(/\.([^./]+)$/)?.[1]?.toLowerCase() + + if (extension === 'jpg' || extension === 'jpeg') return 'image/jpeg' + if (extension === 'webp') return 'image/webp' + if (extension === 'svg') return 'image/svg+xml' + if (extension === 'gif') return 'image/gif' + if (extension === 'png') return 'image/png' + + return 'application/octet-stream' +} + function generateRSSFeed() { const posts = getPublishedPosts().slice(0, 50) // Most recent 50 posts const siteUrl = 'https://tanstack.com' @@ -42,7 +55,7 @@ function generateRSSFeed() { ${pubDate} ${escapeXml(author)} ${escapeXml(description)} - ${post.headerImage ? `` : ''} + ${post.headerImage ? `` : ''} ` }) .join('') diff --git a/tests/rss.test.ts b/tests/rss.test.ts new file mode 100644 index 000000000..090b808a1 --- /dev/null +++ b/tests/rss.test.ts @@ -0,0 +1,24 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { getRssImageMediaType } from '../src/routes/rss[.]xml' + +test('uses the image media type matching an RSS enclosure URL', () => { + assert.equal(getRssImageMediaType('/header.png'), 'image/png') + assert.equal(getRssImageMediaType('/header.jpg'), 'image/jpeg') + assert.equal(getRssImageMediaType('/header.jpeg'), 'image/jpeg') + assert.equal(getRssImageMediaType('/header.webp'), 'image/webp') + assert.equal(getRssImageMediaType('/header.svg?v=1'), 'image/svg+xml') + assert.equal(getRssImageMediaType('/header.gif#image'), 'image/gif') + assert.equal( + getRssImageMediaType('/header?source=original.png'), + 'application/octet-stream', + ) + assert.equal( + getRssImageMediaType('/header#preview.jpg'), + 'application/octet-stream', + ) + assert.equal( + getRssImageMediaType('/header.unknown'), + 'application/octet-stream', + ) +})