Feed RSS : inclure l'image de couverture des articles #90

Closed
opened 2026-05-16 08:55:14 +00:00 by cedricAbonnel · 0 comments
Owner

Contexte

Les articles peuvent avoir une image de couverture (champ cover dans meta.json + champ og_image URL absolue). Ces images sont affichées sur le site (section « Meilleures audiences », liste des articles…) mais absentes du feed RSS (public/feed.php). Un lecteur RSS ne voit donc que le texte, sans illustration.

Données disponibles dans ArticleManager::getAll()

Champ Contenu
og_image URL absolue (ex : https://www.abonnel.fr/file?uuid=…&name=cover.jpg) — renseignée à la publication
cover Nom de fichier local (ex : cover.jpg) — toujours présent si une image a été uploadée
uuid UUID de l'article — permet de reconstruire l'URL si og_image est vide

Stratégie de résolution de l'URL image dans feed.php :

$imgUrl = trim($article['og_image'] ?? '');
if ($imgUrl === '' && ($article['cover'] ?? '') !== '') {
    $imgUrl = rtrim(APP_URL, '/')
        . '/file?uuid=' . rawurlencode($article['uuid'])
        . '&name=' . rawurlencode($article['cover']);
}

Solution retenue : namespace media: (RSS Media)

Le namespace http://search.yahoo.com/mrss/ est le standard de fait pour les images dans RSS. Il est reconnu par Feedly, Inoreader, NetNewsWire, etc.

1. Ajouter le namespace dans <rss>

<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:fh="http://purl.org/syndication/history/1.0">

2. Ajouter <media:content> dans chaque <item>

<?php if ($imgUrl !== ''): ?>
<media:content url="<?= htmlspecialchars($imgUrl, ENT_XML1) ?>" medium="image"/>
<?php endif; ?>

Fichier à modifier

public/feed.php — deux endroits :

  1. Attribut xmlns:media sur la balise <rss> (ligne ~80)
  2. Balise <media:content> dans la boucle foreach ($items as $article) (après <guid>, ligne ~124)

Compatibilité

Client Support media:content
Feedly (affiche l'image en vignette)
Inoreader
NetNewsWire
RSS.app
Thunderbird
Lecteurs simples ignorent silencieusement la balise inconnue

Critères d'acceptation

  • xmlns:media présent dans <rss>
  • <media:content url="…" medium="image"/> présent pour chaque article ayant une image
  • URL construite depuis og_image si disponible, sinon depuis cover + uuid
  • Articles sans image : balise absente (pas d'URL vide)
  • Feed validé sur https://www.rssboard.org/rss-validator ou équivalent
  • Image visible dans Feedly / NetNewsWire
  • Testé sur http://abonnel-wiki.acegrp.lan
## Contexte Les articles peuvent avoir une image de couverture (champ `cover` dans `meta.json` + champ `og_image` URL absolue). Ces images sont affichées sur le site (section « Meilleures audiences », liste des articles…) mais **absentes du feed RSS** (`public/feed.php`). Un lecteur RSS ne voit donc que le texte, sans illustration. ## Données disponibles dans `ArticleManager::getAll()` | Champ | Contenu | |---|---| | `og_image` | URL absolue (ex : `https://www.abonnel.fr/file?uuid=…&name=cover.jpg`) — renseignée à la publication | | `cover` | Nom de fichier local (ex : `cover.jpg`) — toujours présent si une image a été uploadée | | `uuid` | UUID de l'article — permet de reconstruire l'URL si `og_image` est vide | Stratégie de résolution de l'URL image dans `feed.php` : ```php $imgUrl = trim($article['og_image'] ?? ''); if ($imgUrl === '' && ($article['cover'] ?? '') !== '') { $imgUrl = rtrim(APP_URL, '/') . '/file?uuid=' . rawurlencode($article['uuid']) . '&name=' . rawurlencode($article['cover']); } ``` ## Solution retenue : namespace `media:` (RSS Media) Le namespace `http://search.yahoo.com/mrss/` est le standard de fait pour les images dans RSS. Il est reconnu par Feedly, Inoreader, NetNewsWire, etc. ### 1. Ajouter le namespace dans `<rss>` ```xml <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:fh="http://purl.org/syndication/history/1.0"> ``` ### 2. Ajouter `<media:content>` dans chaque `<item>` ```xml <?php if ($imgUrl !== ''): ?> <media:content url="<?= htmlspecialchars($imgUrl, ENT_XML1) ?>" medium="image"/> <?php endif; ?> ``` ## Fichier à modifier `public/feed.php` — deux endroits : 1. Attribut `xmlns:media` sur la balise `<rss>` (ligne ~80) 2. Balise `<media:content>` dans la boucle `foreach ($items as $article)` (après `<guid>`, ligne ~124) ## Compatibilité | Client | Support `media:content` | |---|---| | Feedly | ✅ (affiche l'image en vignette) | | Inoreader | ✅ | | NetNewsWire | ✅ | | RSS.app | ✅ | | Thunderbird | ✅ | | Lecteurs simples | ignorent silencieusement la balise inconnue | ## Critères d'acceptation - [ ] `xmlns:media` présent dans `<rss>` - [ ] `<media:content url="…" medium="image"/>` présent pour chaque article ayant une image - [ ] URL construite depuis `og_image` si disponible, sinon depuis `cover` + `uuid` - [ ] Articles sans image : balise absente (pas d'URL vide) - [ ] Feed validé sur https://www.rssboard.org/rss-validator ou équivalent - [ ] Image visible dans Feedly / NetNewsWire - [ ] Testé sur http://abonnel-wiki.acegrp.lan
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#90