Skip to content

Commit c2c5ad5

Browse files
pascalchevrelclaude
andcommitted
Add an RSS feed for ESR releases
New /rss/esr/ feed listing the 30 latest ESR releases of all supported ESR branches, linking to their release notes on firefox.com. It shares the releases.rss.twig template with /rss/, whose output is unchanged. The feed is advertised in the page head and on the about page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent c778a38 commit c2c5ad5

10 files changed

Lines changed: 65 additions & 1 deletion

File tree

‎app/classes/ReleaseInsights/Model.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public function __construct(public string $model) {
4646
'past_release' => 'past_release.php',
4747
'release_uplifts' => 'release_uplifts.php',
4848
'rss' => 'rss.php',
49+
'rss_esr' => 'rss_esr.php',
4950
];
5051
}
5152

‎app/classes/ReleaseInsights/Request.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ public function getController(): string
126126
'/release/owners/' => 'release_owners',
127127
'/release-notes/' => 'relnotes_doc',
128128
'/rss/' => 'rss',
129+
'/rss/esr/' => 'rss_esr',
129130
'/sitemap/' => 'sitemap',
130131
default => '404',
131132
};

‎app/controllers/rss.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
'title' => 'Firefox Desktop and Android releases',
1515
'description' => 'Release dates for Firefox Desktop and Android. Includes major and minor releases.',
1616
'site_link' => 'https://whattrainisitnow.com',
17+
'feed_link' => 'https://whattrainisitnow.com/rss/',
1718
'latest_release_date' => $latest_release_date,
1819
'releases' => $releases,
1920
]

‎app/controllers/rss_esr.php‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use ReleaseInsights\{Model, Template};
6+
7+
[$latest_release_date, $releases] = new Model('rss_esr')->get();
8+
9+
header("Content-Type: application/xml; charset=UTF-8");
10+
11+
new Template(
12+
'releases.rss.twig',
13+
[
14+
'title' => 'Firefox ESR releases',
15+
'description' => 'Release dates for Firefox Extended Support Releases (ESR), for all supported ESR branches.',
16+
'site_link' => 'https://whattrainisitnow.com/release/?version=esr',
17+
'feed_link' => 'https://whattrainisitnow.com/rss/esr/',
18+
'latest_release_date' => $latest_release_date,
19+
'releases' => $releases,
20+
]
21+
)->render();

‎app/models/rss_esr.php‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use ReleaseInsights\Data;
6+
7+
// ESR releases, latest first
8+
$releases = new Data()->getESRReleases();
9+
uksort($releases, fn(string $a, string $b) => strcmp($releases[$b], $releases[$a]) ?: strnatcmp($b, $a));
10+
11+
// Limit our RSS feed to 30 items, several ESR branches ship on the same day
12+
$releases = array_slice($releases, 0, 30, true);
13+
14+
$set_time = fn(string $date) => new DateTime($date)->setTime(13, 0)->format(DateTime::RSS);
15+
16+
$rss = [];
17+
foreach ($releases as $version => $date) {
18+
$rss[] = [
19+
'version' => (string) $version,
20+
'date' => $set_time($date),
21+
'platform' => 'esr',
22+
];
23+
}
24+
25+
// We take the last update to the feed as the first item (latest release) in the sorted array
26+
return [$set_time(reset($releases)), $rss];

‎app/views/templates/about.html.twig‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@ It is maintained by the <a href="https://wiki.mozilla.org/Release_Management/Tea
214214
<td><a href="/rss/">rss</a></td>
215215
<td><img class="align-text-bottom" src="/assets/img/feed_icon.svg" alt="RSS feed logo">&thinsp;Subscribe to our RSS feed to get a notification when a new Firefox release is out.</td>
216216
</tr>
217+
<tr>
218+
<td><a href="/rss/esr/">rss/esr</a></td>
219+
<td><img class="align-text-bottom" src="/assets/img/feed_icon.svg" alt="RSS feed logo">&thinsp;Subscribe to our ESR RSS feed to get a notification when a new Firefox ESR release is out.</td>
220+
</tr>
217221

218222
</table>
219223

‎app/views/templates/base.html.twig‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<meta charset="utf-8">
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
77
<link rel="alternate" type="application/rss+xml" title="Feed to get alerted of Firefox releases" href="/rss/">
8+
<link rel="alternate" type="application/rss+xml" title="Feed to get alerted of Firefox ESR releases" href="/rss/esr/">
89
<link rel="stylesheet" href="{{ asset('/assets/bootstrap/css/bootstrap.min.css') }}" media="screen">
910
{# No version on the font preload: it must match the URL in inter.css or the font is downloaded twice #}
1011
<link rel="preload" href="/assets/fonts/Inter-4.1/InterVariable-Latin.woff2" as="font" type="font/woff2" crossorigin>

‎app/views/templates/releases.rss.twig‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@
66
<language>en-US</language>
77
<lastBuildDate>{{ latest_release_date }}</lastBuildDate>
88
<ttl>1440</ttl>
9-
<atom:link href="https://whattrainisitnow.com/rss/" rel="self" type="application/rss+xml" />
9+
<atom:link href="{{ feed_link }}" rel="self" type="application/rss+xml" />
1010
{% for release in releases %}
1111
<item>
12+
{% if release.platform == 'esr' %}
13+
<title>Firefox ESR {{ release.version }}</title>
14+
<description>Firefox ESR release {{ release.version }} shipped on {{ release.date|format_date(pattern='MMMM d, YYYY') }}</description>
15+
<link>https://www.firefox.com/en-US/firefox/{{ release.version }}/releasenotes/</link>
16+
<guid>https://www.firefox.com/en-US/firefox/{{ release.version }}/releasenotes/</guid>
17+
{% else %}
1218
<title>Firefox {{ release.version }}</title>
1319
<description>Firefox release {{ release.version }} shipped on {{ release.date|format_date(pattern='MMMM d, YYYY') }}
1420
{%- if release.platform == 'android' -%}&lt;br&gt;This is an Android-only release{% endif %}
@@ -19,6 +25,7 @@
1925
{% else %}
2026
<link>https://www.mozilla.org/en-US/firefox/{{ release.version }}/releasenotes/</link>
2127
<guid>https://www.mozilla.org/en-US/firefox/{{ release.version }}/releasenotes/</guid>
28+
{% endif %}
2229
{% endif %}
2330
<pubDate>{{ release.date }}</pubDate>
2431
</item>

‎tests/Functional/pages.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
['sitemap.txt', 200, '', ''],
3333
['release-notes/', 302, '', ''],
3434
['rss/', 200, '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">', '</item>'],
35+
['rss/esr/', 200, '<atom:link href="https://whattrainisitnow.com/rss/esr/"', '<title>Firefox ESR '],
3536
['api/firefox/calendar/future/?format=text', 200, 'Version,Nightly Start,Beta,Release Date,Release Owner', ''],
3637
['api/firefox/calendar/future/?format=csv', 200, 'Version,Nightly Start,Beta,Release Date,Release Owner', ''],
3738
];

‎tests/Unit/ReleaseInsights/RequestTest.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
['/release/owners', 'release_owners'],
4444
['/release-notes', 'relnotes_doc'],
4545
['/rss', 'rss'],
46+
['/rss/esr/', 'rss_esr'],
4647
['/sitemap/', 'sitemap'],
4748
['not a good path', '404'],
4849
['not/a/goodpath', '404'],

0 commit comments

Comments
 (0)