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 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-01-23 22:17:11 +01:00
parent 0607ed5628
commit 19c30ddce9
3 changed files with 98 additions and 2 deletions

View File

@ -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 <contact@cybermind.fr>
PKG_LICENSE:=MIT

View File

@ -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;

View File

@ -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