From 70f50eec2ab043141b7b5d32d3dffad84a58cbd9 Mon Sep 17 00:00:00 2001 From: Mike Freno Date: Fri, 6 Feb 2026 16:45:34 -0500 Subject: [PATCH] covert html on fetch instead --- src/api/rss-parser.ts | 12 ++++++------ src/tabs/Feed/FeedItem.tsx | 5 ++--- src/tabs/Feed/FeedPage.tsx | 1 - 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/api/rss-parser.ts b/src/api/rss-parser.ts index 50acd5c..d834393 100644 --- a/src/api/rss-parser.ts +++ b/src/api/rss-parser.ts @@ -25,10 +25,10 @@ const decodeEntities = (value: string) => .replace(/'/g, "'") /** - * Clean a description field: detect HTML vs plain text, and convert + * Clean a field (description or title): detect HTML vs plain text, and convert * HTML to readable plain text. Plain text just gets entity decoding. */ -const cleanDescription = (raw: string): string => { +const cleanField = (raw: string): string => { if (!raw) return "" const decoded = decodeEntities(raw) const type = detectContentType(decoded) @@ -76,15 +76,15 @@ const parseEpisodeType = (raw: string): EpisodeType | undefined => { export const parseRSSFeed = (xml: string, feedUrl: string): Podcast & { episodes: Episode[] } => { const channel = xml.match(//i)?.[0] ?? xml - const title = decodeEntities(getTagValue(channel, "title")) || "Untitled Podcast" - const description = cleanDescription(getTagValue(channel, "description")) + const title = cleanField(getTagValue(channel, "title")) || "Untitled Podcast" + const description = cleanField(getTagValue(channel, "description")) const author = decodeEntities(getTagValue(channel, "itunes:author")) const lastUpdated = new Date() const items = channel.match(//gi) ?? [] const episodes = items.map((item, index) => { - const epTitle = decodeEntities(getTagValue(item, "title")) || `Episode ${index + 1}` - const epDescription = cleanDescription(getTagValue(item, "description")) + const epTitle = cleanField(getTagValue(item, "title")) || `Episode ${index + 1}` + const epDescription = cleanField(getTagValue(item, "description")) const pubDate = new Date(getTagValue(item, "pubDate") || Date.now()) // Audio URL + file size + MIME type from diff --git a/src/tabs/Feed/FeedItem.tsx b/src/tabs/Feed/FeedItem.tsx index 10369ea..02d2a96 100644 --- a/src/tabs/Feed/FeedItem.tsx +++ b/src/tabs/Feed/FeedItem.tsx @@ -5,7 +5,6 @@ import type { Feed, FeedVisibility } from "@/types/feed"; import { format } from "date-fns"; -import { htmlToText } from "@/utils/html-to-text"; import { useTheme } from "@/context/ThemeContext"; interface FeedItemProps { @@ -55,7 +54,7 @@ export function FeedItem(props: FeedItemProps) { {visibilityIcon()} - {htmlToText(props.feed.customName || props.feed.podcast.title)} + {props.feed.customName || props.feed.podcast.title} {props.showEpisodeCount && ({episodeCount()})} @@ -81,7 +80,7 @@ export function FeedItem(props: FeedItemProps) { {pinnedIndicator()} - {htmlToText(props.feed.customName || props.feed.podcast.title)} + {props.feed.customName || props.feed.podcast.title} diff --git a/src/tabs/Feed/FeedPage.tsx b/src/tabs/Feed/FeedPage.tsx index 85c5613..79d71ba 100644 --- a/src/tabs/Feed/FeedPage.tsx +++ b/src/tabs/Feed/FeedPage.tsx @@ -10,7 +10,6 @@ import { format } from "date-fns"; import type { Episode } from "@/types/episode"; import type { Feed } from "@/types/feed"; import { useTheme } from "@/context/ThemeContext"; -import { htmlToText } from "@/utils/html-to-text"; type FeedPageProps = { focused: boolean;