A Jellyfin plugin for searching and downloading anime and series from aniworld.to and s.to, directly inside Jellyfin's web interface.
| Series View | Search View |
|---|---|
![]() |
![]() |
Note: HiAnime seems to be discontinued since 13.03.2026, so this provider is currently disabled and will be removed completely if it really gets shut down.
- Search and browse anime and series with cover art, popular titles, and new releases
- Download individual episodes, full seasons, or entire series
- Two sites supported: aniworld.to (anime), s.to (series) and hianime.to (currently disabled)
- Multiple languages: German Dub, German Sub, English Sub (aniworld), German Dub, English Dub (s.to)
- Multiple providers: VOE, Filemoon, Vidoza and Vidmoly
- Download manager with real-time progress, cancel, retry, and batch operations
- Automatic retries with exponential backoff and provider fallback
- Auto library scan so new episodes appear in Jellyfin immediately
- Jellyfin-compatible naming:
Series Name/Season 01/Series Name - S01E01 - Episode Title.mkv
This plugin is a lightweight downloader built into Jellyfin for convenience. If you need a standalone tool with its own web UI, more configuration options, and additional features, check out AniWorld-Downloader by phoenixthrush which I also actively maintain.
- Jellyfin 10.11.0 or newer
- ffmpeg (bundled with Jellyfin)
- File Transformation plugin (optional, required for non-admin access)
- In Jellyfin, go to Dashboard > Plugins > Repositories
- Add a new repository with this URL:
https://raw.githubusercontent.com/SiroxCW/Jellyfin-AniWorld-Downloader/main/manifest.json - Go to Catalog, find AniWorld Downloader, and click Install
- Restart Jellyfin
If the plugin does not show up in the Catalog, restarting Jellyfin made it appear.
Updates will show up automatically in the plugin catalog.
- Download the latest
.zipfrom Releases - Extract it to your Jellyfin plugins directory:
The folder should contain
/var/lib/jellyfin/plugins/AniWorldDownloader/Jellyfin.Plugin.AniWorld.dllandmeta.json. - Restart Jellyfin
Requires .NET 9.0 SDK.
cd Jellyfin.Plugin.AniWorld
dotnet build --configuration ReleaseThen copy the output:
mkdir -p /var/lib/jellyfin/plugins/AniWorldDownloader
cp bin/Release/net9.0/Jellyfin.Plugin.AniWorld.dll /var/lib/jellyfin/plugins/AniWorldDownloader/
cp meta.json /var/lib/jellyfin/plugins/AniWorldDownloader/
sudo systemctl restart jellyfinAfter installing, go to Dashboard > Plugins > AniWorld Downloader to configure.
| Setting | Description |
|---|---|
| Max Concurrent Downloads | How many downloads run at the same time (default: 2) |
| Max Retry Attempts | How many times to retry a failed download before giving up (default: 3) |
| Auto-scan Library | Trigger a Jellyfin library scan when a download finishes |
| Enable for non-admin users | Allow non-admin users to access the downloader via the sidebar (see Non-admin access) |
| Proxy Server | Route all network requests and downloads through a proxy (e.g. http://proxy:8080 or socks5://proxy:1080). Leave empty to connect directly. Requires a server restart after changing. |
Each site can be enabled or disabled independently and has its own settings. If a per-site setting is left empty, the global default is used.
| Setting | Description |
|---|---|
| Enabled | Toggle this site on or off |
| Download Path | Where to save files (should point to a Jellyfin library folder) |
| Preferred Language | Default language for downloads |
| Preferred Provider | Default streaming provider |
| Fallback Provider | Backup provider if the primary one fails after all retries |
By default, the plugin UI is only accessible from the admin dashboard. You can enable it for all users so it appears as a sidebar entry.
- Install the File Transformation plugin
- Restart Jellyfin
- Go to Dashboard > Plugins > AniWorld Downloader and enable Enable for non-admin users
- Restart Jellyfin again
Non-admin users will see an AniWorld Downloader entry in the sidebar that opens the full UI in a modal overlay. The settings button is hidden in this view. Configuration is only available through the admin dashboard.
Note: The File Transformation plugin injects a script tag into Jellyfin's
index.htmlat runtime (no files are modified on disk). Disabling the setting and restarting will remove the sidebar entry.
- Open AniWorld Downloader from the admin dashboard sidebar (or the sidebar entry if non-admin access is enabled)
- Use Search to find a title, or browse Popular / New Releases
- Click a title to see its seasons and episodes
- Hit Download on an episode, or use Download Season / Download All Seasons for batch downloads
- Switch to the Downloads tab to monitor progress
- Check History for past downloads and stats
- Searches use each site's AJAX search endpoint
- Series, season, and episode pages are scraped to find provider links
- Provider redirect URLs are resolved to embed pages
- Each provider has a dedicated extractor that pulls out the direct stream URL
- ffmpeg downloads the stream and saves it as MKV
| Provider | Site | Method |
|---|---|---|
| VOE | aniworld/s.to | Decodes obfuscated JSON (ROT13, base64, char shift) to extract HLS URLs |
| Filemoon | aniworld/s.to | Handles both modern Byse API (AES-256-GCM) and legacy packed JS |
| Vidmoly | aniworld/s.to | Extracts HLS URLs from JavaScript sources |
| Vidoza | aniworld/s.to | Extracts MP4 URLs from source tags |
s.to has put their provider redirector (/r?t=...) behind a Cloudflare Turnstile gate that activates per-IP for "flagged" egress addresses. Many datacenter ranges (Hetzner, OVH, etc.) get the gate; most residential IPs don't. From a flagged IP, every download retry produces logs like:
Resolved to embed URL: "https://s.to/r?t=..."
No JSON script blocks found in VOE page
Failed to extract VOE source from page
Because the gate requires a real browser to solve an interactive Turnstile widget, the plugin can't bypass it on its own. Your options:
- Route the plugin through a clean proxy. Set Proxy Server in plugin settings to a SOCKS5 or HTTP proxy on a residential / unflagged IP (e.g.
socks5://user:pass@proxy:1080). Restart Jellyfin. This is the recommended fix. - Use a VPN on the Jellyfin host so all outbound traffic exits a clean IP.
- aniworld.to is currently unaffected — if you only need anime, downloads still work normally on flagged IPs.
To check whether your server's IP is flagged, the repo includes scripts/check-sto-flag.sh: copy it to the server and run it.
This project is licensed under the GNU General Public License v3.0.

