Update the News source catalog for quality (#5)
Adds Techmeme, Lobsters, The Decoder and Simon Willison, all on by default. Hacker News now reads hnrss.org's front page with 150+ points. t3n, ComputerBase, TechCrunch and The Verge stay in the catalog but are off by default. heise Security and heise Developer are described as sections of heise online. WIRED and Engadget are removed. Saved toggles for Sources that are no longer in the catalog are dropped on launch, so they don't count towards "n of m enabled". The README source table matches the catalog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8c8ffca5dc
commit
c86609424c
5 files changed
+138
-42
No files matched your search
@@ -22,6 +22,15 @@ const defaultSources = <NewsSource>[
|
||||
description: 'IT-News für Profis',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'the-decoder',
|
||||
name: 'The Decoder',
|
||||
feedUrl: 'https://the-decoder.de/feed/',
|
||||
homepage: 'https://the-decoder.de',
|
||||
language: SourceLanguage.de,
|
||||
description: 'KI-News: Modelle, Forschung, Branche',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 't3n',
|
||||
name: 't3n',
|
||||
@@ -29,7 +38,6 @@ const defaultSources = <NewsSource>[
|
||||
homepage: 'https://t3n.de',
|
||||
language: SourceLanguage.de,
|
||||
description: 'Digitales Business, Startups, KI',
|
||||
enabledByDefault: true,
|
||||
checkPaywallOnPage: true,
|
||||
),
|
||||
NewsSource(
|
||||
@@ -39,7 +47,6 @@ const defaultSources = <NewsSource>[
|
||||
homepage: 'https://www.computerbase.de',
|
||||
language: SourceLanguage.de,
|
||||
description: 'Hardware, Software, Gaming',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'spiegel-netzwelt',
|
||||
@@ -72,7 +79,7 @@ const defaultSources = <NewsSource>[
|
||||
feedUrl: 'https://www.heise.de/security/rss/news-atom.xml',
|
||||
homepage: 'https://www.heise.de/security/',
|
||||
language: SourceLanguage.de,
|
||||
description: 'Sicherheitslücken und Security-News',
|
||||
description: 'Security-Teil von heise online (heise online ausschalten, um ihn einzeln zu lesen)',
|
||||
),
|
||||
NewsSource(
|
||||
id: 'heise-developer',
|
||||
@@ -80,7 +87,7 @@ const defaultSources = <NewsSource>[
|
||||
feedUrl: 'https://www.heise.de/developer/rss/news-atom.xml',
|
||||
homepage: 'https://www.heise.de/developer/',
|
||||
language: SourceLanguage.de,
|
||||
description: 'Softwareentwicklung',
|
||||
description: 'Developer-Teil von heise online (heise online ausschalten, um ihn einzeln zu lesen)',
|
||||
),
|
||||
NewsSource(
|
||||
id: 'caschy',
|
||||
@@ -115,7 +122,6 @@ const defaultSources = <NewsSource>[
|
||||
homepage: 'https://www.theverge.com',
|
||||
language: SourceLanguage.en,
|
||||
description: 'Consumer tech, culture, policy',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'arstechnica',
|
||||
@@ -133,15 +139,41 @@ const defaultSources = <NewsSource>[
|
||||
homepage: 'https://techcrunch.com',
|
||||
language: SourceLanguage.en,
|
||||
description: 'Startups, funding, big tech',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'hackernews',
|
||||
name: 'Hacker News',
|
||||
feedUrl: 'https://news.ycombinator.com/rss',
|
||||
feedUrl: 'https://hnrss.org/frontpage?points=150',
|
||||
homepage: 'https://news.ycombinator.com',
|
||||
language: SourceLanguage.en,
|
||||
description: 'Front page links, ranked by readers',
|
||||
description: 'Front page stories with 150+ points',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'techmeme',
|
||||
name: 'Techmeme',
|
||||
feedUrl: 'https://www.techmeme.com/feed.xml',
|
||||
homepage: 'https://www.techmeme.com',
|
||||
language: SourceLanguage.en,
|
||||
description: "The day's top tech stories, picked by editors",
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'lobsters',
|
||||
name: 'Lobsters',
|
||||
feedUrl: 'https://lobste.rs/rss',
|
||||
homepage: 'https://lobste.rs',
|
||||
language: SourceLanguage.en,
|
||||
description: 'Computing links, voted by a programmer community',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
id: 'simonwillison',
|
||||
name: 'Simon Willison',
|
||||
feedUrl: 'https://simonwillison.net/atom/entries/',
|
||||
homepage: 'https://simonwillison.net',
|
||||
language: SourceLanguage.en,
|
||||
description: 'LLMs and AI tools, tried out hands-on',
|
||||
enabledByDefault: true,
|
||||
),
|
||||
NewsSource(
|
||||
@@ -152,22 +184,6 @@ const defaultSources = <NewsSource>[
|
||||
language: SourceLanguage.en,
|
||||
description: 'AI, biotech, climate tech',
|
||||
),
|
||||
NewsSource(
|
||||
id: 'wired',
|
||||
name: 'WIRED',
|
||||
feedUrl: 'https://www.wired.com/feed/rss',
|
||||
homepage: 'https://www.wired.com',
|
||||
language: SourceLanguage.en,
|
||||
description: 'Tech, science and culture',
|
||||
),
|
||||
NewsSource(
|
||||
id: 'engadget',
|
||||
name: 'Engadget',
|
||||
feedUrl: 'https://www.engadget.com/rss.xml',
|
||||
homepage: 'https://www.engadget.com',
|
||||
language: SourceLanguage.en,
|
||||
description: 'Gadgets and consumer electronics',
|
||||
),
|
||||
NewsSource(
|
||||
id: 'theregister',
|
||||
name: 'The Register',
|
||||
|
||||
@@ -120,18 +120,21 @@ class AppState extends ChangeNotifier {
|
||||
|
||||
/// Switches on curated sources that are on by default the first time the
|
||||
/// app sees them, so they also reach installs with saved toggles. Sources
|
||||
/// seen before keep whatever the user chose.
|
||||
/// seen before keep whatever the user chose. Saved ids of Sources that are
|
||||
/// no longer in the catalog are dropped.
|
||||
Future<void> _enableNewDefaultSources() async {
|
||||
final saved = _storage.loadEnabledSourceIds();
|
||||
final seen = _storage.loadSeenSourceIds() ??
|
||||
(saved == null ? const <String>{} : legacySeenSourceIds);
|
||||
final unseen = _curated.where((s) => !seen.contains(s.id)).toList();
|
||||
final known = {for (final s in allSources) s.id};
|
||||
enabledSourceIds = {
|
||||
...?saved,
|
||||
...?saved?.where(known.contains),
|
||||
for (final s in unseen)
|
||||
if (s.enabledByDefault) s.id,
|
||||
};
|
||||
if (unseen.isEmpty) return;
|
||||
final dropped = saved != null && saved.any((id) => !known.contains(id));
|
||||
if (unseen.isEmpty && !dropped) return;
|
||||
await _storage.saveSeenSourceIds({...seen, ...unseen.map((s) => s.id)});
|
||||
await _storage.saveEnabledSourceIds(enabledSourceIds);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user