Sourin is a cross-platform video aggregation client: a Flutter UI driven by Rust business logic over dart:ffi, running on Windows, macOS, Android and Android TV, unifying multiple content sources into one app for unified search, playback and download.
- v1.4.0-rc2
- Published at
- 1d ago
- 3
- Stars
- 48
- Download
- Synced at
- 1d ago
Latest release
v1.4.0-rc2Oct 18, 2026, 12:58 AMPre-releaseREADME
Project Overview
Sourin is a cross-platform video aggregation client that merges many content sources (built-in sites, third-party plugins, Bilibili, Emby/Jellyfin, IPTV live, CCTV) into a single interface for unified search, favorites, follow-up, playback and download.
The UI is Flutter; all business logic lives in Rust and talks to it directly over dart:ffi with no IPC layer. The playback core switched to media_kit + libmpv (bundling full FFmpeg), solving the original HEVC black-screen issue on Windows at the root.
| Item | Value |
|---|---|
| Platform | Windows, macOS, Android, Android TV |
| Stack | Flutter + Rust, direct dart:ffi |
| Playback core | libmpv (media_kit), d3d11va / MediaCodec HW decode |
| License | MIT |
All your video sources in one interface, with a Rust core for unified search, playback and download where HEVC plays reliably.
Key Features
- Multi-source aggregation: built-in sites, third-party plugins, declarative JSON sources and direct TVBox links, unified into one source list
- Cross-source search: one query fans out to all sources, streaming results in without waiting for the slowest
- Cross-source switch: the same show plays from another source, ranked by title similarity with progress migrated
- Playback: HEVC/H.264/AV1, ASS/SRT subtitles, Bilibili danmaku and custom danmaku servers, with speed, opacity and density all adjustable
- Full-file download: stitches all HLS segments into one file, one folder per show
- Cast & remote: DLNA cast to a TV that rewrites embedded m3u8 URLs, phone pairing as a remote
- Cloud sync: WebDAV backup/restore sharing favorites, history and progress across devices
- Desktop integration: tray icon, custom title bar, window geometry memory, picture-in-picture window
Target Audience
- Aggregation enthusiasts who want to manage many video sources in one place
- Heavy users who need favorites and progress synced across devices
- TV users who watch on Android TV or big-screen casting
- Developers who add sources via small JS plugins
- Media fans who care about HEVC and subtitle format compatibility
Quick Start
- Clone the repo and set up the Flutter and Rust toolchain per the README build section
- Build the Rust core first:
cd rust/sourin_core && cargo build --release - Then build the target platform:
flutter build windows --release -t lib/shell.dart - In Settings / Sources, paste a plugin JS, add a TVBox URL, or configure Emby/Bilibili login to add sources
- In development, set
DATA_DIR_OVERRIDEto a temp dir so real favorites and progress are not touched
Core Advantages
- Direct FFI: all logic in Rust, Flutter UI only, reusing 81% of the original Rust code
- Stable decoding: libmpv ships FFmpeg independent of system decoders, so HEVC, AC3 and DTS all play
- Plugin sandbox: JS plugins run in a QuickJS sandbox; paste source code to add new content sources
- Migratable data: shares the same data directory as the original, so favorites, history, progress and plugins carry over
System Requirements
| Item | Requirement |
|---|---|
| OS | Windows, macOS, Android, Android TV |
| Build tools | Flutter (Dart VM must allow JIT), Rust toolchain with cargo |
| Playback core | libmpv (media_kit), d3d11va / MediaCodec HW decode |
Notes
- HEVC black screen: if it occurs, set the hardware decode mode to
nofor software decoding, or check[PLAY]lines in the logs - DRM streams: some sources (notably CCTV) are DRM-encrypted, audio-only playback, the UI states this explicitly and it is not a bug
- Plugin data: plugin private cache lives in
plugins/.data/and may hold credentials, protect it