From c5239d2923fab4f6de49eaeede228b8856849268 Mon Sep 17 00:00:00 2001 From: vegard Date: Thu, 19 Mar 2026 00:31:39 +0000 Subject: [PATCH] Feed-redirect: 301 for podcast som flyttes til ny host (oppgave 30.8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Når redirect_feed er satt i podcast-trait, returnerer maskinrommet HTTP 301 Moved Permanently med Location-header i stedet for å serve feeden. iTunes new-feed-url-taggen bevares også i RSS-en for klienter som ikke følger 301. Admin-UI: erstatter det enkle tekstfeltet med tre tilstander: - Inaktiv: knapp "Flytt podcast til annen plattform..." - Bekreftelse: advarsel + URL-felt + rød "Aktiver redirect"-knapp - Aktiv: gul statusindikator med deaktiver-knapp Backend: sjekker redirect_feed tidlig i generate_feed() og returnerer 301 før noe annet arbeid gjøres (DB-oppslag for episodes osv). --- docs/features/podcast_hosting.md | 9 +- .../traits/PodcastTraitAdmin.svelte | 90 ++++++++++++++++--- maskinrommet/src/rss.rs | 13 +++ tasks.md | 3 +- 4 files changed, 98 insertions(+), 17 deletions(-) diff --git a/docs/features/podcast_hosting.md b/docs/features/podcast_hosting.md index f350b9d..72b953f 100644 --- a/docs/features/podcast_hosting.md +++ b/docs/features/podcast_hosting.md @@ -202,8 +202,13 @@ Brukeren eier dataene sine. Flytte bort er enkelt: } ``` -Når satt: Caddy returnerer 301 for feed-URL. -Apple/Spotify oppdaterer automatisk. +Når satt: maskinrommet returnerer HTTP 301 Moved Permanently for +`/pub/{slug}/feed.xml` med `Location`-header til ny URL. +Apple/Spotify oppdaterer automatisk. I tillegg inkluderes +`` i RSS-en for klienter som ikke følger 301. + +Admin-UI har én-klikks aktivering med advarsel. Redirecten kan +deaktiveres når som helst fra podcast-trait-innstillingene. Brukeren kan også eksportere all data: - RSS-feed med alle episoder diff --git a/frontend/src/lib/components/traits/PodcastTraitAdmin.svelte b/frontend/src/lib/components/traits/PodcastTraitAdmin.svelte index c5fce18..f4cb3df 100644 --- a/frontend/src/lib/components/traits/PodcastTraitAdmin.svelte +++ b/frontend/src/lib/components/traits/PodcastTraitAdmin.svelte @@ -19,6 +19,8 @@ let explicit = $state((config.explicit as boolean) ?? false); let language = $state((config.language as string) ?? 'no'); let redirectFeed = $state((config.redirect_feed as string) ?? ''); + let redirectInput = $state(''); + let showRedirectConfirm = $state(false); // iTunes category tree (Apple Podcasts standard) const itunesCategories: Record = { @@ -182,19 +184,81 @@
-
diff --git a/maskinrommet/src/rss.rs b/maskinrommet/src/rss.rs index a3e9199..125b278 100644 --- a/maskinrommet/src/rss.rs +++ b/maskinrommet/src/rss.rs @@ -105,6 +105,19 @@ pub async fn generate_feed( })? .ok_or(StatusCode::NOT_FOUND)?; + // 301 Moved Permanently når redirect_feed er satt (podcast flyttet til ny host) + if let Some(ref redirect_url) = collection.podcast_config.redirect_feed { + if !redirect_url.is_empty() { + tracing::info!(slug = %slug, redirect = %redirect_url, "Feed-redirect aktiv"); + return Ok(Response::builder() + .status(StatusCode::MOVED_PERMANENTLY) + .header(header::LOCATION, redirect_url.as_str()) + .header(header::CACHE_CONTROL, "public, max-age=3600") + .body("Moved Permanently".into()) + .unwrap()); + } + } + let max_items = collection.rss_config.max_items.unwrap_or(50); let items = fetch_feed_items(&state.db, collection.id, max_items, collection.is_podcast) .await diff --git a/tasks.md b/tasks.md index b58a019..5683d54 100644 --- a/tasks.md +++ b/tasks.md @@ -437,5 +437,4 @@ prøveimport-flyt. - [x] 30.7 Prøveimport-flyt i frontend: "Importer podcast"-wizard i admin. Steg 1: lim inn RSS-URL, vis forhåndsvisning av episoder. Steg 2: importer (kan ta tid for mange episoder). Steg 3: sjekk resultat, sammenlign feeds. Steg 4: re-importer nye episoder når klar. Steg 5: aktiver 301-redirect på gammel host. ### Eksport og redirect -- [~] 30.8 Feed-redirect: `redirect_feed`-felt i podcast-trait. Når satt: Caddy returnerer 301 for feed-URL. Brukeren kan alltid flytte bort. Admin-UI med én-klikks aktivering og advarsel. - > Påbegynt: 2026-03-19T00:25 +- [x] 30.8 Feed-redirect: `redirect_feed`-felt i podcast-trait. Når satt: Caddy returnerer 301 for feed-URL. Brukeren kan alltid flytte bort. Admin-UI med én-klikks aktivering og advarsel.