From 96f471a291428c4d0266b3c9536a315e1668864a Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Fri, 24 Jul 2026 20:21:54 +0400 Subject: [PATCH] fix(feed): format RSS build dates --- lib/pleroma/web/feed/feed_view.ex | 14 ++++++++++++++ lib/pleroma/web/templates/feed/feed/tag.rss.eex | 4 +++- test/pleroma/web/feed/tag_controller_test.exs | 17 ++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex index ade9f7a15..dcbb8404f 100644 --- a/lib/pleroma/web/feed/feed_view.ex +++ b/lib/pleroma/web/feed/feed_view.ex @@ -38,6 +38,20 @@ defmodule Pleroma.Web.Feed.FeedView do end end + def most_recent_update([], :rss), do: nil + + def most_recent_update(activities, :rss) do + activities + |> Enum.map(fn activity -> + case Object.normalize(activity, fetch: false) do + %Object{updated_at: updated_at} -> updated_at + _ -> activity.updated_at + end + end) + |> Enum.max_by(&NaiveDateTime.to_erl/1) + |> to_rfc2822() + end + def most_recent_update(activities, user, :atom) do (List.first(activities) || user).updated_at |> to_rfc3339() diff --git a/lib/pleroma/web/templates/feed/feed/tag.rss.eex b/lib/pleroma/web/templates/feed/feed/tag.rss.eex index 618b89ba3..b74a573e5 100644 --- a/lib/pleroma/web/templates/feed/feed/tag.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/tag.rss.eex @@ -12,7 +12,9 @@ <%= feed_logo() %> <%= feed_logo() %> 2b90d9 - <%= most_recent_update(@activities) || to_rfc2822(NaiveDateTime.utc_now()) %> + <%= with last_build_date when not is_nil(last_build_date) <- most_recent_update(@activities, :rss) do %> + <%= last_build_date %> + <% end %> <%= Pleroma.Application.named_version() %> <%= for activity <- @activities do %> <%= render Phoenix.Controller.view_module(@conn), "_tag_activity.xml", Map.merge(assigns, prepare_activity(activity)) %> diff --git a/test/pleroma/web/feed/tag_controller_test.exs b/test/pleroma/web/feed/tag_controller_test.exs index 7f2f57b07..2e20e18d7 100644 --- a/test/pleroma/web/feed/tag_controller_test.exs +++ b/test/pleroma/web/feed/tag_controller_test.exs @@ -105,8 +105,10 @@ defmodule Pleroma.Web.Feed.TagControllerTest do } ]) + edited_at = NaiveDateTime.add(object.updated_at, 60) + object - |> Ecto.Changeset.change(data: object_data) + |> Ecto.Changeset.change(data: object_data, updated_at: edited_at) |> Pleroma.Repo.update() {:ok, activity2} = CommonAPI.post(user, %{status: "42 This is :moominmamma #PleromaArt"}) @@ -141,6 +143,9 @@ defmodule Pleroma.Web.Feed.TagControllerTest do FeedView.to_rfc2822(activity1.data["published"]) ] + assert xpath(xml, ~x"//channel/lastBuildDate/text()"s) == + FeedView.to_rfc2822(edited_at) + assert xpath(xml, ~x"//channel/item/media:content/@url"sl) == [ "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4" ] @@ -181,6 +186,16 @@ defmodule Pleroma.Web.Feed.TagControllerTest do ] end + test "does not fabricate lastBuildDate for an empty RSS feed", %{conn: conn} do + response = + conn + |> put_req_header("accept", "application/rss+xml") + |> get(tag_feed_path(conn, :feed, "empty.rss")) + |> response(200) + + refute response =~ "" + end + describe "private instance" do setup do: clear_config([:instance, :public], false)