Add PHP variant: no-cron, request-time feed generation for shared hosting
Same imio.smartweb JSON API as the Python script, but each feed regenerates on demand (15 min file cache) instead of via cron, so it works on plain PHP shared hosting with no server config access. Also adds facebook.php, a caching proxy for the user's FetchRSS Atom feed so all three feeds live under one domain and can be shared as stable URLs. Tested with PHP 8.3 CLI: valid XML, real data (40 news, 12 events, proxied Facebook feed). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
require __DIR__ . '/common.php';
|
||||
|
||||
const SITE = 'https://www.silly.be';
|
||||
const EVENTS_API = SITE . '/agenda/@results';
|
||||
const PAGE_SIZE = 20;
|
||||
const MAX_PAGES = 2;
|
||||
|
||||
function fetch_all_events(): array
|
||||
{
|
||||
$items = [];
|
||||
for ($page = 0; $page < MAX_PAGES; $page++) {
|
||||
$bStart = $page * PAGE_SIZE;
|
||||
$url = EVENTS_API . '?b_size=' . PAGE_SIZE . '&b_start=' . $bStart;
|
||||
$data = json_decode(http_get($url), true);
|
||||
$pageItems = $data['items'] ?? [];
|
||||
if (empty($pageItems)) {
|
||||
break;
|
||||
}
|
||||
$items = array_merge($items, $pageItems);
|
||||
if (count($items) >= ($data['items_total'] ?? 0)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
function format_event_meta(array $item): string
|
||||
{
|
||||
$parts = [];
|
||||
$start = !empty($item['start']) ? new DateTime($item['start']) : null;
|
||||
$end = !empty($item['end']) ? new DateTime($item['end']) : null;
|
||||
|
||||
if ($start) {
|
||||
$parts[] = !empty($item['whole_day'])
|
||||
? 'Le ' . $start->format('d/m/Y')
|
||||
: 'Le ' . $start->format('d/m/Y à H:i');
|
||||
}
|
||||
if ($end && (!$start || $end->format('Y-m-d') !== $start->format('Y-m-d'))) {
|
||||
$parts[] = "jusqu'au " . $end->format('d/m/Y H:i');
|
||||
}
|
||||
$address = implode(', ', array_filter([$item['street'] ?? null, $item['zipcode'] ?? null, $item['city'] ?? null]));
|
||||
if ($address) {
|
||||
$parts[] = "Lieu : $address";
|
||||
}
|
||||
return implode(' — ', $parts);
|
||||
}
|
||||
|
||||
function build_events_feed(): string
|
||||
{
|
||||
$items = [];
|
||||
foreach (fetch_all_events() as $item) {
|
||||
$id = basename(rtrim($item['@id'] ?? '', '/'));
|
||||
$summary = strip_html($item['description_fr'] ?? $item['description'] ?? null);
|
||||
$meta = format_event_meta($item);
|
||||
$description = implode(' | ', array_filter([$meta, $summary]));
|
||||
$items[] = [
|
||||
'title' => $item['title_fr'] ?? $item['title'] ?? '(sans titre)',
|
||||
'link' => SITE . '/agenda?event=' . rawurlencode($id),
|
||||
'guid' => $item['UID'] ?? $id,
|
||||
'pubDate' => $item['created'] ?? $item['start'] ?? null,
|
||||
'description' => $description,
|
||||
];
|
||||
}
|
||||
return build_rss(
|
||||
'Silly.be - Agenda',
|
||||
SITE . '/agenda',
|
||||
"Agenda / événements de la commune de Silly (Belgique)",
|
||||
$items
|
||||
);
|
||||
}
|
||||
|
||||
serve_cached_feed('agenda', 'build_events_feed');
|
||||
Reference in New Issue
Block a user