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] RSS feed management via CLI requires the standalone
risuko-clibinary. The RSS RPC methods are not yet implemented in the engine's RPC server. RSS is not available through the Node.js API at this time.
Adding a Feed
CLI
risuko rss add "https://example.com/feed.xml"Node.js
RSS management via the Node.js API is done through the RPC interface when the engine is running with RPC enabled.
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 on a configurable interval.
Remove a Feed
# Get the feed ID from `rss list`
risuko rss remove feed_abc123How It Works
- When a feed is added, the engine fetches it immediately
- New items are detected by comparing with previously seen entries
- Downloadable items (direct links, magnet links, torrent URLs) are queued automatically
- Feed state is persisted via the
StorageBackendtrait - Periodic polling checks for new items at configurable intervals
Storage
RSS feed data is stored using the StorageBackend trait:
- Desktop app: Uses
tauri_plugin_store - CLI/Node.js: Uses
FileStorage(JSON files in the config directory)
Feed state survives engine restarts. Previously downloaded items are not re-downloaded.
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 against the title parser's extracted quality tags (e.g. 1080p, HEVC, WEB-DL) |
upgrade_existing | Re-download a previously-grabbed episode when a higher-ranked quality appears |
download_dir, filename_template | Per-rule output overrides; supports {title}, {series}, {season}, {episode}, {quality} placeholders |
schedule, cooldown_secs | Time-of-day / weekday window and minimum interval between matches |
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.