From 6feae35d81d27e4fc75a23da8e97f1b5a0c71e1e Mon Sep 17 00:00:00 2001 From: Buster Neece Date: Sun, 21 Apr 2024 10:23:53 -0500 Subject: [PATCH] Fix links in Podcast RSS feeds; add "podcast:guid" calculated from global podcast namespace. --- .../PublicPages/PodcastFeedAction.php | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Controller/Frontend/PublicPages/PodcastFeedAction.php b/src/Controller/Frontend/PublicPages/PodcastFeedAction.php index 5d372de4a..e86be250a 100644 --- a/src/Controller/Frontend/PublicPages/PodcastFeedAction.php +++ b/src/Controller/Frontend/PublicPages/PodcastFeedAction.php @@ -15,9 +15,12 @@ use App\Http\ServerRequest; use App\Xml\Writer; use Carbon\CarbonImmutable; use Psr\Http\Message\ResponseInterface; +use Ramsey\Uuid\Uuid; final class PodcastFeedAction implements SingleActionInterface { + public const string PODCAST_NAMESPACE = 'ead4c236-bf58-58c6-a2c6-a6b28d128cb6'; + public function __construct( private readonly PodcastApiGenerator $podcastApiGenerator, private readonly PodcastEpisodeApiGenerator $episodeApiGenerator @@ -52,7 +55,7 @@ final class PodcastFeedAction implements SingleActionInterface $channel = [ 'title' => $podcastApi->title, - 'link' => $podcastApi->link ?? $podcastApi->links['self'], + 'link' => $podcastApi->link ?? $podcastApi->links['public_episodes'], 'description' => $podcastApi->description, 'language' => $podcastApi->language, 'lastBuildDate' => $now->toRssString(), @@ -92,6 +95,7 @@ final class PodcastFeedAction implements SingleActionInterface '@type' => 'application/rss+xml', '@href' => (string)$request->getUri(), ], + 'podcast:guid' => $this->buildPodcastGuid($podcastApi->links['public_feed']), 'item' => [], ]; @@ -155,7 +159,7 @@ final class PodcastFeedAction implements SingleActionInterface $item = [ 'title' => $episodeApi->title, - 'link' => $episodeApi->link ?? $episodeApi->links['self'], + 'link' => $episodeApi->link ?? $episodeApi->links['public'], 'description' => $episodeApi->description, 'enclosure' => [ '@url' => $episodeApi->links['download'], @@ -186,4 +190,17 @@ final class PodcastFeedAction implements SingleActionInterface return $item; } + + private function buildPodcastGuid(string $uri): string + { + $baseUri = rtrim( + str_replace(['https://', 'http://'], '', $uri), + '/' + ); + + return (string)Uuid::uuid5( + self::PODCAST_NAMESPACE, + $baseUri + ); + } }