RSS Feeds
Automatically download new content from RSS feeds.
Risuko can subscribe to RSS/Atom feeds and automatically download new items as they appear.
[!WARNING] The engine's RPC server does not implement the RSS methods yet, so the CLI
rsssubcommands below currently fail with "Method not found" against a running engine. RSS works today through the desktop app's RSS panel. RSS is not available through the Node.js API.
Adding a Feed
CLI
risuko rss add "https://example.com/feed.xml"Node.js
The Node.js API does not expose RSS management. Use the desktop app's RSS panel instead.
Managing Feeds
List All Feeds
risuko rss listJSON output for scripting:
risuko rss list --jsonRefresh Feeds
Force an immediate refresh of all feeds:
risuko rss refreshThe engine also polls feeds periodically. Each feed has its own update interval (default 30 minutes, configurable per feed). A feed is deactivated after 5 consecutive fetch failures; re-activating it resets the error count.
Remove a Feed
# Get the feed ID (a UUID) from `rss list`
risuko rss remove 4f8a1b2c-9d3e-4f5a-8b6c-7d8e9f0a1b2cHow It Works
- When a feed is added, the engine fetches it immediately
- New items are detected by item ID — a SHA-256 hash of the entry's GUID (or its link when the GUID is missing)
- New items are matched against your rules; only items matching an active auto-download rule are grabbed (see Rules). Media items (enclosures, magnet links, torrent URLs) are queued as downloads; article items are saved as sanitized, self-contained HTML files with their inline media downloaded alongside
- Feed state is persisted via the
StorageBackendtrait - Periodic polling checks each feed on its own interval; after a poll finds new items the engine emits an
rss-new-itemsevent with the new-item count. The desktop app currently builds the RSS manager with a no-op event sink, so this event is discarded and nothing in the UI listens for it
Storage
RSS feed data is stored under the rss storage key using the StorageBackend trait. The desktop app — currently the only host that runs the RSS manager — backs it with tauri_plugin_store.
Feed state survives engine restarts. Previously downloaded items are not re-downloaded. Each feed retains at most 500 items, and the episode download history used for deduplication caps at 10,000 records (oldest pruned first).
Rules
The desktop app's RSS panel exposes a rule engine that decides which items
get downloaded automatically. Rules are evaluated against the parsed item
metadata (title, parsed series/season/episode, size, seeders, quality tags)
and either match in priority order (AnyMatch, the default) or by best
score across the active set (BestMatch).
Each rule supports the following knobs (RssRule in
engine/rss/types.rs):
| Field | Description |
|---|---|
name, is_active, auto_download | Identification + master switches |
feed_ids | Restrict to specific feed IDs (empty = all feeds) |
priority, mode | Conflict resolution (any-match / best-match) |
title_must, title_must_not | Lists of { kind, value, case_sensitive } patterns where kind is contains, glob, or regex |
min_size_bytes, max_size_bytes, min_seeders | Size / health gates |
series_filter, seasons, episodes | Series name match plus season list and an episodes selector (all, from { start }, range { start, end }, specific { values }) |
quality_preferences, required_qualities, forbidden_qualities | Tokens matched (case-insensitively) against the title parser's canonicalized quality tags (e.g. 1080p, x265, WEB-DL, HDR10 — note HEVC/H.265 canonicalize to x265, H.264/AVC to x264) |
upgrade_existing | Re-download a previously-grabbed episode when a higher-ranked quality appears |
download_dir | Per-rule download directory override |
filename_template | Stored with the rule but not applied yet; downloads keep their own names |
schedule, cooldown_secs | Time-of-day / weekday window, and minimum time since the same episode was last downloaded before the rule fires again |
Feed bodies are capped at 8 MiB. Size bounds apply only when the feed reports an enclosure length, and
min_seeders only when the title carries a seeder count (e.g. [123S/45L]).
Title metadata (series, season, episode, quality, codec, group) is extracted
by the parser in
engine/rss/parser.rs
before rules run, so filters can address parsed fields directly without
needing custom regex. The desktop app can dry-run a rule against recent feed
items before saving it.