Initial commit: RSS feed dashboard aggregating YouTube, Reddit and RT

- PHP 8 + PDO SQLite cache with on-demand TTL refresh and dedup by link hash
- laminas-feed + Guzzle for RSS/Atom parsing and HTTP
- Bootstrap 5 UI with source and time-range filters, AJAX load-more
- User cron-free deployment under Apache/php-fpm; .htaccess hardening
This commit is contained in:
Harwinder Sekhon
2026-10-05 17:07:48 -04:00
commit ad4dc6b984
21 changed files with 2732 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
Require all denied
+38
View File
@@ -0,0 +1,38 @@
<?php
return [
// SQLite database location (kept outside the web root).
'db_path' => dirname(__DIR__) . '/data/feeds.sqlite',
// Seconds before a feed is considered stale and re-fetched on demand.
'cache_ttl' => 1800,
// Shorter retry interval for feeds whose last fetch failed (e.g. rate limited).
'error_retry_ttl' => 120,
// Minimum milliseconds between requests to the same host.
'host_interval_ms' => 1000,
// Hosts with aggressive rate limits: only fetch this many of their feeds per refresh.
'throttled_hosts' => ['www.reddit.com'],
'throttled_host_max_per_refresh' => 1,
// Number of items per page.
'page_size' => 20,
// Time-range filters (key => window length in seconds), shown newest-first.
'ranges' => [
'1h' => 3600,
'2h' => 7200,
'6h' => 21600,
'24h' => 86400,
'7d' => 604800,
],
// HTTP client settings.
'request_timeout' => 15,
'connect_timeout' => 10,
// Identify the client to feed providers (important for Reddit).
'user_agent' => 'RSSFeed/1.0 (+https://localhost; contact: admin@localhost)',
];
+64
View File
@@ -0,0 +1,64 @@
<?php
return [
// YouTube Atom feeds (channel handles resolved to channel IDs).
[
'source' => 'youtube',
'label' => 'Prof. Jiang - Fluxhistory',
'url' => 'https://www.youtube.com/feeds/videos.xml?channel_id=UCtmugk6zDcFsiqLpSiE3Wmw', // @Prof.Jiang_Fluxhistory
],
[
'source' => 'youtube',
'label' => 'Fireship',
'url' => 'https://www.youtube.com/feeds/videos.xml?channel_id=UCsBjURrPoezykLs9EqgamOA', // @Fireship
],
[
'source' => 'youtube',
'label' => 'Ravish Kumar',
'url' => 'https://www.youtube.com/feeds/videos.xml?channel_id=UC0yXUUIaPVAqZLgRjvtMftw', // @ravishkumar.official
],
[
'source' => 'youtube',
'label' => 'David Bombal',
'url' => 'https://www.youtube.com/feeds/videos.xml?channel_id=UCP7WmQ_U4GB3K51Od9QvM0w', // @davidbombal
],
// Reddit RSS feeds.
[
'source' => 'reddit',
'label' => 'r/DataHoarder',
'url' => 'https://www.reddit.com/r/DataHoarder/.rss',
],
[
'source' => 'reddit',
'label' => 'r/Piracy',
'url' => 'https://www.reddit.com/r/Piracy/.rss',
],
[
'source' => 'reddit',
'label' => 'r/homelabindia',
'url' => 'https://www.reddit.com/r/homelabindia/.rss',
],
[
'source' => 'reddit',
'label' => 'r/LocalLLM',
'url' => 'https://www.reddit.com/r/LocalLLM/.rss',
],
[
'source' => 'reddit',
'label' => 'r/homelab',
'url' => 'https://www.reddit.com/r/homelab/.rss',
],
[
'source' => 'reddit',
'label' => 'r/networking',
'url' => 'https://www.reddit.com/r/networking/.rss',
],
// RT news (RSS with image enclosures).
[
'source' => 'rt',
'label' => 'RT News',
'url' => 'https://www.rt.com/rss/',
],
];