fix: actualités — tri chronologique cassé + 3 flux RSS morts remplacés

Tri (lib/newsfeed.ts + components/NewsTab.tsx) :
Un bonus "+3h pour les catégories prioritaires" (Guerre/Chef d'État/Crise…)
était appliqué avant le tri par date. En temps normal ça remonte discrètement
une poignée d'articles importants ; mais en période de crise soutenue (conflit
Moyen-Orient actuel), la quasi-totalité des articles matche une de ces
catégories — le bonus s'applique presque partout et casse l'ordre
chronologique au lieu de l'affiner, produisant des blocs par source de plus en
plus vieux au lieu d'un flux unique correctement entrelacé. Vérifié en direct :
54 articles avant fix avec des dizaines d'inversions chronologiques, 0 après.
Le badge visuel " Prioritaire" reste pour signaler l'importance sans trahir
la fraîcheur réelle.

Flux RSS (lib/newsfeed.ts RSS_FEEDS) — 3 des 6 sources ne contribuaient plus
rien, vérifié en direct :
  - ForexLive : /feed/news est une coquille vide (0 <item>) depuis leur
    migration Nuxt.js vers investinglive.com — déjà couvert par le scraper
    dédié fetchInvestingLiveNews(), aucune perte réelle en le retirant.
  - MarketWatch : l'ancien miroir dowjones.io ne sert que des articles vieux
    de 1+ an (filtrés par le cutoff 8 jours) → remplacé par l'URL RSS actuelle
    (marketwatch.com/rss/topstories, testée fraîche).
  - Reuters : feeds.reuters.com n'existe plus (échec DNS, fermé par Reuters il
    y a plusieurs années) → remplacé par CNBC Markets (testé frais).

Bloomberg (403 anti-bot) et FinancialJuice (site restructuré) restent à zéro,
déjà connu et accepté (échecs silencieux gérés par try/catch).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
caty21
2026-07-08 18:49:16 +02:00
parent 062892c340
commit 7c9b6ac89d
4 changed files with 35 additions and 25 deletions
+10 -8
View File
@@ -55,7 +55,7 @@ const HIGH_PRIO = new Set([
const SOURCE_COLORS: Record<string, string> = {
"InvestingLive": "bg-amber-500/20 text-amber-400",
"Reuters": "bg-orange-500/20 text-orange-400",
"CNBC": "bg-orange-500/20 text-orange-400",
"Bloomberg Economics": "bg-sky-500/20 text-sky-400",
"Bloomberg CB": "bg-sky-500/20 text-sky-400",
"Bloomberg FX": "bg-sky-500/20 text-sky-400",
@@ -72,14 +72,16 @@ function formatRelativeTime(isoDate: string): string {
}
// ── Tri ───────────────────────────────────────────────────────────────────────
// Score plus élevé = apparaît en premier.
// Récence primaire → haute priorité (+3h) → catégorisé (+1h) → bruit sans catégorie (0)
// Strictement chronologique (score = timestamp). Un bonus "+3h prioritaire /
// +1h catégorisé" existait ici, mais en période de crise soutenue la quasi-
// totalité des articles matche une catégorie prioritaire (Guerre/Géopolitique/
// Chef d'État) : le bonus s'applique alors presque partout et casse l'ordre
// chronologique au lieu de l'affiner (des articles plus vieux mais
// "prioritaires" passent devant des articles réellement plus récents). Le
// badge visuel "⚡ Prioritaire" (NewsCard) signale déjà l'importance sans
// trahir la fraîcheur réelle du flux.
function scoreItem(item: NewsItem): number {
const t = new Date(item.publishedAt).getTime();
const isPrio = item.categories.some(c => HIGH_PRIO.has(c));
const hasCat = item.categories.length > 0 || item.impacts.length > 0;
return t + (isPrio ? 3 * 3_600_000 : hasCat ? 1 * 3_600_000 : 0);
return new Date(item.publishedAt).getTime();
}
// ── Composant principal ───────────────────────────────────────────────────────