update(indieblog) enrich exclusion rules and add dry-run
This commit is contained in:
parent
b99cad80be
commit
c6b78460a4
@ -1,5 +1,5 @@
|
||||
<?php
|
||||
|
||||
// php /app/data/scripts/generate_indieblog_daily_rss.php dry-run max-results=150
|
||||
// Configuration
|
||||
$jsonUrl = "https://indieblog.page/export";
|
||||
$rssFile = "/app/data/public/indieblogv2_feed.xml";
|
||||
@ -8,19 +8,32 @@ $cutoffDate = strtotime('-10 days'); // Seulement les 10 derniers jours
|
||||
|
||||
// Liste des mots/expressions à exclure (insensibilité à la casse activée avec `(?i)`)
|
||||
$excludePatterns = [
|
||||
'(?i)(azure|powershell|rimworld|Olympique|Olympic|Paris 2024|sportif|windows|twitter|freebsd|mastodon)',
|
||||
'(?i)(metalcore|deathcore|death metal|black metal|death punk|deathpunk|djent|blackmetal|blackened)',
|
||||
'(?i)(JO|foot|automated archives|announcing systemd)',
|
||||
'(?i)(guerre|bluesky|combat|terror|craindre|fear|décliner|declin|climat|inégalité|fuite|ont fui|a fui|musk|tesla|voitures|dying|indifference|feux|abandon|chômage|scam|arnaque|fraud|craindre|inquiét|openai|victime|violence|violent|violemm|pénurie|impôt|taxes|deuil|chasse|bombes|a perdu|vide exist|fake|poursuivi|subir|pauvre|riches|politique|politic|Macron|marine le pen|michel barnier|zemmour|Matignon|tremble|aucun n\'a|décès|crise|difficile|marre|action contre|irrecevable|pollution|élimination|pourrai|tourisme|mauvaise humeur|stress|dangereux|détruit|insupportable|de droite|souffre|chaleur|cyber|attaque|extrême.droite|risque|travail|offensi|sacrif|canard pc|photos|videos|crisis|trump|nocif|negatif|négative|pollution|poids|plainte|escro|usurp|contamin|advertising|anniversary edition|en voyage|extermin|kamikaze|nationalis|mittal|est prévu pour 202|is planned for|due in 202|incendies|fires|inondation|ligue 1|le suicide|gaza|terreur|capitalism|attentat|calvaire|calvitie|la gauche|esclave|paris|ségrégation|athlète|précarité|Hezbollah|Israël|morts|frappes|marine lepen|dérives|un drame|sans-abri|protobuf|paralympique|nazi|mélenchon|ministre|Review: (?:[1-3]\.\d|[1-2]\.\d|3\.0)/5\.0|licenciement|misère|du jamais vu|il faut|Palestiniens|israél|palestine|vaccin|mpox|épidémie|violeur|rapist|pédo|criminel|poutine|le RN |réseau social x|gendarme|policier|kurde|condamnation|perquisition|incendi|gabriel attal|attaqué|justice|tués par|tué par|snapdragon|qualcomm|porn|barnier|occultes|désinformation|immigration|racism|spacex|islam|condamné|de viol|pour viol)',
|
||||
'(?i)(azure|powershell|rimworld|Olympique|Olympic|Paris 2024|sportif|windows|twitter|freebsd|mastodon|kirby|flask|wp engine|cobol)',
|
||||
'(?i)(metalcore|deathcore|death metal|black metal|death punk|deathpunk|djent|blackmetal|blackened|bitcoin)',
|
||||
'(?i)(JO|foot|menace|de mort|iptv|ip tv|automated archives|announcing systemd)',
|
||||
'(?i)(guerre|bluesky|combat|terror|craindre|fear|décliner|declin|climat|inégalité|fuite|ont fui|a fui|musk|tesla|voitures|assassiné|dying|indifference|feux|abandon|chômage|scam|arnaque|fraud|inquiét|openai)',
|
||||
'(?i)(victime|violence|violent|violemm|pénurie|impôt|taxes|deuil|chasse|bombes|a perdu|vide exist|fake|poursuivi|subir|pauvre|riches|politique|politic|Macron|marine le pen|michel barnier|zemmour)',
|
||||
'(?i)(linux mint|Matignon|tremble|aucun n\'a|décès|meurtre|crise|difficile|marre|action contre|irrecevable|pollution|élimination|pourrai|tourisme|mauvaise humeur|stress|dangereux|détruit|insupportable|de droite)',
|
||||
'(?i)(souffre|chaleur|cyber|attaque|homophob|extrême.droite|risque|travail|offensi|sacrif|canard pc|photos|videos|crisis|trump|nocif|negatif|négative|poids|plainte|escro|usurp|contamin|advertising)',
|
||||
'(?i)(anniversary edition|en voyage|extermin|kamikaze|nationalis|mittal|est prévu pour 202|is planned for|due in 202|incendies|fires|inondation|ligue 1|le suicide|gaza|terreur|capitalism|attentat)',
|
||||
'(?i)(calvaire|calvitie|la gauche|esclave|paris|ségrégation|athlète|précarité|Hezbollah|Israël|morts|frappes|marine lepen|dérives|un drame|sans-abri|protobuf|paralympique|nazi|mélenchon|ministre)',
|
||||
'(?i)(Review: (?:[1-3]\.\d|[1-2]\.\d|3\.0)/5\.0|licenciement|misère|du jamais vu|il faut|Palestiniens|israél|palestine|vaccin|mpox|épidémie|violeur|rapist|pédo|criminel|poutine|le RN)',
|
||||
'(?i)(réseau social x|gendarme|policier|kurde|condamnation|perquisition|incendi|gabriel attal|attaqué|justice|tués par|tué par|snapdragon|qualcomm|porn|barnier|occultes|désinformation|immigration|racism|spacex|islam|condamné|de viol|pour viol)',
|
||||
|
||||
// Années au début, à la fin, ou précédées de "at/in/of", ou au milieu des titres spécifiques
|
||||
'(?i)(\b\d{4}\b|(?:\b(?:at|in|of)\s\d{4}\b)|(?:\b\d{4}\b\.$|\(\d{4}\)))',
|
||||
'(?i)(^202\d\b|\b202\d$)', // Titre commençant ou terminant par 202x
|
||||
'(?i)(\bin\s202\d|\bat\s202\d)', // "in/at 202x"
|
||||
'(?i)(my\s.*\b202\d\b)', // Titres contenant "My ... 202x"
|
||||
// Exclusion des titres contenant des caractères non-latins (Unicode étendu)
|
||||
'[^\x00-\x7F]', // Tous les caractères non-ASCII (inclut Unicode comme chinois, cyrillique, etc.)
|
||||
'[\p{Cyrillic}]', // Caractères cyrilliques (russe, ukrainien, etc.)
|
||||
'[\p{Greek}]', // Alphabet grec
|
||||
'[\p{Han}\p{Hiragana}\p{Katakana}]', // Chinois, japonais, coréen
|
||||
'[äöüßÄÖÜẞ]', // Allemand (umlauts et eszett)
|
||||
|
||||
// Exclude specific character sets
|
||||
'[Α-ωА-яäöüßÄÖÜẞ\u4E00-\u9FFF\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFFEF]',
|
||||
// Titres spécifiques
|
||||
'(?i)(വേമ്പനാട്ട്)', // Malayâlam
|
||||
|
||||
// Week notes et expressions relatives au nouvel an
|
||||
'(?i)(week notes|weekly|weeknote|digest)',
|
||||
@ -34,13 +47,21 @@ $excludePatterns = [
|
||||
// "Merry Christmas"
|
||||
'(?i)(merry christmas)'
|
||||
];
|
||||
|
||||
// Corrige les barres obliques pour qu'elles ne cassent pas `preg_match`
|
||||
$excludePatterns = array_map(fn($pattern) => str_replace('/', '\/', $pattern), $excludePatterns);
|
||||
|
||||
// Crée une expression régulière unique pour matcher toutes les exclusions
|
||||
$excludeRegex = '/' . implode('|', $excludePatterns) . '/i';
|
||||
|
||||
// Vérifier si le script est en mode dry run
|
||||
$isDryRun = in_array('dry-run', $argv);
|
||||
$maxResults = 100; // Limite par défaut pour la sortie
|
||||
foreach ($argv as $arg) {
|
||||
if (preg_match('/^max-results=(\d+)$/', $arg, $matches)) {
|
||||
$maxResults = (int)$matches[1];
|
||||
}
|
||||
}
|
||||
|
||||
@mkdir(dirname($rssFile), 0777, true);
|
||||
@mkdir(dirname($cacheFile), 0777, true);
|
||||
|
||||
@ -53,15 +74,48 @@ if (!$data) die("Error: Invalid JSON data from $jsonUrl\n");
|
||||
$includedIds = file_exists($cacheFile) ? file($cacheFile, FILE_IGNORE_NEW_LINES) : [];
|
||||
|
||||
// Filtrer les articles récents, non déjà inclus, et ne contenant pas de termes exclus
|
||||
$newItems = array_filter($data, function ($item) use ($includedIds, $cutoffDate, $excludeRegex) {
|
||||
return isset($item['published'], $item['itemid'], $item['itemtitle']) &&
|
||||
!in_array($item['itemid'], $includedIds) &&
|
||||
$item['published'] >= $cutoffDate &&
|
||||
!preg_match($excludeRegex, $item['itemtitle']); // Exclure si le titre contient des termes interdits
|
||||
});
|
||||
$newItems = [];
|
||||
$excludedItems = [];
|
||||
|
||||
foreach ($data as $item) {
|
||||
if (!isset($item['published'], $item['itemid'], $item['itemtitle'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$published = $item['published'];
|
||||
$itemId = $item['itemid'];
|
||||
$itemTitle = $item['itemtitle'];
|
||||
|
||||
if (in_array($itemId, $includedIds) || $published < $cutoffDate || preg_match($excludeRegex, $itemTitle)) {
|
||||
$excludedItems[] = $item;
|
||||
} else {
|
||||
$newItems[] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
usort($newItems, fn($a, $b) => $b['published'] <=> $a['published']);
|
||||
usort($excludedItems, fn($a, $b) => $b['published'] <=> $a['published']);
|
||||
|
||||
if ($isDryRun) {
|
||||
// Mode dry-run : afficher les entrées incluses et exclues
|
||||
echo "=== Dry Run Mode ===\n";
|
||||
|
||||
$showIncluded = array_slice($newItems, 0, $maxResults);
|
||||
$showExcluded = array_slice($excludedItems, 0, $maxResults);
|
||||
|
||||
echo "Filtered IN (" . count($newItems) . " total, showing up to $maxResults):\n";
|
||||
foreach ($showIncluded as $item) {
|
||||
echo "- " . ($item['itemtitle'] ?? 'No title') . "\n";
|
||||
}
|
||||
|
||||
echo "\nFiltered OUT (" . count($excludedItems) . " total, showing up to $maxResults):\n";
|
||||
foreach ($showExcluded as $item) {
|
||||
echo "- " . ($item['itemtitle'] ?? 'No title') . "\n";
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Groupement par jour pour les nouveaux éléments
|
||||
$groupedByDay = [];
|
||||
foreach ($newItems as $item) {
|
||||
$day = isset($item['published']) && is_numeric($item['published'])
|
||||
|
Loading…
x
Reference in New Issue
Block a user