Fix: Affichage articles RSS du plus récent au plus ancien

Correction de l'ordre d'affichage :
- Supprime le .reverse() dans loadRssArticles()
- Les articles s'affichent maintenant du plus récent au plus ancien
- Correspond au comportement standard d'un lecteur RSS

Résout le problème où les nouveaux articles (13 nov) étaient
à la fin et nécessitaient de paginer jusqu'à la dernière page.
Maintenant les articles les plus récents apparaissent en premier.

Ajout de scripts utilitaires :
- check-rss-dates.js : Vérifie les dates des articles en DB
- init-rss-feeds.js : Initialise des flux RSS par défaut
- force-refresh-rss.js : Force une mise à jour manuelle
This commit is contained in:
Claude committed 2025-11-13 18:54:53 +00:00
1 parent acd749b9d2
commit 87d50920d7
4 files changed
+238 -2

No files matched your search

+74
View File
@@ -0,0 +1,74 @@
// Script pour vérifier les dates des articles RSS
const { getAll, initDatabase } = require('../config/database');
async function checkRssDates() {
console.log('\n==================== VÉRIFICATION DATES RSS ====================\n');
try {
await initDatabase();
// Vérifier le nombre total d'articles
const total = await getAll('SELECT COUNT(*) as count FROM rss_articles');
console.log(`📊 Total articles en base: ${total[0]?.count || 0}\n`);
// Vérifier les 10 derniers articles par date
const recent = await getAll(`
SELECT
a.title,
a.pub_date,
a.created_at,
f.title as feed_title,
a.link
FROM rss_articles a
LEFT JOIN rss_feeds f ON a.feed_id = f.id
ORDER BY a.pub_date DESC
LIMIT 10
`);
console.log('📅 10 articles les plus récents (par pub_date):');
recent.forEach((article, i) => {
const pubDate = new Date(article.pub_date);
const createdDate = new Date(article.created_at);
console.log(`\n${i + 1}. ${article.title}`);
console.log(` Source: ${article.feed_title || 'Inconnu'}`);
console.log(` Date publication: ${pubDate.toLocaleString('fr-FR')}`);
console.log(` Date ajout DB: ${createdDate.toLocaleString('fr-FR')}`);
});
// Vérifier les flux
console.log('\n\n📰 Flux RSS configurés:');
const feeds = await getAll('SELECT * FROM rss_feeds WHERE enabled = 1');
feeds.forEach(feed => {
console.log(`\n- ${feed.title || feed.url}`);
console.log(` URL: ${feed.url}`);
console.log(` Dernière mise à jour: ${feed.last_fetched_at || 'jamais'}`);
});
// Compter articles par flux
console.log('\n\n📈 Articles par flux:');
const counts = await getAll(`
SELECT
f.title,
COUNT(a.id) as count,
MAX(a.pub_date) as latest
FROM rss_feeds f
LEFT JOIN rss_articles a ON f.id = a.feed_id
WHERE f.enabled = 1
GROUP BY f.id
`);
counts.forEach(c => {
const latest = c.latest ? new Date(c.latest).toLocaleString('fr-FR') : 'aucun';
console.log(`\n${c.title}: ${c.count} articles`);
console.log(` Plus récent: ${latest}`);
});
console.log('\n\n========================================================\n');
} catch (error) {
console.error('❌ Erreur:', error);
}
process.exit(0);
}
checkRssDates();
+58
View File
@@ -0,0 +1,58 @@
// Script pour forcer la mise à jour des flux RSS et afficher les résultats
const { fetchAllFeeds } = require('../services/rss-scheduler');
const { getAll } = require('../config/database');
const logger = require('../config/logger');
async function forceRefresh() {
console.log('\n==================== MISE À JOUR FORCÉE RSS ====================\n');
try {
console.log('⏳ Lancement de la mise à jour...\n');
// Forcer la mise à jour
await fetchAllFeeds();
console.log('\n📊 Vérification de la base de données...\n');
// Afficher les statistiques
const total = await getAll('SELECT COUNT(*) as count FROM rss_articles');
console.log(`📄 Total articles: ${total[0]?.count || 0}`);
// Afficher les 10 derniers
const recent = await getAll(`
SELECT
a.title,
a.pub_date,
f.title as feed_title
FROM rss_articles a
LEFT JOIN rss_feeds f ON a.feed_id = f.id
ORDER BY a.pub_date DESC
LIMIT 10
`);
if (recent.length > 0) {
console.log('\n📅 10 articles les plus récents:\n');
recent.forEach((article, i) => {
const pubDate = new Date(article.pub_date);
const now = new Date();
const diffHours = Math.round((now - pubDate) / (1000 * 60 * 60));
console.log(`${i + 1}. ${article.title}`);
console.log(` Source: ${article.feed_title || 'Inconnu'}`);
console.log(` Date: ${pubDate.toLocaleString('fr-FR')} (il y a ${diffHours}h)`);
console.log('');
});
} else {
console.log('\n⚠️ Aucun article dans la base de données');
}
console.log('========================================================\n');
} catch (error) {
console.error('❌ Erreur:', error);
}
process.exit(0);
}
forceRefresh();
+104
View File
@@ -0,0 +1,104 @@
// Script pour initialiser des flux RSS par défaut
const Parser = require('rss-parser');
const { getAll, runQuery, initDatabase } = require('../config/database');
const logger = require('../config/logger');
const parser = new Parser({
timeout: 10000,
headers: {
'User-Agent': 'NoteFlow RSS Reader'
}
});
const DEFAULT_FEEDS = [
'https://news.google.com/rss/search?tbm=nws&q=NBA&oq=NBA&scoring=n&hl=fr&gl=FR&ceid=FR:fr',
'https://dwh.lequipe.fr/api/edito/rss?path=/Basket/Nba/',
'https://fresh.vonrodbox.eu/i/?a=rss&user=Michael&token=Lapin2509&hours=168'
];
async function initFeeds() {
console.log('\n==================== INITIALISATION FLUX RSS ====================\n');
try {
await initDatabase();
// Vérifier les flux existants
const existing = await getAll('SELECT * FROM rss_feeds');
console.log(`📰 Flux existants: ${existing.length}\n`);
for (const url of DEFAULT_FEEDS) {
try {
// Vérifier si le flux existe déjà
const exists = existing.find(f => f.url === url);
if (exists) {
console.log(`⏭️ Flux déjà présent: ${exists.title || url}`);
continue;
}
console.log(`⏳ Ajout du flux: ${url}`);
// Parser le flux
const feed = await parser.parseURL(url);
// Ajouter le flux
const result = await runQuery(
'INSERT INTO rss_feeds (url, title, description, enabled) VALUES (?, ?, ?, 1)',
[url, feed.title || url, feed.description || '']
);
console.log(`✅ Flux ajouté: ${feed.title}`);
console.log(` Articles disponibles: ${feed.items.length}`);
// Ajouter les articles (limiter à 100)
const items = feed.items.slice(0, 100);
let addedCount = 0;
for (const item of items) {
try {
if (!item.link) continue;
await runQuery(
'INSERT INTO rss_articles (feed_id, title, link, description, pub_date, content) VALUES (?, ?, ?, ?, ?, ?)',
[
result.id,
item.title || 'Sans titre',
item.link,
item.contentSnippet || item.description || '',
item.pubDate || item.isoDate || new Date().toISOString(),
item.content || item['content:encoded'] || ''
]
);
addedCount++;
} catch (err) {
// Ignorer les doublons
if (!err.message.includes('UNIQUE')) {
console.log(` ⚠️ Article ignoré: ${err.message}`);
}
}
}
console.log(` Articles ajoutés: ${addedCount}\n`);
} catch (error) {
console.error(`❌ Erreur avec ${url}:`, error.message, '\n');
}
}
// Résumé final
const finalFeeds = await getAll('SELECT COUNT(*) as count FROM rss_feeds WHERE enabled = 1');
const finalArticles = await getAll('SELECT COUNT(*) as count FROM rss_articles');
console.log('========================================================');
console.log(`✅ Initialisation terminée!`);
console.log(`📰 Flux actifs: ${finalFeeds[0].count}`);
console.log(`📄 Articles en base: ${finalArticles[0].count}`);
console.log('========================================================\n');
} catch (error) {
console.error('❌ Erreur lors de l\'initialisation:', error);
}
process.exit(0);
}
initFeeds();