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.