str_replace('/', '\/', $pattern), $excludePatterns);
// Crée une expression régulière unique pour matcher toutes les exclusions
$excludeRegex = '/' . implode('|', $excludePatterns) . '/i';
@mkdir(dirname($rssFile), 0777, true);
@mkdir(dirname($cacheFile), 0777, true);
$jsonData = @file_get_contents($jsonUrl);
if (!$jsonData) die("Error: Unable to fetch JSON from $jsonUrl\n");
$data = json_decode($jsonData, true);
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
});
usort($newItems, fn($a, $b) => $b['published'] <=> $a['published']);
$groupedByDay = [];
foreach ($newItems as $item) {
$day = isset($item['published']) && is_numeric($item['published'])
? date('Y-m-d', $item['published'])
: date('Y-m-d');
$groupedByDay[$day][] = $item;
}
$rss = new SimpleXMLElement('');
$channel = $rss->addChild('channel');
$channel->addChild('title', 'IndieBlog Feed (Filtered, Last 10 Days)');
$channel->addChild('link', 'https://indieblog.page/');
$channel->addChild('description', 'RSS feed of articles from the last 10 days, excluding unwanted topics');
$channel->addChild('language', 'en');
$newEntries = [];
foreach ($groupedByDay as $day => $items) {
$rssItem = $channel->addChild('item');
$rssItem->addChild('title', "Links for $day");
$rssItem->addChild('link', "https://indieblog.page/$day#" . md5(json_encode($items)));
$rssItem->addChild('guid', "https://indieblog.page/$day#" . md5(json_encode($items)));
$rssItem->addChild('pubDate', date(DATE_RSS, strtotime($day)));
$description = "
";
foreach ($items as $item) {
$postTitle = htmlspecialchars($item['itemtitle'] ?? 'No title', ENT_XML1);
$postUrl = htmlspecialchars($item['itemurl'] ?? '#', ENT_XML1);
$blogTitle = htmlspecialchars($item['feedtitle'] ?? 'Unknown Blog', ENT_XML1);
$blogUrl = htmlspecialchars($item['feedurl'] ?? '#', ENT_XML1);
$description .= "- $postTitle ($blogTitle)
";
$newEntries[] = $item['itemid'];
}
$description .= "
";
addCData($rssItem->addChild('description'), $description);
}
if (!empty($newEntries)) {
file_put_contents($cacheFile, implode("\n", array_merge($includedIds, $newEntries)));
}
$rss->asXML($rssFile);
function addCData(SimpleXMLElement $node, $content)
{
$domNode = dom_import_simplexml($node);
$domOwner = $domNode->ownerDocument;
$domNode->appendChild($domOwner->createCDATASection($content));
}