feat: flux RSS pagine (20 items/page), aliases /rss et /rss.xml, fix migration booleen PostgreSQL

This commit is contained in:
Cedric Abonnel
2026-05-08 22:58:26 +02:00
parent 9cde19fe42
commit 35503e43b0
56 changed files with 99 additions and 68 deletions
@@ -3,7 +3,7 @@
"slug": "bienvenue", "slug": "bienvenue",
"title": "Bienvenue", "title": "Bienvenue",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-04 07:30:00", "published_at": "2025-04-04 07:30:00",
"created_at": "2025-04-04 07:30:00", "created_at": "2025-04-04 07:30:00",
"updated_at": "2025-04-04 12:04:13", "updated_at": "2025-04-04 12:04:13",
@@ -3,7 +3,7 @@
"slug": "imagemagick-sous-debian-comprendre-convert-im6-magick-et-les-choix-de-conception", "slug": "imagemagick-sous-debian-comprendre-convert-im6-magick-et-les-choix-de-conception",
"title": "ImageMagick sous Debian : comprendre `convert-im6`, `magick` et les choix de conception", "title": "ImageMagick sous Debian : comprendre `convert-im6`, `magick` et les choix de conception",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-12-28 15:32:01", "published_at": "2025-12-28 15:32:01",
"created_at": "2025-12-28 15:32:01", "created_at": "2025-12-28 15:32:01",
"updated_at": "2025-12-28 15:32:01", "updated_at": "2025-12-28 15:32:01",
@@ -3,7 +3,7 @@
"slug": "clearview-ai-quand-l-intelligence-artificielle-depasse-les-limites-du-public", "slug": "clearview-ai-quand-l-intelligence-artificielle-depasse-les-limites-du-public",
"title": "Clearview AI : quand lintelligence artificielle dépasse les limites du « public »", "title": "Clearview AI : quand lintelligence artificielle dépasse les limites du « public »",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 07:15:36", "published_at": "2025-11-05 07:15:36",
"created_at": "2025-11-05 07:15:36", "created_at": "2025-11-05 07:15:36",
"updated_at": "2025-11-05 07:15:36", "updated_at": "2025-11-05 07:15:36",
@@ -3,7 +3,7 @@
"slug": "oh-tequila", "slug": "oh-tequila",
"title": "Oh Tequila !", "title": "Oh Tequila !",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-04 22:01:00", "published_at": "2025-11-04 22:01:00",
"created_at": "2025-11-04 22:01:00", "created_at": "2025-11-04 22:01:00",
"updated_at": "2025-11-04 22:01:00", "updated_at": "2025-11-04 22:01:00",
@@ -3,7 +3,7 @@
"slug": "imagemagick-le-couteau-suisse-de-la-manipulation-d-images-sous-linux", "slug": "imagemagick-le-couteau-suisse-de-la-manipulation-d-images-sous-linux",
"title": "ImageMagick : le couteau suisse de la manipulation dimages sous Linux", "title": "ImageMagick : le couteau suisse de la manipulation dimages sous Linux",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-12-28 14:56:14", "published_at": "2025-12-28 14:56:14",
"created_at": "2025-12-28 14:56:14", "created_at": "2025-12-28 14:56:14",
"updated_at": "2025-12-28 14:56:14", "updated_at": "2025-12-28 14:56:14",
@@ -3,7 +3,7 @@
"slug": "math-6eme", "slug": "math-6eme",
"title": "Math 6eme", "title": "Math 6eme",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-09 11:22:41", "published_at": "2025-11-09 11:22:41",
"created_at": "2025-11-09 11:22:41", "created_at": "2025-11-09 11:22:41",
"updated_at": "2025-11-09 11:22:41", "updated_at": "2025-11-09 11:22:41",
@@ -3,7 +3,7 @@
"slug": "les-histoires-folles-de-la-tech-resume", "slug": "les-histoires-folles-de-la-tech-resume",
"title": "Les histoires folles de la Tech - résumé", "title": "Les histoires folles de la Tech - résumé",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-04 21:59:40", "published_at": "2025-11-04 21:59:40",
"created_at": "2025-11-04 21:59:40", "created_at": "2025-11-04 21:59:40",
"updated_at": "2025-11-04 21:59:40", "updated_at": "2025-11-04 21:59:40",
@@ -3,7 +3,7 @@
"slug": "incident-acegrp-lan-1-numerique-gestion-alim", "slug": "incident-acegrp-lan-1-numerique-gestion-alim",
"title": "Incident acegrp.lan (1) : NUMERIQUE GESTION ALIM", "title": "Incident acegrp.lan (1) : NUMERIQUE GESTION ALIM",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-29 07:32:00", "published_at": "2025-04-29 07:32:00",
"created_at": "2025-04-29 07:32:00", "created_at": "2025-04-29 07:32:00",
"updated_at": "2025-04-29 06:22:05", "updated_at": "2025-04-29 06:22:05",
@@ -3,7 +3,7 @@
"slug": "la-4g-un-bond-en-avant-technologique", "slug": "la-4g-un-bond-en-avant-technologique",
"title": "La 4G : un bond en avant technologique", "title": "La 4G : un bond en avant technologique",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:42:20", "published_at": "2025-11-05 08:42:20",
"created_at": "2025-11-05 08:42:20", "created_at": "2025-11-05 08:42:20",
"updated_at": "2025-11-05 08:42:20", "updated_at": "2025-11-05 08:42:20",
@@ -3,7 +3,7 @@
"slug": "svt-6", "slug": "svt-6",
"title": "svt 6", "title": "svt 6",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-25 20:30:17", "published_at": "2025-11-25 20:30:17",
"created_at": "2025-11-25 20:30:17", "created_at": "2025-11-25 20:30:17",
"updated_at": "2025-11-25 20:30:17", "updated_at": "2025-11-25 20:30:17",
@@ -3,7 +3,7 @@
"slug": "l-histoire-du-million-de-dollars-offert-par-george-clooney", "slug": "l-histoire-du-million-de-dollars-offert-par-george-clooney",
"title": "L'histoire du million de dollars offert par George Clooney", "title": "L'histoire du million de dollars offert par George Clooney",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-04 22:02:12", "published_at": "2025-11-04 22:02:12",
"created_at": "2025-11-04 22:02:12", "created_at": "2025-11-04 22:02:12",
"updated_at": "2025-11-04 22:02:12", "updated_at": "2025-11-04 22:02:12",
@@ -3,7 +3,7 @@
"slug": "bienvenue-sur-varlog-carnet-de-bord-technique", "slug": "bienvenue-sur-varlog-carnet-de-bord-technique",
"title": "🎉 Bienvenue sur **varlog** Carnet de bord technique", "title": "🎉 Bienvenue sur **varlog** Carnet de bord technique",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-25 06:08:10", "published_at": "2025-05-25 06:08:10",
"created_at": "2025-05-25 06:08:10", "created_at": "2025-05-25 06:08:10",
"updated_at": "2025-05-25 06:08:10", "updated_at": "2025-05-25 06:08:10",
@@ -3,7 +3,7 @@
"slug": "convertir-des-images-en-ligne-de-commande-sous-linux", "slug": "convertir-des-images-en-ligne-de-commande-sous-linux",
"title": "Convertir des images en ligne de commande sous Linux", "title": "Convertir des images en ligne de commande sous Linux",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-12-28 14:54:41", "published_at": "2025-12-28 14:54:41",
"created_at": "2025-12-28 14:54:41", "created_at": "2025-12-28 14:54:41",
"updated_at": "2025-12-28 14:54:41", "updated_at": "2025-12-28 14:54:41",
@@ -3,7 +3,7 @@
"slug": "la-6g-au-dela-de-la-5g-promesses-et-interrogations", "slug": "la-6g-au-dela-de-la-5g-promesses-et-interrogations",
"title": "La 6G : au-delà de la 5G, promesses et interrogations", "title": "La 6G : au-delà de la 5G, promesses et interrogations",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:46:51", "published_at": "2025-11-05 08:46:51",
"created_at": "2025-11-05 08:46:51", "created_at": "2025-11-05 08:46:51",
"updated_at": "2025-11-05 08:46:51", "updated_at": "2025-11-05 08:46:51",
@@ -3,7 +3,7 @@
"slug": "priorites-et-acces-au-reseau-en-4g-et-5g", "slug": "priorites-et-acces-au-reseau-en-4g-et-5g",
"title": "Priorités et accès au réseau en 4G et 5G", "title": "Priorités et accès au réseau en 4G et 5G",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2026-01-06 22:21:04", "published_at": "2026-01-06 22:21:04",
"created_at": "2026-01-06 22:21:04", "created_at": "2026-01-06 22:21:04",
"updated_at": "2026-01-06 22:21:04", "updated_at": "2026-01-06 22:21:04",
@@ -3,7 +3,7 @@
"slug": "petits-colis-grands-impots-quand-la-taxation-punit-les-francais-sans-relancer-l-industrie", "slug": "petits-colis-grands-impots-quand-la-taxation-punit-les-francais-sans-relancer-l-industrie",
"title": "Petits colis, grands impôts : quand la taxation punit les Français sans relancer lindustrie", "title": "Petits colis, grands impôts : quand la taxation punit les Français sans relancer lindustrie",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-14 00:55:43", "published_at": "2025-11-14 00:55:43",
"created_at": "2025-11-14 00:55:43", "created_at": "2025-11-14 00:55:43",
"updated_at": "2025-11-14 00:55:43", "updated_at": "2025-11-14 00:55:43",
@@ -3,7 +3,7 @@
"slug": "configurer-un-client-oauth-2-0-dans-keycloak-guide-complet", "slug": "configurer-un-client-oauth-2-0-dans-keycloak-guide-complet",
"title": "🔐 Configurer un client OAuth 2.0 dans Keycloak : guide complet", "title": "🔐 Configurer un client OAuth 2.0 dans Keycloak : guide complet",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-16 23:33:31", "published_at": "2025-05-16 23:33:31",
"created_at": "2025-05-16 23:33:31", "created_at": "2025-05-16 23:33:31",
"updated_at": "2025-05-16 23:33:31", "updated_at": "2025-05-16 23:33:31",
@@ -3,7 +3,7 @@
"slug": "incident-acegrp-lan-2-tout-s-explique-enfin", "slug": "incident-acegrp-lan-2-tout-s-explique-enfin",
"title": "Incident acegrp.lan (2) : Tout sexplique enfin !", "title": "Incident acegrp.lan (2) : Tout sexplique enfin !",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-30 18:01:00", "published_at": "2025-04-30 18:01:00",
"created_at": "2025-04-30 18:01:00", "created_at": "2025-04-30 18:01:00",
"updated_at": "2025-05-01 04:30:09", "updated_at": "2025-05-01 04:30:09",
@@ -3,7 +3,7 @@
"slug": "nos-donnees-a-l-ere-de-l-ia-l-affaire-linkedin-et-la-colere-des-utilisateurs", "slug": "nos-donnees-a-l-ere-de-l-ia-l-affaire-linkedin-et-la-colere-des-utilisateurs",
"title": "Nos données à l’ère de lIA : laffaire LinkedIn et la colère des utilisateurs", "title": "Nos données à l’ère de lIA : laffaire LinkedIn et la colère des utilisateurs",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 07:10:37", "published_at": "2025-11-05 07:10:37",
"created_at": "2025-11-05 07:10:37", "created_at": "2025-11-05 07:10:37",
"updated_at": "2025-11-05 07:10:37", "updated_at": "2025-11-05 07:10:37",
@@ -3,7 +3,7 @@
"slug": "correction-et-reparation-d-une-installation-uptime-kuma", "slug": "correction-et-reparation-d-une-installation-uptime-kuma",
"title": "Correction et réparation dune installation Uptime Kuma", "title": "Correction et réparation dune installation Uptime Kuma",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-26 08:33:49", "published_at": "2025-11-26 08:33:49",
"created_at": "2025-11-26 08:33:49", "created_at": "2025-11-26 08:33:49",
"updated_at": "2025-11-26 08:33:49", "updated_at": "2025-11-26 08:33:49",
@@ -3,7 +3,7 @@
"slug": "github-copilot-l-assistant-qui-a-declenche-une-tempete", "slug": "github-copilot-l-assistant-qui-a-declenche-une-tempete",
"title": "GitHub Copilot, lassistant qui a déclenché une tempête", "title": "GitHub Copilot, lassistant qui a déclenché une tempête",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 07:17:49", "published_at": "2025-11-05 07:17:49",
"created_at": "2025-11-05 07:17:49", "created_at": "2025-11-05 07:17:49",
"updated_at": "2025-11-05 07:17:49", "updated_at": "2025-11-05 07:17:49",
@@ -3,7 +3,7 @@
"slug": "la-5g-promesse-derives-et-realite", "slug": "la-5g-promesse-derives-et-realite",
"title": "La 5G : promesse, dérivés et réalité", "title": "La 5G : promesse, dérivés et réalité",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:45:44", "published_at": "2025-11-05 08:45:44",
"created_at": "2025-11-05 08:45:44", "created_at": "2025-11-05 08:45:44",
"updated_at": "2025-11-05 08:45:44", "updated_at": "2025-11-05 08:45:44",
@@ -3,7 +3,7 @@
"slug": "duree-de-vie-du-ciment", "slug": "duree-de-vie-du-ciment",
"title": "Durée de vie du ciment", "title": "Durée de vie du ciment",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-04 14:13:00", "published_at": "2025-04-04 14:13:00",
"created_at": "2025-04-04 14:13:00", "created_at": "2025-04-04 14:13:00",
"updated_at": "2025-04-05 10:46:02", "updated_at": "2025-04-05 10:46:02",
@@ -3,7 +3,7 @@
"slug": "non-le-compteur-linky-ne-reconnait-pas-les-voitures-electriques", "slug": "non-le-compteur-linky-ne-reconnait-pas-les-voitures-electriques",
"title": "Non, le compteur Linky ne reconnaît pas les voitures électriques", "title": "Non, le compteur Linky ne reconnaît pas les voitures électriques",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-12-06 06:36:25", "published_at": "2025-12-06 06:36:25",
"created_at": "2025-12-06 06:36:25", "created_at": "2025-12-06 06:36:25",
"updated_at": "2025-12-06 06:36:25", "updated_at": "2025-12-06 06:36:25",
@@ -3,7 +3,7 @@
"slug": "tableau-section-cable-intensite-puissance-230-v-monophase-cuivre", "slug": "tableau-section-cable-intensite-puissance-230-v-monophase-cuivre",
"title": "Tableau section câble / intensité / puissance (230 V monophasé, cuivre)", "title": "Tableau section câble / intensité / puissance (230 V monophasé, cuivre)",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-09 21:48:35", "published_at": "2025-11-09 21:48:35",
"created_at": "2025-11-09 21:48:35", "created_at": "2025-11-09 21:48:35",
"updated_at": "2025-11-09 21:48:35", "updated_at": "2025-11-09 21:48:35",
@@ -3,7 +3,7 @@
"slug": "demarches-mgen", "slug": "demarches-mgen",
"title": "Démarches MGEN", "title": "Démarches MGEN",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 06:23:24", "published_at": "2025-11-05 06:23:24",
"created_at": "2025-11-05 06:23:24", "created_at": "2025-11-05 06:23:24",
"updated_at": "2025-11-05 06:23:24", "updated_at": "2025-11-05 06:23:24",
@@ -3,7 +3,7 @@
"slug": "souverainete-numerique-le-paradoxe-d-orange-face-aux-clouds-americains", "slug": "souverainete-numerique-le-paradoxe-d-orange-face-aux-clouds-americains",
"title": "Souveraineté numérique : le paradoxe dOrange face aux clouds américains", "title": "Souveraineté numérique : le paradoxe dOrange face aux clouds américains",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2026-01-16 11:17:19", "published_at": "2026-01-16 11:17:19",
"created_at": "2026-01-16 11:17:19", "created_at": "2026-01-16 11:17:19",
"updated_at": "2026-01-16 11:17:19", "updated_at": "2026-01-16 11:17:19",
@@ -3,7 +3,7 @@
"slug": "test-kobo-libra-colour", "slug": "test-kobo-libra-colour",
"title": "Test Kobo Libra Colour", "title": "Test Kobo Libra Colour",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-09 12:03:56", "published_at": "2025-11-09 12:03:56",
"created_at": "2025-11-09 12:03:56", "created_at": "2025-11-09 12:03:56",
"updated_at": "2025-11-09 12:03:56", "updated_at": "2025-11-09 12:03:56",
@@ -3,7 +3,7 @@
"slug": "installer-webmin-l-outil-d-administration-en-mode-web", "slug": "installer-webmin-l-outil-d-administration-en-mode-web",
"title": "Installer WEBMIN, l'outil d'administration en mode Web", "title": "Installer WEBMIN, l'outil d'administration en mode Web",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-13 11:57:05", "published_at": "2025-11-13 11:57:05",
"created_at": "2025-11-13 11:57:05", "created_at": "2025-11-13 11:57:05",
"updated_at": "2025-11-13 11:57:05", "updated_at": "2025-11-13 11:57:05",
@@ -3,7 +3,7 @@
"slug": "zigbee2mqtt-et-slzb-06m-soupcons-de-dysfonctionnements-redemarrages-frequents-et-effets-de-bord", "slug": "zigbee2mqtt-et-slzb-06m-soupcons-de-dysfonctionnements-redemarrages-frequents-et-effets-de-bord",
"title": "Zigbee2MQTT et SLZB-06M : soupçons de dysfonctionnements, redémarrages fréquents et effets de bord", "title": "Zigbee2MQTT et SLZB-06M : soupçons de dysfonctionnements, redémarrages fréquents et effets de bord",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-11 08:43:42", "published_at": "2025-04-11 08:43:42",
"created_at": "2025-04-11 08:43:42", "created_at": "2025-04-11 08:43:42",
"updated_at": "2025-04-11 08:43:42", "updated_at": "2025-04-11 08:43:42",
@@ -3,7 +3,7 @@
"slug": "rejet-des-mails-avec-l-en-tete-received-spf", "slug": "rejet-des-mails-avec-l-en-tete-received-spf",
"title": "Rejet des mails avec l'en-tête Received-SPF", "title": "Rejet des mails avec l'en-tête Received-SPF",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-20 16:46:00", "published_at": "2025-05-20 16:46:00",
"created_at": "2025-05-20 16:46:00", "created_at": "2025-05-20 16:46:00",
"updated_at": "2025-05-20 14:49:47", "updated_at": "2025-05-20 14:49:47",
@@ -3,7 +3,7 @@
"slug": "rdv-tech-2025-04-03", "slug": "rdv-tech-2025-04-03",
"title": "RDV Tech #2025.04.03", "title": "RDV Tech #2025.04.03",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-09 23:03:39", "published_at": "2025-04-09 23:03:39",
"created_at": "2025-04-09 23:03:39", "created_at": "2025-04-09 23:03:39",
"updated_at": "2025-04-09 23:03:39", "updated_at": "2025-04-09 23:03:39",
@@ -3,7 +3,7 @@
"slug": "de-zigbee2mqtt-a-proxmox-l-effet-papillon-d-un-switch-defaillant", "slug": "de-zigbee2mqtt-a-proxmox-l-effet-papillon-d-un-switch-defaillant",
"title": "De Zigbee2MQTT à Proxmox : leffet papillon dun switch défaillant", "title": "De Zigbee2MQTT à Proxmox : leffet papillon dun switch défaillant",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-25 06:01:36", "published_at": "2025-05-25 06:01:36",
"created_at": "2025-05-25 06:01:36", "created_at": "2025-05-25 06:01:36",
"updated_at": "2025-05-25 06:01:36", "updated_at": "2025-05-25 06:01:36",
@@ -3,7 +3,7 @@
"slug": "creer-son-propre-mini-framework-php-from-scratch", "slug": "creer-son-propre-mini-framework-php-from-scratch",
"title": "Créer son propre mini-framework PHP from scratch", "title": "Créer son propre mini-framework PHP from scratch",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-04 22:07:52", "published_at": "2025-11-04 22:07:52",
"created_at": "2025-11-04 22:07:52", "created_at": "2025-11-04 22:07:52",
"updated_at": "2025-11-04 22:07:52", "updated_at": "2025-11-04 22:07:52",
@@ -3,7 +3,7 @@
"slug": "la-3g-une-technologie-encore-efficace-mais-bridee", "slug": "la-3g-une-technologie-encore-efficace-mais-bridee",
"title": "La 3G : une technologie encore efficace… mais bridée", "title": "La 3G : une technologie encore efficace… mais bridée",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:40:01", "published_at": "2025-11-05 08:40:01",
"created_at": "2025-11-05 08:40:01", "created_at": "2025-11-05 08:40:01",
"updated_at": "2025-11-05 08:40:01", "updated_at": "2025-11-05 08:40:01",
@@ -3,7 +3,7 @@
"slug": "activer-les-mises-a-jour-automatiques-sur-debian-pour-une-gestion-simplifiee-des-correctifs-de-securite", "slug": "activer-les-mises-a-jour-automatiques-sur-debian-pour-une-gestion-simplifiee-des-correctifs-de-securite",
"title": "Activer les mises à jour automatiques sur Debian pour une gestion simplifiée des correctifs de sécurité", "title": "Activer les mises à jour automatiques sur Debian pour une gestion simplifiée des correctifs de sécurité",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2026-01-06 20:45:52", "published_at": "2026-01-06 20:45:52",
"created_at": "2026-01-06 20:45:52", "created_at": "2026-01-06 20:45:52",
"updated_at": "2026-01-06 20:45:52", "updated_at": "2026-01-06 20:45:52",
@@ -3,7 +3,7 @@
"slug": "home-assistant-la-version-2025-4-c-est-l-heure-de-continuer-les-tableaux-de-bord", "slug": "home-assistant-la-version-2025-4-c-est-l-heure-de-continuer-les-tableaux-de-bord",
"title": "Home Assistant : La version 2025.4 : C'est l'heure de continuer les tableaux de bord !", "title": "Home Assistant : La version 2025.4 : C'est l'heure de continuer les tableaux de bord !",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-01 06:20:00", "published_at": "2025-05-01 06:20:00",
"created_at": "2025-05-01 06:20:00", "created_at": "2025-05-01 06:20:00",
"updated_at": "2025-05-01 04:24:48", "updated_at": "2025-05-01 04:24:48",
@@ -3,7 +3,7 @@
"slug": "pourquoi-les-operateurs-brident-ils-la-3g", "slug": "pourquoi-les-operateurs-brident-ils-la-3g",
"title": "Pourquoi les opérateurs brident-ils la 3G ?", "title": "Pourquoi les opérateurs brident-ils la 3G ?",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:41:22", "published_at": "2025-11-05 08:41:22",
"created_at": "2025-11-05 08:41:22", "created_at": "2025-11-05 08:41:22",
"updated_at": "2025-11-05 08:41:22", "updated_at": "2025-11-05 08:41:22",
@@ -3,7 +3,7 @@
"slug": "les-annees-ou-les-mots-furent-vendus", "slug": "les-annees-ou-les-mots-furent-vendus",
"title": "Les années où les mots furent vendus", "title": "Les années où les mots furent vendus",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 07:17:02", "published_at": "2025-11-05 07:17:02",
"created_at": "2025-11-05 07:17:02", "created_at": "2025-11-05 07:17:02",
"updated_at": "2025-11-05 07:17:02", "updated_at": "2025-11-05 07:17:02",
@@ -3,7 +3,7 @@
"slug": "comment-casser-les-pattes-d-un-etudiant-plein-d-enthousiasme", "slug": "comment-casser-les-pattes-d-un-etudiant-plein-d-enthousiasme",
"title": "Comment casser les pattes dun étudiant plein denthousiasme", "title": "Comment casser les pattes dun étudiant plein denthousiasme",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-04 21:25:49", "published_at": "2025-11-04 21:25:49",
"created_at": "2025-11-04 21:25:49", "created_at": "2025-11-04 21:25:49",
"updated_at": "2025-11-04 21:25:49", "updated_at": "2025-11-04 21:25:49",
@@ -3,7 +3,7 @@
"slug": "debut-des-travaux-au-dernier-etage-relfexion-sur-l-isolation-sous-toiture", "slug": "debut-des-travaux-au-dernier-etage-relfexion-sur-l-isolation-sous-toiture",
"title": "Début des travaux au dernier étage - rélfexion sur l'isolation sous-toiture", "title": "Début des travaux au dernier étage - rélfexion sur l'isolation sous-toiture",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-05 22:40:00", "published_at": "2025-04-05 22:40:00",
"created_at": "2025-04-05 22:40:00", "created_at": "2025-04-05 22:40:00",
"updated_at": "2025-04-06 07:23:27", "updated_at": "2025-04-06 07:23:27",
@@ -3,7 +3,7 @@
"slug": "la-smart-brick-de-lego-quand-la-brique-devient-intelligente", "slug": "la-smart-brick-de-lego-quand-la-brique-devient-intelligente",
"title": "La Smart Brick de LEGO : quand la brique devient intelligente", "title": "La Smart Brick de LEGO : quand la brique devient intelligente",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2026-01-13 20:26:53", "published_at": "2026-01-13 20:26:53",
"created_at": "2026-01-13 20:26:53", "created_at": "2026-01-13 20:26:53",
"updated_at": "2026-01-13 20:26:53", "updated_at": "2026-01-13 20:26:53",
@@ -3,7 +3,7 @@
"slug": "gitea-prerequis", "slug": "gitea-prerequis",
"title": "gitea, prérequis", "title": "gitea, prérequis",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-07 10:57:33", "published_at": "2025-11-07 10:57:33",
"created_at": "2025-11-07 10:57:33", "created_at": "2025-11-07 10:57:33",
"updated_at": "2025-11-07 10:57:33", "updated_at": "2025-11-07 10:57:33",
@@ -3,7 +3,7 @@
"slug": "api-first-concevoir-ses-applications-autrement", "slug": "api-first-concevoir-ses-applications-autrement",
"title": "🚀 API-First : Concevoir ses applications autrement", "title": "🚀 API-First : Concevoir ses applications autrement",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-16 23:16:00", "published_at": "2025-05-16 23:16:00",
"created_at": "2025-05-16 23:16:00", "created_at": "2025-05-16 23:16:00",
"updated_at": "2025-05-16 21:19:41", "updated_at": "2025-05-16 21:19:41",
@@ -3,7 +3,7 @@
"slug": "forum-alpinux", "slug": "forum-alpinux",
"title": "Forum Alpinux", "title": "Forum Alpinux",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-04 07:45:00", "published_at": "2025-04-04 07:45:00",
"created_at": "2025-04-04 07:45:00", "created_at": "2025-04-04 07:45:00",
"updated_at": "2025-04-04 12:10:37", "updated_at": "2025-04-04 12:10:37",
@@ -3,7 +3,7 @@
"slug": "les-strategies-de-migration-4g", "slug": "les-strategies-de-migration-4g",
"title": "Les stratégies de migration 4G", "title": "Les stratégies de migration 4G",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:43:31", "published_at": "2025-11-05 08:43:31",
"created_at": "2025-11-05 08:43:31", "created_at": "2025-11-05 08:43:31",
"updated_at": "2025-11-05 08:43:31", "updated_at": "2025-11-05 08:43:31",
@@ -3,7 +3,7 @@
"slug": "travaux-de-gros-oeuvres", "slug": "travaux-de-gros-oeuvres",
"title": "Travaux de gros œuvres", "title": "Travaux de gros œuvres",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-04 13:46:00", "published_at": "2025-04-04 13:46:00",
"created_at": "2025-04-04 13:46:00", "created_at": "2025-04-04 13:46:00",
"updated_at": "2025-04-04 12:04:31", "updated_at": "2025-04-04 12:04:31",
@@ -3,7 +3,7 @@
"slug": "domotique-les-vrais-problemes-en-domotique-zigbee-home-assistant", "slug": "domotique-les-vrais-problemes-en-domotique-zigbee-home-assistant",
"title": "Domotique : les vrais problèmes en domotique Zigbee & Home Assistant", "title": "Domotique : les vrais problèmes en domotique Zigbee & Home Assistant",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2026-05-22 18:00:00", "published_at": "2026-05-22 18:00:00",
"created_at": "2026-05-22 18:00:00", "created_at": "2026-05-22 18:00:00",
"updated_at": "2025-05-01 06:11:58", "updated_at": "2025-05-01 06:11:58",
@@ -3,7 +3,7 @@
"slug": "quand-la-3g-suffisait-et-qu-on-vous-fait-basculer", "slug": "quand-la-3g-suffisait-et-qu-on-vous-fait-basculer",
"title": "Quand la 3G suffisait… et quon vous fait basculer", "title": "Quand la 3G suffisait… et quon vous fait basculer",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:38:25", "published_at": "2025-11-05 08:38:25",
"created_at": "2025-11-05 08:38:25", "created_at": "2025-11-05 08:38:25",
"updated_at": "2025-11-05 08:38:25", "updated_at": "2025-11-05 08:38:25",
@@ -3,7 +3,7 @@
"slug": "test-kobo-elipsa-2e", "slug": "test-kobo-elipsa-2e",
"title": "Test KoboElipsa2E", "title": "Test KoboElipsa2E",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-09 12:07:00", "published_at": "2025-11-09 12:07:00",
"created_at": "2025-11-09 12:07:00", "created_at": "2025-11-09 12:07:00",
"updated_at": "2025-11-09 12:07:00", "updated_at": "2025-11-09 12:07:00",
@@ -3,7 +3,7 @@
"slug": "duree-de-vie-du-platre", "slug": "duree-de-vie-du-platre",
"title": "Durée de vie du plâtre", "title": "Durée de vie du plâtre",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-04-05 12:39:34", "published_at": "2025-04-05 12:39:34",
"created_at": "2025-04-05 12:39:34", "created_at": "2025-04-05 12:39:34",
"updated_at": "2025-04-05 12:39:34", "updated_at": "2025-04-05 12:39:34",
@@ -3,7 +3,7 @@
"slug": "domotique-invitation-a-comprendre-avant-d-installer", "slug": "domotique-invitation-a-comprendre-avant-d-installer",
"title": "Domotique : invitation à comprendre avant dinstaller", "title": "Domotique : invitation à comprendre avant dinstaller",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-05-15 18:00:00", "published_at": "2025-05-15 18:00:00",
"created_at": "2025-05-15 18:00:00", "created_at": "2025-05-15 18:00:00",
"updated_at": "2025-05-01 04:29:30", "updated_at": "2025-05-01 04:29:30",
@@ -3,7 +3,7 @@
"slug": "50g-pon-la-fibre-optique-du-futur", "slug": "50g-pon-la-fibre-optique-du-futur",
"title": "50G-PON : la fibre optique du futur", "title": "50G-PON : la fibre optique du futur",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-05 08:48:01", "published_at": "2025-11-05 08:48:01",
"created_at": "2025-11-05 08:48:01", "created_at": "2025-11-05 08:48:01",
"updated_at": "2025-11-05 08:48:01", "updated_at": "2025-11-05 08:48:01",
@@ -3,7 +3,7 @@
"slug": "gitea-l-installation", "slug": "gitea-l-installation",
"title": "gitea, l'installation", "title": "gitea, l'installation",
"author": "cedric@abonnel.fr", "author": "cedric@abonnel.fr",
"published": false, "published": true,
"published_at": "2025-11-07 11:01:57", "published_at": "2025-11-07 11:01:57",
"created_at": "2025-11-07 11:01:57", "created_at": "2025-11-07 11:01:57",
"updated_at": "2025-11-07 11:01:57", "updated_at": "2025-11-07 11:01:57",
+4 -2
View File
@@ -11,8 +11,10 @@ RewriteRule ^ - [L]
# URL propre pour les articles : /post/<slug> # URL propre pour les articles : /post/<slug>
RewriteRule ^post/([a-z0-9][a-z0-9-]*)/?$ /index.php?action=view&slug=$1 [L,QSA] RewriteRule ^post/([a-z0-9][a-z0-9-]*)/?$ /index.php?action=view&slug=$1 [L,QSA]
# Flux RSS # Flux RSS — /feed, /rss et /rss.xml pointent tous vers feed.php
RewriteRule ^feed/?$ /feed.php [L] RewriteRule ^feed/?$ /feed.php [L,QSA]
RewriteRule ^rss/?$ /feed.php [L,QSA]
RewriteRule ^rss\.xml$ /feed.php [L,QSA]
# Ajoute .php si le fichier correspondant existe # Ajoute .php si le fichier correspondant existe
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
+36 -7
View File
@@ -14,20 +14,29 @@ require_once BASE_PATH . '/src/auth.php';
require_once BASE_PATH . '/config/config.php'; require_once BASE_PATH . '/config/config.php';
require_once BASE_PATH . '/src/ArticleManager.php'; require_once BASE_PATH . '/src/ArticleManager.php';
const FEED_PAGE_SIZE = 20;
$articles = new ArticleManager(BASE_PATH . '/data'); $articles = new ArticleManager(BASE_PATH . '/data');
$now = time(); $now = time();
$base = rtrim(APP_URL, '/'); $base = rtrim(APP_URL, '/');
$items = array_filter( $all = array_values(array_filter(
$articles->getAll(publishedOnly: true), $articles->getAll(publishedOnly: true),
static fn (array $a): bool => strtotime((string)($a['published_at'] ?? '')) <= $now static fn (array $a): bool => strtotime((string)($a['published_at'] ?? '')) <= $now
); ));
$total = count($all);
$lastPage = max(1, (int)ceil($total / FEED_PAGE_SIZE));
$page = max(1, min($lastPage, (int)($_GET['page'] ?? 1)));
$items = array_slice($all, ($page - 1) * FEED_PAGE_SIZE, FEED_PAGE_SIZE);
$feedUrl = static fn (int $p): string => $base . '/feed' . ($p > 1 ? '?page=' . $p : '');
$lastBuild = ''; $lastBuild = '';
foreach ($items as $a) { foreach ($all as $a) {
$ts = strtotime((string)($a['updated_at'] ?? $a['published_at'] ?? '')); $ts = (int)strtotime((string)($a['updated_at'] ?? $a['published_at'] ?? ''));
if ($ts && $ts > strtotime($lastBuild ?: '1970-01-01')) { if ($ts > (int)strtotime($lastBuild ?: '1970-01-01')) {
$lastBuild = date(DATE_RSS, $ts); $lastBuild = date(DATE_RSS, $ts);
} }
} }
@@ -40,14 +49,34 @@ header('X-Content-Type-Options: nosniff');
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
?> ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:fh="http://purl.org/syndication/history/1.0">
<channel> <channel>
<title>varlog</title> <title>varlog</title>
<link><?= htmlspecialchars($base) ?></link> <link><?= htmlspecialchars($base) ?></link>
<description>Journal personnel de Cédrix — informatique, hack et loisirs techniques.</description> <description>Journal personnel de Cédrix — informatique, hack et loisirs techniques.</description>
<language>fr</language> <language>fr</language>
<lastBuildDate><?= htmlspecialchars($lastBuild) ?></lastBuildDate> <lastBuildDate><?= htmlspecialchars($lastBuild) ?></lastBuildDate>
<atom:link href="<?= htmlspecialchars($base . '/feed') ?>" rel="self" type="application/rss+xml"/>
<!-- Flux canonique (toujours page 1) -->
<atom:link href="<?= htmlspecialchars($feedUrl(1)) ?>" rel="self" type="application/rss+xml"/>
<?php if ($page > 1): ?>
<!-- Navigation entre pages -->
<atom:link href="<?= htmlspecialchars($feedUrl(1)) ?>" rel="first" type="application/rss+xml"/>
<atom:link href="<?= htmlspecialchars($feedUrl($page - 1)) ?>" rel="previous" type="application/rss+xml"/>
<?php endif; ?>
<?php if ($page < $lastPage): ?>
<atom:link href="<?= htmlspecialchars($feedUrl($page + 1)) ?>" rel="next" type="application/rss+xml"/>
<atom:link href="<?= htmlspecialchars($feedUrl($lastPage)) ?>" rel="last" type="application/rss+xml"/>
<?php endif; ?>
<?php if ($lastPage > 1): ?>
<!-- Métadonnées de pagination (RFC 5005) -->
<fh:archive/>
<?php endif; ?>
<?php foreach ($items as $article): <?php foreach ($items as $article):
$pubDate = date(DATE_RSS, (int)strtotime((string)($article['published_at'] ?? $article['created_at'] ?? ''))); $pubDate = date(DATE_RSS, (int)strtotime((string)($article['published_at'] ?? $article['created_at'] ?? '')));
$link = $base . '/post/' . rawurlencode($article['slug'] ?? ''); $link = $base . '/post/' . rawurlencode($article['slug'] ?? '');