- Recurring events share one UID across all occurrences (confirmed via
the API: same UID, different start dates), which produced duplicate
<guid> values the RSS spec forbids. Suffix the guid with the
occurrence's start date to make it unique per occurrence.
- Add atom:link rel="self" to the channel, per the validator's
recommendation, in both the PHP and Python implementations.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Two bugs found by testing real links from the feed:
- Link format was wrong (?news=<internal-id>), landing on the general
listing instead of the article. Traced the real network call the site
makes when opening an item and found the actual pattern:
/actualites/<slug>?u=<UID> (agenda: /agenda/<slug>?u=<UID>), where the
JS router reads the `u` query param to fetch @results?UID=...&fullobjects=1.
- Description only used the short teaser (description_fr) even though the
API response already includes the full rich-text body (text_fr.data) and
attachments (items[].file.download) in the same call — no extra request
needed, just wasn't being used.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same imio.smartweb JSON API as the Python script, but each feed regenerates
on demand (15 min file cache) instead of via cron, so it works on plain
PHP shared hosting with no server config access. Also adds facebook.php,
a caching proxy for the user's FetchRSS Atom feed so all three feeds live
under one domain and can be shared as stable URLs.
Tested with PHP 8.3 CLI: valid XML, real data (40 news, 12 events, proxied
Facebook feed).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>