chore: remove looksLikeFeedUrl
e188e3a3
- Removed `looksLikeFeedUrl` and instead try attempting direct URL before mapping through possibilities
3 file(s) · +46 −44
- Removed `looksLikeFeedUrl` and instead try attempting direct URL before mapping through possibilities
| 9 | 9 | fetchFeedWithFallback, |
|
| 10 | 10 | parseFeedXml, |
|
| 11 | 11 | discoverFeed, |
|
| 12 | - | looksLikeFeedUrl, |
|
| 13 | 12 | extractPostContent, |
|
| 14 | 13 | extractPostDate, |
|
| 15 | 14 | sanitizeFeedData, |
|
| 240 | 239 | ||
| 241 | 240 | feedUrl = youtubeFeedUrl; |
|
| 242 | 241 | xmlData = await fetchFeedWithFallback(feedUrl); |
|
| 243 | - | } else if (!looksLikeFeedUrl(urlInput)) { |
|
| 244 | - | setErrorMessage("Discovering RSS feed..."); |
|
| 245 | - | const discovered = await discoverFeed(urlInput); |
|
| 242 | + | } else { |
|
| 243 | + | // First, try to fetch the URL directly as a feed |
|
| 244 | + | setErrorMessage("Checking URL..."); |
|
| 245 | + | try { |
|
| 246 | + | xmlData = await fetchFeedWithFallback(urlInput); |
|
| 247 | + | // Try to parse it to see if it's a valid feed |
|
| 248 | + | parseFeedXml(xmlData); |
|
| 249 | + | // If parsing succeeds, it's a valid feed |
|
| 250 | + | feedUrl = urlInput; |
|
| 251 | + | } catch { |
|
| 252 | + | // If direct fetch/parse fails, try feed discovery |
|
| 253 | + | setErrorMessage("Discovering RSS feed..."); |
|
| 254 | + | const discovered = await discoverFeed(urlInput); |
|
| 255 | + | ||
| 256 | + | if (!discovered) { |
|
| 257 | + | setErrorMessage( |
|
| 258 | + | "Could not find an RSS feed at this URL. Please enter a direct feed URL.", |
|
| 259 | + | ); |
|
| 260 | + | setIsAddingFeed(false); |
|
| 261 | + | return; |
|
| 262 | + | } |
|
| 246 | 263 | ||
| 247 | - | if (!discovered) { |
|
| 248 | - | setErrorMessage( |
|
| 249 | - | "Could not find an RSS feed at this URL. Please enter a direct feed URL.", |
|
| 250 | - | ); |
|
| 251 | - | setIsAddingFeed(false); |
|
| 252 | - | return; |
|
| 264 | + | feedUrl = discovered.feedUrl; |
|
| 265 | + | xmlData = discovered.xmlData; |
|
| 253 | 266 | } |
|
| 254 | - | ||
| 255 | - | feedUrl = discovered.feedUrl; |
|
| 256 | - | xmlData = discovered.xmlData; |
|
| 257 | - | } else { |
|
| 258 | - | xmlData = await fetchFeedWithFallback(feedUrl); |
|
| 259 | 267 | } |
|
| 260 | 268 | ||
| 261 | 269 | const { feedData, posts, isAtom } = parseFeedXml(xmlData); |
|
| 17 | 17 | fetchFeedWithFallback, |
|
| 18 | 18 | parseFeedXml, |
|
| 19 | 19 | discoverFeed, |
|
| 20 | - | looksLikeFeedUrl, |
|
| 21 | 20 | extractPostContent, |
|
| 22 | 21 | extractPostDate, |
|
| 23 | 22 | sanitizeFeedData, |
|
| 50 | 49 | setStatusMessage(""); |
|
| 51 | 50 | ||
| 52 | 51 | try { |
|
| 53 | - | // Try to discover feeds if the URL doesn't look like a direct feed URL |
|
| 54 | 52 | let feedUrl = urlInput; |
|
| 55 | 53 | let xmlData: string | null = null; |
|
| 56 | 54 | ||
| 69 | 67 | ||
| 70 | 68 | feedUrl = youtubeFeedUrl; |
|
| 71 | 69 | xmlData = await fetchFeedWithFallback(feedUrl); |
|
| 72 | - | } else if (!looksLikeFeedUrl(urlInput)) { |
|
| 73 | - | setStatusMessage("Discovering RSS feed..."); |
|
| 74 | - | const discovered = await discoverFeed(urlInput); |
|
| 70 | + | } else { |
|
| 71 | + | // First, try to fetch the URL directly as a feed |
|
| 72 | + | setStatusMessage("Checking URL..."); |
|
| 73 | + | try { |
|
| 74 | + | xmlData = await fetchFeedWithFallback(urlInput); |
|
| 75 | + | // Try to parse it to see if it's a valid feed |
|
| 76 | + | parseFeedXml(xmlData); |
|
| 77 | + | // If parsing succeeds, it's a valid feed |
|
| 78 | + | feedUrl = urlInput; |
|
| 79 | + | } catch { |
|
| 80 | + | // If direct fetch/parse fails, try feed discovery |
|
| 81 | + | setStatusMessage("Discovering RSS feed..."); |
|
| 82 | + | const discovered = await discoverFeed(urlInput); |
|
| 75 | 83 | ||
| 76 | - | if (!discovered) { |
|
| 77 | - | setStatusMessage( |
|
| 78 | - | "Could not find an RSS feed at this URL. Please enter a direct feed URL.", |
|
| 79 | - | ); |
|
| 80 | - | setIsAddingFeed(false); |
|
| 81 | - | return; |
|
| 82 | - | } |
|
| 84 | + | if (!discovered) { |
|
| 85 | + | setStatusMessage( |
|
| 86 | + | "Could not find an RSS feed at this URL. Please enter a direct feed URL.", |
|
| 87 | + | ); |
|
| 88 | + | setIsAddingFeed(false); |
|
| 89 | + | return; |
|
| 90 | + | } |
|
| 83 | 91 | ||
| 84 | - | feedUrl = discovered.feedUrl; |
|
| 85 | - | xmlData = discovered.xmlData; |
|
| 86 | - | } else { |
|
| 87 | - | // Direct feed URL - try to fetch it |
|
| 88 | - | xmlData = await fetchFeedWithFallback(feedUrl); |
|
| 92 | + | feedUrl = discovered.feedUrl; |
|
| 93 | + | xmlData = discovered.xmlData; |
|
| 94 | + | } |
|
| 89 | 95 | } |
|
| 90 | 96 | ||
| 91 | 97 | const { feedData, posts, isAtom } = parseFeedXml(xmlData); |
|
| 193 | 193 | } |
|
| 194 | 194 | ||
| 195 | 195 | /** |
|
| 196 | - | * Checks if a URL looks like a direct feed URL |
|
| 197 | - | */ |
|
| 198 | - | export function looksLikeFeedUrl(url: string): boolean { |
|
| 199 | - | return ( |
|
| 200 | - | url.includes("/feed") || |
|
| 201 | - | url.includes("/rss") || |
|
| 202 | - | url.includes(".xml") || |
|
| 203 | - | url.includes("/atom") |
|
| 204 | - | ); |
|
| 205 | - | } |
|
| 206 | - | ||
| 207 | - | /** |
|
| 208 | 196 | * Extracts YouTube channel ID from various YouTube URL formats |
|
| 209 | 197 | * Supports: |
|
| 210 | 198 | * - https://www.youtube.com/@ChannelHandle |