RSS Enhance
RSS Enhance pulls metadata straight from a show’s RSS feed and fills gaps in your catalog row. It’s how you bring stale shows up to date without leaving the grid, and it’s the fastest way to populate dozens of newly-imported shows in one shot.
What it pulls
For each show with a valid rss_feed URL, the action fetches the feed and extracts:
| Field | Source priority |
|---|---|
| Artwork | <itunes:image href="…"> → <image><url>…</url></image> |
| Description | <itunes:summary> → <description> (HTML tags stripped, basic entities decoded) |
| Host name | <podcast:person role="host"> → first <podcast:person> → <itunes:owner><itunes:name> (see “Why not iTunes:author?” below) |
| Categories | All <itunes:category text="…">, including nested sub-categories; plus plain <category> tags |
The feed is fetched with a 15-second timeout, a FrequencyCatalog/1.0 User-Agent, and a 5-show concurrency cap when running against many rows at once.
Where to run it
From a single show
- Right-click the row, or open the show context menu (the kebab on the row).
- Click RSS Enhance.
- The modal opens, fetches the feed, and shows you the diff.
Single-show RSS enhance modal.
Modal header with the show name and its RSS URL. Below: a per-field table with current value vs RSS value, a checkbox per field, and the rehosted artwork preview if present.
Screenshot pending
Bulk: multiple shows at once
- Select multiple rows with the row checkboxes.
- In the floating action bar, open the More menu → RSS Enhance selected.
- The modal opens with one row per show; each row has its own per-field checkboxes.
Bulk RSS enhance modal.
A scrollable Table: column per field (Artwork / Description / Categories), row per show. Cells show success badges or red error pills. A primary 'Apply' button at the bottom.
Screenshot pending
The fetch runs 5 feeds at a time to avoid hammering publisher servers. Live progress (12 of 38 fetched) is shown above the table.
What the modal shows
For every show with a usable feed, the modal renders a row with one cell per available field. Each cell shows:
- The value the feed proposes (a thumbnail for artwork, the first ~120 chars of description, a list of category chips).
- A checkbox indicating whether this field will be written on Apply.
For every show whose feed failed (HTTP error, timeout, invalid XML, missing channel), the row shows a red error message with the reason. Failures don’t block the others.
Auto-selection
To save clicks on large batches, the modal auto-checks fields where:
- Artwork — the feed has artwork and the show currently has none.
- Description — the feed has a description and the show currently has none.
- Categories — the feed has any categories (auto-checked regardless of current value, because categories are additive — see below).
You can override any auto-selection by toggling the checkbox.
Auto-selected fields highlighted vs unchecked fields.
Same bulk modal table; some cells pre-checked (auto-selected because empty in DB), others unchecked. A 'Select all' / 'Clear' affordance in the header row of each field column.
Screenshot pending
Bulk toggles
The column header for each field has a Select all / Clear all affordance — useful when you want all descriptions but no artwork, for example.
What happens on Apply
For each checked cell, applyRssEnhanceAction runs server-side per show:
Artwork
- If the URL doesn’t already point to Frequency storage, rehost it:
- Download the image from the publisher’s CDN.
- Upload to the
show-artworkSupabase storage bucket at{orgId}/{slug}.{ext}. - Replace the URL in the payload with the rehosted one.
- Generate a thumbnail — fetch the rehosted image, resize, upload alongside the original.
- Thumbnail failure is non-fatal — the original artwork still gets written.
This makes the show’s artwork resilient to the publisher’s RSS host disappearing or rotating image URLs.
Description
Stripped of HTML, basic entities decoded (&, <, >, ", '), then written verbatim. This replaces the existing description.
Host name
Written verbatim into the show’s host list. Replaces the existing host(s) for that show.
Why not iTunes:author?
<itunes:author> is intentionally skipped. In practice it’s filled with the network or publisher name (iHeartRadio, NPR, Wondery), not the actual host. Using it would corrupt the host field.
Categories
Categories are looked up in the global category table by name. If a category doesn’t exist yet, it’s auto-created with a generated slug and an automatically-assigned color (via categoryColor()).
Categories are then linked through the show_category junction table — additively. That means:
- Existing show ↔ category links are kept.
- New ones from the feed are inserted.
- Nothing is removed.
This is intentional: a show that humans tagged with editorial categories shouldn’t lose them just because the RSS feed lists different ones.
Failures, retries, partial success
| What happens | What you see |
|---|---|
No rss_feed on the show | The row is skipped before fetching. The modal shows “No RSS feed” instead of a value cell. |
| Network timeout (15s) | Red error pill: “Failed to fetch”. You can close + retry — sometimes feeds are flaky. |
| HTTP non-200 | Red pill with the status: “HTTP 404”, “HTTP 503”, etc. |
Invalid XML / no <channel> | Red pill: “Invalid RSS feed: no channel element”. |
| Per-field failure on Apply | Other checked fields still apply. The failing one stays as-is and a toast lists the error. |
| Thumbnail generation fails | The original artwork still writes successfully; thumbnail is just absent until next time. |
There’s no automatic retry — re-open the modal and try again. For persistent failures, check the feed URL by hand in a browser.
Bulk patterns
- New imports — right after the import wizard lands a collection, open it, select all rows, and RSS Enhance. Most of your descriptions and artwork will populate in one pass.
- Periodic refresh — once a quarter, bulk-select an org’s full inventory and enhance with only Description checked to catch publishers who’ve updated their pitch copy.
- Category audit — bulk-enhance with only Categories checked to fill out the long tail of niche categories that didn’t make it into your initial taxonomy. New categories appear in the global picker for everyone.
Edge cases & gotchas
- Slow feeds — some publisher CDNs respond in 8–12 seconds. The 15s timeout catches most; truly slow feeds will just fail.
- Compressed feeds —
fetchhandles gzip automatically; no special handling needed. - Feeds behind auth / paywalls — not supported. The fetch doesn’t carry any credentials.
- Image format quirks — RSS feeds sometimes link to images served via redirects (e.g. Megaphone, Libsyn). Rehosting follows redirects and stores the final body.
- Concurrent edits — if someone else edits the show’s host or description in the same second, the RSS write may overwrite their change. The collection’s live presence indicator hints at when this is a risk.
- Categories from RSS are coarse — Apple’s category taxonomy is broad. After enhance, you may want to refine categories by hand in the show detail.
- Bulk modal is heavy — selecting 200+ shows produces a long-running modal. The fetch will complete, but expect 30–60 seconds of progress; don’t close mid-fetch or partial results may be lost.
- No undo — applied changes write directly. To revert, you’d need to use the show detail modal’s History tab and manually restore prior values.