From 19c30ddce9316c9ca94a259771654126bcb5b932 Mon Sep 17 00:00:00 2001 From: CyberMind-FR Date: Fri, 23 Jan 2026 22:17:11 +0100 Subject: [PATCH] feat(cyberfeed): Add radio and podcast presets - Add Radio France presets (France Inter, France Culture, France Info, FIP, Mouv) - Add international radio (BBC World, NPR) - Add tech podcasts (Darknet Diaries, Changelog, Syntax.fm) - Add 'radio' category to feed selector - One-click quick-add buttons for all radio presets Co-Authored-By: Claude Opus 4.5 --- package/secubox/luci-app-cyberfeed/Makefile | 2 +- .../resources/view/cyberfeed/feeds.js | 80 ++++++++++++++++++- .../files/etc/cyberfeed/feeds.conf | 18 +++++ 3 files changed, 98 insertions(+), 2 deletions(-) diff --git a/package/secubox/luci-app-cyberfeed/Makefile b/package/secubox/luci-app-cyberfeed/Makefile index a5ede33a..f9e77cbf 100644 --- a/package/secubox/luci-app-cyberfeed/Makefile +++ b/package/secubox/luci-app-cyberfeed/Makefile @@ -11,7 +11,7 @@ LUCI_PKGARCH:=all PKG_NAME:=luci-app-cyberfeed PKG_VERSION:=0.1.0 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_MAINTAINER:=CyberMind PKG_LICENSE:=MIT diff --git a/package/secubox/luci-app-cyberfeed/htdocs/luci-static/resources/view/cyberfeed/feeds.js b/package/secubox/luci-app-cyberfeed/htdocs/luci-static/resources/view/cyberfeed/feeds.js index 05b8cfe2..b34c67c3 100644 --- a/package/secubox/luci-app-cyberfeed/htdocs/luci-static/resources/view/cyberfeed/feeds.js +++ b/package/secubox/luci-app-cyberfeed/htdocs/luci-static/resources/view/cyberfeed/feeds.js @@ -78,7 +78,8 @@ return view.extend({ E('option', { 'value': 'security' }, 'Security'), E('option', { 'value': 'tech' }, 'Tech'), E('option', { 'value': 'social' }, 'Social'), - E('option', { 'value': 'news' }, 'News') + E('option', { 'value': 'news' }, 'News'), + E('option', { 'value': 'radio' }, 'Radio/Podcasts') ]) ]) ]), @@ -131,6 +132,70 @@ return view.extend({ ]) ])); + // Radio Presets + content.push(E('div', { 'class': 'cf-card' }, [ + E('div', { 'class': 'cf-card-header' }, [ + E('div', { 'class': 'cf-card-title' }, [ + E('span', { 'class': 'cf-card-title-icon' }, '\uD83D\uDCFB'), + 'Radio & Podcast Presets' + ]) + ]), + E('div', { 'class': 'cf-card-body' }, [ + E('p', { 'style': 'margin-bottom: 16px; color: var(--cf-text-dim);' }, + 'Quick-add popular radio stations and podcasts'), + E('div', { 'style': 'margin-bottom: 12px;' }, [ + E('strong', { 'style': 'color: var(--cf-neon-cyan);' }, 'Radio France') + ]), + E('div', { 'class': 'cf-grid cf-grid-3', 'style': 'gap: 12px; margin-bottom: 16px;' }, [ + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('franceinter', 'https://radiofrance-podcast.net/podcast09/rss_10239.xml', 'France Inter'); } + }, '\uD83C\uDDEB\uD83C\uDDF7 France Inter'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('franceculture', 'https://radiofrance-podcast.net/podcast09/rss_10351.xml', 'France Culture'); } + }, '\uD83C\uDDEB\uD83C\uDDF7 France Culture'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('franceinfo', 'https://radiofrance-podcast.net/podcast09/rss_10134.xml', 'France Info'); } + }, '\uD83C\uDDEB\uD83C\uDDF7 France Info'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('fip', 'https://radiofrance-podcast.net/podcast09/rss_18981.xml', 'FIP'); } + }, '\uD83C\uDFA7 FIP'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('mouv', 'https://radiofrance-podcast.net/podcast09/rss_21649.xml', 'Mouv'); } + }, '\uD83C\uDFA4 Mouv') + ]), + E('div', { 'style': 'margin-bottom: 12px;' }, [ + E('strong', { 'style': 'color: var(--cf-neon-cyan);' }, 'International & Tech') + ]), + E('div', { 'class': 'cf-grid cf-grid-3', 'style': 'gap: 12px;' }, [ + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('bbc_world', 'https://feeds.bbci.co.uk/news/world/rss.xml', 'BBC World'); } + }, '\uD83C\uDDEC\uD83C\uDDE7 BBC World'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('npr', 'https://feeds.npr.org/1001/rss.xml', 'NPR News'); } + }, '\uD83C\uDDFA\uD83C\uDDF8 NPR'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('darknet_diaries', 'https://feeds.megaphone.fm/darknetdiaries', 'Darknet Diaries'); } + }, '\uD83D\uDD75 Darknet Diaries'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('changelog', 'https://changelog.com/podcast/feed', 'The Changelog'); } + }, '\uD83D\uDCBB Changelog'), + E('button', { + 'class': 'cf-btn cf-btn-sm', + 'click': function() { self.addRadioPreset('syntax', 'https://feed.syntax.fm/rss', 'Syntax.fm'); } + }, '\uD83D\uDCBB Syntax.fm') + ]) + ]) + ])); + // Feeds List var feedsContent; if (feeds.length === 0) { @@ -219,6 +284,19 @@ return view.extend({ }); }, + addRadioPreset: function(name, url, displayName) { + var self = this; + + return api.addFeed(name, url, 'rss', 'radio').then(function(res) { + if (res && res.success) { + self.showToast(displayName + ' added', 'success'); + window.location.reload(); + } else { + self.showToast('Failed: ' + (res.error || 'Unknown error'), 'error'); + } + }); + }, + handleDeleteFeed: function(name) { var self = this; diff --git a/package/secubox/secubox-app-cyberfeed/files/etc/cyberfeed/feeds.conf b/package/secubox/secubox-app-cyberfeed/files/etc/cyberfeed/feeds.conf index cf2a2968..e432e3a2 100644 --- a/package/secubox/secubox-app-cyberfeed/files/etc/cyberfeed/feeds.conf +++ b/package/secubox/secubox-app-cyberfeed/files/etc/cyberfeed/feeds.conf @@ -34,3 +34,21 @@ hackernews|https://news.ycombinator.com/rss|rss|tech # # YouTube Channel: #channel_yt|http://localhost:3000/?action=display&bridge=Youtube&c=CHANNEL_ID&format=Atom|rss-bridge|social + +# === Radio Streams (Podcasts/News) === +# Radio France +#franceinter|https://radiofrance-podcast.net/podcast09/rss_10239.xml|rss|radio +#franceculture|https://radiofrance-podcast.net/podcast09/rss_10351.xml|rss|radio +#franceinfo|https://radiofrance-podcast.net/podcast09/rss_10134.xml|rss|radio +#fip|https://radiofrance-podcast.net/podcast09/rss_18981.xml|rss|radio +#mouv|https://radiofrance-podcast.net/podcast09/rss_21649.xml|rss|radio + +# International Radio +#bbc_world|https://feeds.bbci.co.uk/news/world/rss.xml|rss|radio +#npr|https://feeds.npr.org/1001/rss.xml|rss|radio +#deutschlandfunk|https://www.deutschlandfunk.de/podcast-nachrichten.1257.de.podcast.xml|rss|radio + +# Tech Podcasts +#changelog|https://changelog.com/podcast/feed|rss|radio +#syntax|https://feed.syntax.fm/rss|rss|radio +#darknet_diaries|https://feeds.megaphone.fm/darknetdiaries|rss|radio