fix: replace 22 dead/blocked RSS feeds with working alternatives

Tested all 80+ RSS feeds — 22 returned 403/404/timeout. Changes:
- AP Top News: rsshub → feedx.net (working wire proxy)
- Reuters World: reutersagency.com → Google News RSS filter
- Defense One: /rss/ → /rss/all/ (correct endpoint)
- Military Times replaces Stars and Stripes (404, no RSS found)
- The National UAE: /rss → Arc outbound feed (working)
- Nikkei Asia: /rss → /rss/feed/nar (working)
- Lowy Interpreter replaces East Asia Forum (403 WAF block)
- Dialogo Americas replaces Americas Quarterly + Brazil Wire
- Remove 13 dead feeds with no working replacement:
  Threatpost, CSIS, CFR, Chatham House, Atlantic Council, IISS,
  Al Monitor, ACAPS, EU External Action, NATO News,
  Energy Intelligence, The Africa Report, African Arguments

Reduces feed count from 80 to 62, eliminating wasted timeout cycles
that were blocking the dashboard SSE first frame.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Marc Shade
2026-02-24 10:26:47 -05:00
co-authored by Claude Opus 4.6
parent a72fdc50f7
commit 95b149ad55
+13 -30
View File
@@ -29,8 +29,8 @@ _RSS_FEEDS: dict[str, list[tuple[str, str]]] = {
"geopolitics": [ "geopolitics": [
("BBC World", "https://feeds.bbci.co.uk/news/world/rss.xml"), ("BBC World", "https://feeds.bbci.co.uk/news/world/rss.xml"),
("Al Jazeera", "https://www.aljazeera.com/xml/rss/all.xml"), ("Al Jazeera", "https://www.aljazeera.com/xml/rss/all.xml"),
("AP Top News", "https://rsshub.app/apnews/topics/apf-topnews"), ("AP Top News", "https://feedx.net/rss/ap.xml"),
("Reuters World", "https://www.reutersagency.com/feed/?taxonomy=best-sectors&post_type=best"), ("Reuters World", "https://news.google.com/rss/search?q=source:Reuters&hl=en-US&gl=US&ceid=US:en"),
("The Guardian World", "https://www.theguardian.com/world/rss"), ("The Guardian World", "https://www.theguardian.com/world/rss"),
("DW News", "https://rss.dw.com/rss/en/top_news/rss-en-top"), ("DW News", "https://rss.dw.com/rss/en/top_news/rss-en-top"),
("France24", "https://www.france24.com/en/rss"), ("France24", "https://www.france24.com/en/rss"),
@@ -41,7 +41,6 @@ _RSS_FEEDS: dict[str, list[tuple[str, str]]] = {
("The Hacker News", "https://feeds.feedburner.com/TheHackersNews"), ("The Hacker News", "https://feeds.feedburner.com/TheHackersNews"),
("Schneier on Security", "https://www.schneier.com/feed/atom/"), ("Schneier on Security", "https://www.schneier.com/feed/atom/"),
("Dark Reading", "https://www.darkreading.com/rss.xml"), ("Dark Reading", "https://www.darkreading.com/rss.xml"),
("Threatpost", "https://threatpost.com/feed/"),
("CISA Alerts", "https://www.cisa.gov/cybersecurity-advisories/all.xml"), ("CISA Alerts", "https://www.cisa.gov/cybersecurity-advisories/all.xml"),
], ],
"technology": [ "technology": [
@@ -60,12 +59,11 @@ _RSS_FEEDS: dict[str, list[tuple[str, str]]] = {
("Zero Hedge", "https://feeds.feedburner.com/zerohedge/feed"), ("Zero Hedge", "https://feeds.feedburner.com/zerohedge/feed"),
], ],
"military": [ "military": [
("Defense One", "https://www.defenseone.com/rss/"), ("Defense One", "https://www.defenseone.com/rss/all/"),
("War on the Rocks", "https://warontherocks.com/feed/"), ("War on the Rocks", "https://warontherocks.com/feed/"),
("The War Zone", "https://www.twz.com/feed"), ("The War Zone", "https://www.twz.com/feed"),
("Breaking Defense", "https://breakingdefense.com/feed/"), ("Breaking Defense", "https://breakingdefense.com/feed/"),
("Defense News", "https://www.defensenews.com/arc/outboundfeeds/rss/category/land/?outputType=xml"), ("Military Times", "https://www.militarytimes.com/arc/outboundfeeds/rss/?outputType=xml"),
("Stars and Stripes", "https://www.stripes.com/rss"),
("USNI News", "https://news.usni.org/feed"), ("USNI News", "https://news.usni.org/feed"),
], ],
"science": [ "science": [
@@ -77,54 +75,41 @@ _RSS_FEEDS: dict[str, list[tuple[str, str]]] = {
"think_tanks": [ "think_tanks": [
("RAND", "https://www.rand.org/blog.xml"), ("RAND", "https://www.rand.org/blog.xml"),
("Brookings", "https://www.brookings.edu/feed/"), ("Brookings", "https://www.brookings.edu/feed/"),
("CSIS", "https://www.csis.org/analysis/feed"),
("CFR", "https://www.cfr.org/rss.xml"),
("Carnegie", "https://carnegieendowment.org/rss/solr.xml"), ("Carnegie", "https://carnegieendowment.org/rss/solr.xml"),
("Chatham House", "https://www.chathamhouse.org/rss.xml"),
("Atlantic Council", "https://www.atlanticcouncil.org/feed/"),
("IISS", "https://www.iiss.org/rss/"),
], ],
"middle_east": [ "middle_east": [
("Al Monitor", "https://www.al-monitor.com/rss"),
("Middle East Eye", "https://www.middleeasteye.net/rss"), ("Middle East Eye", "https://www.middleeasteye.net/rss"),
("The National UAE", "https://www.thenationalnews.com/rss"), ("The National UAE", "https://www.thenationalnews.com/arc/outboundfeeds/rss/?outputType=xml"),
("Times of Israel", "https://www.timesofisrael.com/feed/"), ("Times of Israel", "https://www.timesofisrael.com/feed/"),
("Iran Intl", "https://www.iranintl.com/en/feed"), ("Iran Intl", "https://www.iranintl.com/en/feed"),
], ],
"asia_pacific": [ "asia_pacific": [
("SCMP", "https://www.scmp.com/rss/91/feed"), ("SCMP", "https://www.scmp.com/rss/91/feed"),
("Nikkei Asia", "https://asia.nikkei.com/rss"), ("Nikkei Asia", "https://asia.nikkei.com/rss/feed/nar"),
("The Diplomat", "https://thediplomat.com/feed/"), ("The Diplomat", "https://thediplomat.com/feed/"),
("Channel News Asia", "https://www.channelnewsasia.com/api/v1/rss-outbound-feed?_format=xml"), ("Channel News Asia", "https://www.channelnewsasia.com/api/v1/rss-outbound-feed?_format=xml"),
("East Asia Forum", "https://www.eastasiaforum.org/feed/"), ("Lowy Interpreter", "https://www.lowyinstitute.org/the-interpreter/rss.xml"),
], ],
"africa": [ "africa": [
("allAfrica", "https://allafrica.com/tools/headlines/rdf/latest/headlines.rdf"), ("allAfrica", "https://allafrica.com/tools/headlines/rdf/latest/headlines.rdf"),
("The Africa Report", "https://www.theafricareport.com/feed/"),
("African Arguments", "https://africanarguments.org/feed/"),
], ],
"latin_america": [ "latin_america": [
("Americas Quarterly", "https://www.americasquarterly.org/feed/"),
("MercoPress", "https://en.mercopress.com/rss"), ("MercoPress", "https://en.mercopress.com/rss"),
("Brazil Wire", "https://www.brasilwire.com/feed/"), ("Dialogo Americas", "https://dialogo-americas.com/feed/"),
], ],
"energy": [ "energy": [
("Oil Price", "https://oilprice.com/rss/main"), ("Oil Price", "https://oilprice.com/rss/main"),
("Rigzone", "https://www.rigzone.com/news/rss/rigzone_latest.aspx"), ("Rigzone", "https://www.rigzone.com/news/rss/rigzone_latest.aspx"),
("Energy Intelligence", "https://www.energyintel.com/rss"),
("Utility Dive", "https://www.utilitydive.com/feeds/news/"), ("Utility Dive", "https://www.utilitydive.com/feeds/news/"),
], ],
"government": [ "government": [
("State Dept", "https://www.state.gov/rss-feed/press-releases/feed/"), ("State Dept", "https://www.state.gov/rss-feed/press-releases/feed/"),
("DoD News", "https://www.defense.gov/DesktopModules/ArticleCS/RSS.ashx?ContentType=1&Site=945&max=10"), ("DoD News", "https://www.defense.gov/DesktopModules/ArticleCS/RSS.ashx?ContentType=1&Site=945&max=10"),
("UN News", "https://news.un.org/feed/subscribe/en/news/all/rss.xml"), ("UN News", "https://news.un.org/feed/subscribe/en/news/all/rss.xml"),
("EU External Action", "https://www.eeas.europa.eu/eeas/rss-feeds_en"),
("NATO News", "https://www.nato.int/cps/en/natohq/news.xml"),
], ],
"crisis": [ "crisis": [
("ReliefWeb", "https://reliefweb.int/updates/rss.xml"), ("ReliefWeb", "https://reliefweb.int/updates/rss.xml"),
("ICG", "https://www.crisisgroup.org/rss.xml"), ("ICG", "https://www.crisisgroup.org/rss.xml"),
("ACAPS", "https://www.acaps.org/en/rss/briefing-notes"),
], ],
} }
@@ -148,14 +133,10 @@ SOURCE_TIERS: dict[str, str] = {
"USNI News": "specialty", "USNI News": "specialty",
"War on the Rocks": "specialty", "War on the Rocks": "specialty",
"The War Zone": "specialty", "The War Zone": "specialty",
"Military Times": "specialty",
"RAND": "think_tank", "RAND": "think_tank",
"Brookings": "think_tank", "Brookings": "think_tank",
"CSIS": "think_tank",
"CFR": "think_tank",
"Carnegie": "think_tank", "Carnegie": "think_tank",
"Chatham House": "think_tank",
"Atlantic Council": "think_tank",
"IISS": "think_tank",
"ICG": "think_tank", "ICG": "think_tank",
"BleepingComputer": "specialty", "BleepingComputer": "specialty",
"Krebs on Security": "specialty", "Krebs on Security": "specialty",
@@ -164,9 +145,11 @@ SOURCE_TIERS: dict[str, str] = {
"State Dept": "government", "State Dept": "government",
"DoD News": "government", "DoD News": "government",
"UN News": "government", "UN News": "government",
"NATO News": "government",
"ReliefWeb": "intl_org", "ReliefWeb": "intl_org",
"ACAPS": "intl_org", "Lowy Interpreter": "think_tank",
"Dialogo Americas": "specialty",
"Nikkei Asia": "major",
"The National UAE": "major",
"Zero Hedge": "aggregator", "Zero Hedge": "aggregator",
} }