From d8024ac6f452ddd5091f7170b554799975923962 Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Mon, 25 Mar 2024 22:00:04 -0400 Subject: [PATCH] Add chapter ref to feed (#6) --- src/MyWebLog/Handlers/Feed.fs | 25 ++++++++++++++++--------- src/MyWebLog/Handlers/Helpers.fs | 3 +++ src/MyWebLog/Handlers/Post.fs | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/MyWebLog/Handlers/Feed.fs b/src/MyWebLog/Handlers/Feed.fs index 8c55dbd..25f055f 100644 --- a/src/MyWebLog/Handlers/Feed.fs +++ b/src/MyWebLog/Handlers/Feed.fs @@ -163,17 +163,24 @@ let private addEpisode (webLog: WebLog) (podcast: PodcastOptions) (episode: Epis episode.Subtitle |> Option.iter (fun it -> item.ElementExtensions.Add("subtitle", Namespace.iTunes, it)) episode.FormatDuration() |> Option.iter (fun it -> item.ElementExtensions.Add("duration", Namespace.iTunes, it)) - match episode.ChapterFile with - | Some chapters -> - let url = toAbsolute webLog chapters - let typ = - match episode.ChapterType with - | Some mime -> Some mime - | None when chapters.EndsWith ".json" -> Some "application/json+chapters" - | None -> None + let chapterUrl, chapterMimeType = + match episode.Chapters, episode.ChapterFile with + | Some _, _ -> + Some $"{webLog.AbsoluteUrl post.Permalink}?chapters", Some JSON_CHAPTERS + | None, Some chapters -> + let typ = + match episode.ChapterType with + | Some mime -> Some mime + | None when chapters.EndsWith ".json" -> Some JSON_CHAPTERS + | None -> None + Some (toAbsolute webLog chapters), typ + | None, None -> None, None + + match chapterUrl with + | Some url -> let elt = xmlDoc.CreateElement("podcast", "chapters", Namespace.podcast) elt.SetAttribute("url", url) - typ |> Option.iter (fun it -> elt.SetAttribute("type", it)) + chapterMimeType |> Option.iter (fun it -> elt.SetAttribute("type", it)) item.ElementExtensions.Add elt | None -> () diff --git a/src/MyWebLog/Handlers/Helpers.fs b/src/MyWebLog/Handlers/Helpers.fs index 13a0501..1a26bea 100644 --- a/src/MyWebLog/Handlers/Helpers.fs +++ b/src/MyWebLog/Handlers/Helpers.fs @@ -268,6 +268,9 @@ let redirectToGet url : HttpHandler = fun _ ctx -> task { return! redirectTo false (ctx.WebLog.RelativeUrl(Permalink url)) earlyReturn ctx } +/// The MIME type for podcast episode JSON chapters +let JSON_CHAPTERS = "application/json+chapters" + /// Handlers for error conditions module Error = diff --git a/src/MyWebLog/Handlers/Post.fs b/src/MyWebLog/Handlers/Post.fs index 79bd624..b1ae54a 100644 --- a/src/MyWebLog/Handlers/Post.fs +++ b/src/MyWebLog/Handlers/Post.fs @@ -238,7 +238,7 @@ let chapters (post: Post) : HttpHandler = fun next ctx -> jsonFile["fileName"] <- absoluteUrl ep.Media ctx if defaultArg ep.ChapterWaypoints false then jsonFile["waypoints"] <- true jsonFile["chapters"] <- chapterData - json jsonFile next ctx + (setContentType JSON_CHAPTERS >=> json jsonFile) next ctx | None -> match ep.ChapterFile with | Some file -> redirectTo true file next ctx