From 871e48186427950a367727cbaf4fa4b35bc0f3c5 Mon Sep 17 00:00:00 2001 From: zionappp-ui Date: Sun, 24 May 2026 16:23:56 +0200 Subject: [PATCH] feat(feeds): add Russian independent sources + server parity for ru locale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes a server/client parity gap: the three existing ru-locale feeds (BBC Russian, Meduza, Novaya Gazeta Europe) were wired in src/config/feeds.ts but had no entries in server/worldmonitor/news/v1/_feeds.ts, so the server-side digest never served them. Changes: - server/_feeds.ts: add RU block (BBC Russian, Meduza, Novaya Gazeta Europe, The Insider, Moscow Times) with lang:'ru' — mirrors existing client feeds - src/config/feeds.ts: add The Insider (theins.ru, 50 items verified), add lang:'ru' to Moscow Times, add SOURCE_TYPES entries - theins.ru added to all 4 allowlist mirrors (parity verified with diff) - shared/source-tiers.json + scripts mirror: The Insider tier 2, Moscow Times tier 2 Curation note: this block adds independent/exile Russian journalism only. State outlets (RT, TASS, Sputnik, RIA Novosti) are already present under their own entries and are NOT part of this ru-lang block. All feed URLs probed: - feeds.bbci.co.uk/russian/rss.xml → 200, ~30 items - meduza.io/rss/all → 200, 30 items - novayagazeta.eu/feed/rss → 200, 1 item (low-volume; kept for completeness) - theins.ru/feed → 200, 50 items - www.themoscowtimes.com/rss/news → 200, 50 items --- api/_rss-allowed-domains.js | 1 + scripts/shared/rss-allowed-domains.json | 1 + scripts/shared/source-tiers.json | 2 ++ server/worldmonitor/news/v1/_feeds.ts | 6 ++++++ shared/rss-allowed-domains.json | 1 + shared/source-tiers.json | 2 ++ src/config/feeds.ts | 3 +++ vite.config.ts | 2 +- 8 files changed, 17 insertions(+), 1 deletion(-) diff --git a/api/_rss-allowed-domains.js b/api/_rss-allowed-domains.js index 65d6b85d0d..f24a58b607 100644 --- a/api/_rss-allowed-domains.js +++ b/api/_rss-allowed-domains.js @@ -210,6 +210,7 @@ export default [ "www.rp.pl", "meduza.io", "novayagazeta.eu", + "theins.ru", "www.bangkokpost.com", "vnexpress.net", "www.abc.net.au", diff --git a/scripts/shared/rss-allowed-domains.json b/scripts/shared/rss-allowed-domains.json index 338c176f03..1b4b5ce936 100644 --- a/scripts/shared/rss-allowed-domains.json +++ b/scripts/shared/rss-allowed-domains.json @@ -207,6 +207,7 @@ "www.rp.pl", "meduza.io", "novayagazeta.eu", + "theins.ru", "www.bangkokpost.com", "vnexpress.net", "www.abc.net.au", diff --git a/scripts/shared/source-tiers.json b/scripts/shared/source-tiers.json index ec54a80f91..412af6b7af 100644 --- a/scripts/shared/source-tiers.json +++ b/scripts/shared/source-tiers.json @@ -77,6 +77,8 @@ "BBC Russian": 2, "Meduza": 2, "Novaya Gazeta Europe": 2, + "The Insider": 2, + "Moscow Times": 2, "Bangkok Post": 2, "Thai PBS": 2, "ABC News Australia": 2, diff --git a/server/worldmonitor/news/v1/_feeds.ts b/server/worldmonitor/news/v1/_feeds.ts index 3424627ebe..8f0d260266 100644 --- a/server/worldmonitor/news/v1/_feeds.ts +++ b/server/worldmonitor/news/v1/_feeds.ts @@ -55,6 +55,12 @@ export const VARIANT_FEEDS: Record> = { { name: 'Híradó', url: gnLocale('site:hirado.hu when:2d', 'hu', 'HU', 'HU:hu'), lang: 'hu' }, { name: 'Portfolio.hu', url: 'https://portfolio.hu/rss/all.xml', lang: 'hu' }, { name: 'ATV', url: 'https://www.atv.hu/rss', lang: 'hu' }, + // Russian independent (RU) — exile/independent journalism only; state outlets excluded + { name: 'BBC Russian', url: 'https://feeds.bbci.co.uk/russian/rss.xml', lang: 'ru' }, + { name: 'Meduza', url: 'https://meduza.io/rss/all', lang: 'ru' }, + { name: 'Novaya Gazeta Europe', url: 'https://novayagazeta.eu/feed/rss', lang: 'ru' }, + { name: 'The Insider', url: 'https://theins.ru/feed', lang: 'ru' }, + { name: 'Moscow Times', url: 'https://www.themoscowtimes.com/rss/news' }, ], middleeast: [ { name: 'BBC Middle East', url: 'https://feeds.bbci.co.uk/news/world/middle_east/rss.xml' }, diff --git a/shared/rss-allowed-domains.json b/shared/rss-allowed-domains.json index 338c176f03..1b4b5ce936 100644 --- a/shared/rss-allowed-domains.json +++ b/shared/rss-allowed-domains.json @@ -207,6 +207,7 @@ "www.rp.pl", "meduza.io", "novayagazeta.eu", + "theins.ru", "www.bangkokpost.com", "vnexpress.net", "www.abc.net.au", diff --git a/shared/source-tiers.json b/shared/source-tiers.json index ec54a80f91..412af6b7af 100644 --- a/shared/source-tiers.json +++ b/shared/source-tiers.json @@ -77,6 +77,8 @@ "BBC Russian": 2, "Meduza": 2, "Novaya Gazeta Europe": 2, + "The Insider": 2, + "Moscow Times": 2, "Bangkok Post": 2, "Thai PBS": 2, "ABC News Australia": 2, diff --git a/src/config/feeds.ts b/src/config/feeds.ts index 928420196d..a2774bbde3 100644 --- a/src/config/feeds.ts +++ b/src/config/feeds.ts @@ -35,6 +35,8 @@ export const SOURCE_TYPES: Record = { 'CSIS': 'intel', 'RAND': 'intel', 'Brookings': 'intel', 'Carnegie': 'intel', 'IAEA': 'gov', 'WHO': 'gov', 'UNHCR': 'gov', 'Xinhua': 'wire', 'TASS': 'wire', 'RT': 'wire', 'RT Russia': 'wire', + // Russian independent (exile journalism) + 'The Insider': 'intel', 'Moscow Times': 'mainstream', 'NHK World': 'mainstream', 'Nikkei Asia': 'market', // Mainstream outlets @@ -282,6 +284,7 @@ const FULL_FEEDS: Record = { { name: 'BBC Russian', url: rss('https://feeds.bbci.co.uk/russian/rss.xml'), lang: 'ru' }, { name: 'Meduza', url: rss('https://meduza.io/rss/all'), lang: 'ru' }, { name: 'Novaya Gazeta Europe', url: rss('https://novayagazeta.eu/feed/rss'), lang: 'ru' }, + { name: 'The Insider', url: rss('https://theins.ru/feed'), lang: 'ru' }, { name: 'TASS', url: rss('https://news.google.com/rss/search?q=site:tass.com+OR+TASS+Russia+when:1d&hl=en-US&gl=US&ceid=US:en') }, { name: 'RT', url: rss('https://www.rt.com/rss/') }, { name: 'RT Russia', url: rss('https://www.rt.com/rss/russia/') }, diff --git a/vite.config.ts b/vite.config.ts index fe7f7273f9..43a739610d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -563,7 +563,7 @@ const RSS_PROXY_ALLOWED_DOMAINS = new Set([ 'www.fao.org', 'worldbank.org', 'www.imf.org', // Regional locale feeds 'www.hurriyet.com.tr', 'tvn24.pl', 'www.polsatnews.pl', 'www.rp.pl', 'meduza.io', - 'novayagazeta.eu', 'www.bangkokpost.com', 'vnexpress.net', 'www.abc.net.au', + 'novayagazeta.eu', 'theins.ru', 'www.bangkokpost.com', 'vnexpress.net', 'www.abc.net.au', 'news.ycombinator.com', // Hungarian / Central European feeds 'telex.hu', 'index.hu', 'hvg.hu', '444.hu', '24.hu', 'hirado.hu', 'portfolio.hu', 'www.portfolio.hu', 'www.atv.hu',