mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
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:
4 files changed
+238
-2
No files matched your search
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
Reference in new issue
Block a user