A Twitch and YouTube frontend written in Rust using Tauri and SvelteKit.
![]()
zfg1 playing OOT. Chat on Copium for Prime 4.
|
![]()
paganmars playing Monster Hunter Wilds. An excelent use of screen space with PiP.
|
Very old screenshots.
rt:://
URLs.All installers (
exe
,deb
,rpm
) are provided in a small zip file.
Github Actions builds are available here.
Tested on Windows and Ubuntu. Not tested on macOS as I don't have access to a macOS machine, if you manage to build and test it, please let me know and I will work on fixing issues and adding it to the build bundles.
On launch, a custom protocol handler is registered for rt://
URLs, this allows you to open videos or streams directly in the app.
If the app is not running, it will be started with the URL as an argument, if it is running, the URL will be opened in a new window.
YouTube
:
rt://yt/dQw4w9WgXcQ
rt://youtube/dQw4w9WgXcQ
rt://www.youtube.com/watch?v=dQw4w9WgXcQ
rt://youtu.be/dQw4w9WgXcQ
Twitch
:
rt://tw/zfg1
rt://twitch/zfg1
rt://www.twitch.tv/zfg1
If using extensions like LibRedirect, you can set a frontend for YouTube like Invidious and set the instance URL to rt://yt
. The same can be done for Twitch, you can set the frontend to SafeTwitch and set the instance URL to rt://tw
.
To store users, feeds and emotes, SQLite is used with sqlx.
Data (databases, window state, etc):
%AppData%/com.rt.app
~/.config/com.rt.app
Logs:
%LocalAppData%/com.rt.app/logs
$XDG_DATA_HOME/com.rt.app/logs
or $HOME/.local/share/com.rt.app/logs
YouTube
:
Using the excellent RustyPipe library to interact with YouTube.
The feed uses the faster YouTube's rss feed to retrieve videos to avoid rate limits, this sadly does not contain video duration.
The player uses Vidstack's YouTube provider to play videos via embeds, this has the drawbacks of not being able to play videos that disallows embedding and not being able to select a video quality.
Twitch
:
The player uses a custom hls.js loader that communicates with the backend to modify the streams m3u8 manifests, this is what allows for ad blocking as the backend can detect ads and switch to a backup stream until ads are over, this was inspired on TwitchAdSolutions method of switching streams.
The backend uses a PersistedQuery for the feed and a custom query to the Twitch API to retrieve user data and stream playback.
avif
format in emotes in Linux, maybe use webp
or png
instead.