Risuko
Guides

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 rss subcommands 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 list

JSON output for scripting:

risuko rss list --json

Refresh Feeds

Force an immediate refresh of all feeds:

risuko rss refresh

The 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-7d8e9f0a1b2c

How It Works

  1. When a feed is added, the engine fetches it immediately
  2. New items are detected by item ID — a SHA-256 hash of the entry's GUID (or its link when the GUID is missing)
  3. 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
  4. Feed state is persisted via the StorageBackend trait
  5. Periodic polling checks each feed on its own interval; after a poll finds new items the engine emits an rss-new-items event 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):

FieldDescription
name, is_active, auto_downloadIdentification + master switches
feed_idsRestrict to specific feed IDs (empty = all feeds)
priority, modeConflict resolution (any-match / best-match)
title_must, title_must_notLists of { kind, value, case_sensitive } patterns where kind is contains, glob, or regex
min_size_bytes, max_size_bytes, min_seedersSize / health gates
series_filter, seasons, episodesSeries name match plus season list and an episodes selector (all, from { start }, range { start, end }, specific { values })
quality_preferences, required_qualities, forbidden_qualitiesTokens 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_existingRe-download a previously-grabbed episode when a higher-ranked quality appears
download_dirPer-rule download directory override
filename_templateStored with the rule but not applied yet; downloads keep their own names
schedule, cooldown_secsTime-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.

On this page