= $recentCutoff && !in_array($item['itemid'], $includedIds); }); // Sort items by publication date (newest first) usort($recentItems, fn($a, $b) => $b['published'] <=> $a['published']); // Generate RSS feed $rss = new SimpleXMLElement(''); $channel = $rss->addChild('channel'); $channel->addChild('title', 'IndieBlog Feed (Recent)'); $channel->addChild('link', 'https://indieblog.page/'); $channel->addChild('description', 'RSS feed of articles published in the last 24 hours'); $channel->addChild('language', 'en'); // Add recent items to RSS feed $newEntries = []; foreach ($recentItems as $item) { $rssItem = $channel->addChild('item'); $rssItem->addChild('title', htmlspecialchars($item['itemtitle'] ?? 'No title')); $rssItem->addChild('link', htmlspecialchars($item['itemurl'] ?? '')); $rssItem->addChild('pubDate', date(DATE_RSS, $item['published'])); // Fetch original RSS feed content for the entry $originalContent = fetchOriginalContent($item['itemurl']); $rssItem->addChild('description', htmlspecialchars($originalContent ?? $item['feedtitle'] ?? 'No content')); $newEntries[] = $item['itemid']; } // Update cache with newly processed IDs if (!empty($newEntries)) { file_put_contents($cacheFile, implode("\n", array_merge($includedIds, $newEntries))); } // Save RSS feed $rss->asXML($rssFile); /** * Fetches the original content from a given URL. * * @param string $url The URL of the article to fetch. * @return string|null The extracted content, or null if unavailable. */ function fetchOriginalContent(string $url): ?string { $html = @file_get_contents($url); if (!$html) { return null; } // Extract content between tags (basic extraction, adapt as needed) if (preg_match('/(.*?)<\/body>/si', $html, $matches)) { // Clean HTML content (strip tags, keep minimal formatting) return strip_tags($matches[1], '


'); } return null; }