From 8381cddca6505d1e2af3666cd24894a413c81420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20H=C3=A5rek=20Andreassen?= Date: Tue, 2 Apr 2024 16:27:00 +0200 Subject: [PATCH] fix: Generate feeds for series in addition to podcast (#19) --- lib/nrk.ts | 27 ++++++++++++++++++++++++--- routes/api/feeds/[seriesId].ts | 24 +++++++++++++++++------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/lib/nrk.ts b/lib/nrk.ts index da3356d..75328b7 100644 --- a/lib/nrk.ts +++ b/lib/nrk.ts @@ -22,12 +22,19 @@ const nrkAPI = `https://psapi.nrk.no`; async function withDownloadLink( episode: PodcastEpisodesSingle, + type: catalogComponents["schemas"]["Type"], ): Promise { // getting stream link - const [playbackStatus, playbackResponse] = await get( + let [playbackStatus, playbackResponse] = await get( `${nrkAPI}/playback/manifest/podcast/${episode.episodeId}`, ); + if (type === "series") { + [playbackStatus, playbackResponse] = await get( + `${nrkAPI}/playback/manifest/program/${episode.episodeId}`, + ); + } + if (playbackStatus === OK && playbackResponse) { return { ...episode, url: playbackResponse.playable.assets[0].url }; } else { @@ -46,7 +53,7 @@ export const nrkRadio = { throw `Something went wrong with ${query} - got status ${status}`; }, getSerieData: async (seriesId: string) => { - const [ + let [ [episodeStatus, episodeResponse], [seriesStatus, serieResponse], ] = await Promise.all([ @@ -58,12 +65,26 @@ export const nrkRadio = { ), ]); + if (episodeStatus !== OK || seriesStatus !== OK) { + [ + [episodeStatus, episodeResponse], + [seriesStatus, serieResponse], + ] = await Promise.all([ + get( + `https://psapi.nrk.no/radio/catalog/series/${seriesId}/episodes`, + ), + get( + `https://psapi.nrk.no/radio/catalog/series/${seriesId}`, + ), + ]); + } + if ( episodeStatus === OK && seriesStatus === OK && serieResponse?.series && episodeResponse?._embedded.episodes?.length ) { const episodes = await Promise.all( - episodeResponse._embedded.episodes.map((episode) => withDownloadLink(episode)), + episodeResponse._embedded.episodes.map((episode) => withDownloadLink(episode, serieResponse.type)), ); return { ...serieResponse.series, diff --git a/routes/api/feeds/[seriesId].ts b/routes/api/feeds/[seriesId].ts index 2057c20..8729249 100644 --- a/routes/api/feeds/[seriesId].ts +++ b/routes/api/feeds/[seriesId].ts @@ -30,7 +30,7 @@ function toItemTag(seriesId: string, episode: OriginalEpisode) { async function buildFeed(seriesId: string) { const serie = await nrkRadio.getSerieData(seriesId); - const imageUrl = serie.squareImage.at(-1)?.url; + const imageUrl = serie.squareImage?.at(-1)?.url ?? ""; const linkValue = `https://radio.nrk.no/podkast/${serie.id}`; // Quickly adapted from https://raw.githubusercontent.com/olaven/paperpod/1cde9abd3174b26e126aa74fc5a3b63fd078c0fd/packages/converter/src/rss.ts @@ -88,11 +88,21 @@ async function buildFeed(seriesId: string) { export const handler = async (_req: Request, ctx: FreshContext): Promise => { const seriesId = ctx.params.seriesId; - const feedContent = await buildFeed(seriesId); + try { + const feedContent = await buildFeed(seriesId); - return new Response(feedContent, { - headers: { - "Content-Type": "application/xml", - }, - }); + return new Response(feedContent, { + headers: { + "Content-Type": "application/xml", + }, + }); + } catch (error) { + console.error(error); + return new Response(JSON.stringify({ message: "Could not generate feed" }), { + status: 500, + headers: { + "Content-Type": "application/json", + }, + }); + } };