{"id":26759508,"url":"https://github.com/Kyagara/rt","last_synced_at":"2025-03-28T17:02:04.083Z","repository":{"id":280505054,"uuid":"942078293","full_name":"Kyagara/rt","owner":"Kyagara","description":"Twitch and Youtube frontend app using Tauri and SvelteKit. Save users, watch streams and videos, block ads, view chat with emote support.","archived":false,"fork":false,"pushed_at":"2025-03-27T17:05:56.000Z","size":2338,"stargazers_count":21,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-27T18:23:11.362Z","etag":null,"topics":["adblock","app","desktop","frontend","javascript","proxy","rust","svelte","sveltekit","tailwindcss","tauri","twitch","typescript","vidstack","youtube"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kyagara.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-03T14:38:01.000Z","updated_at":"2025-03-27T17:06:00.000Z","dependencies_parsed_at":"2025-03-03T20:29:00.804Z","dependency_job_id":"aa6e9c06-7c4f-49a0-8075-355422f97758","html_url":"https://github.com/Kyagara/rt","commit_stats":null,"previous_names":["kyagara/rt"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kyagara%2Frt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kyagara%2Frt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kyagara%2Frt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kyagara%2Frt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kyagara","download_url":"https://codeload.github.com/Kyagara/rt/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246068270,"owners_count":20718503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adblock","app","desktop","frontend","javascript","proxy","rust","svelte","sveltekit","tailwindcss","tauri","twitch","typescript","vidstack","youtube"],"created_at":"2025-03-28T17:01:51.147Z","updated_at":"2025-03-28T17:02:04.078Z","avatar_url":"https://github.com/Kyagara.png","language":"Rust","readme":"# RT (name pending)\n\nA Twitch and YouTube frontend written in Rust using Tauri and SvelteKit.\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd align=\"center\"\u003e\n            \u003cimg alt=\"zfg1 playing OOT Randomizer\" src=\".github/assets/screenshot-1.jpg\" width=\"500\"\u003e\n            \u003cem\u003e\n                \u003cdiv\u003e\n                    \u003ca href=\"https://www.twitch.tv/zfg1\"\u003ezfg1\u003c/a\u003e playing OOT. Chat on Copium for Prime 4.\n                \u003c/div\u003e\n            \u003c/em\u003e\n        \u003c/td\u003e\n        \u003ctd align=\"center\"\u003e\n            \u003cimg alt=\"paganmars playing Monster Hunter Wilds\" src=\".github/assets/screenshot-2.jpg\" width=\"500\"\u003e\n            \u003cem\u003e\n                \u003cdiv\u003e\n                    \u003ca href=\"https://www.twitch.tv/paganmars\"\u003epaganmars\u003c/a\u003e playing Monster Hunter Wilds. An excelent use of screen space with PiP.\n                \u003c/div\u003e\n            \u003c/em\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e Very old screenshots.\n\n## Features\n\n- Add users to your stream and video feeds.\n- Watch content in any of the available resolutions.\n- View Twitch chat with 7tv and BetterTTV emotes.\n- Ad blocking.\n- Open videos or streams directly in the app using `rt:://` URLs.\n\n## Download\n\n\u003e All installers (`exe`, `deb`, `rpm`) are provided in a small zip file.\n\n[Quick download.](https://nightly.link/Kyagara/rt/workflows/build.yaml/main/bundles.zip)\n\nGithub Actions builds are available [here](https://github.com/Kyagara/rt/actions).\n\n## About\n\nTested 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.\n\n### Redirects\n\nOn launch, a custom protocol handler is registered for `rt://` URLs, this allows you to open videos or streams directly in the app.\n\nIf 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.\n\n`YouTube`:\n\n- `rt://yt/dQw4w9WgXcQ`\n- `rt://youtube/dQw4w9WgXcQ`\n- `rt://www.youtube.com/watch?v=dQw4w9WgXcQ`\n- `rt://youtu.be/dQw4w9WgXcQ`\n\n`Twitch`:\n\n- `rt://tw/zfg1`\n- `rt://twitch/zfg1`\n- `rt://www.twitch.tv/zfg1`\n\nIf using extensions like [LibRedirect](https://github.com/libredirect/browser_extension), 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`.\n\n### Paths\n\nTo store users, feeds and emotes, SQLite is used with [sqlx](https://crates.io/crates/sqlx).\n\nData (databases, window state, etc):\n\n- Windows: `%AppData%/com.rt.app`\n- Linux: `~/.config/com.rt.app`\n\nLogs:\n\n- Windows: `%LocalAppData%/com.rt.app/logs`\n- Linux: `$XDG_DATA_HOME/com.rt.app/logs` or `$HOME/.local/share/com.rt.app/logs`\n\n### Frontends\n\n`YouTube`:\n\nUsing the excellent [RustyPipe](https://crates.io/crates/rustypipe) library to interact with YouTube.\n\nThe feed uses the faster YouTube's rss feed to retrieve videos to avoid rate limits, this sadly does not contain video duration.\n\nThe player uses Vidstack's YouTube [provider](https://vidstack.io/docs/player/api/providers/youtube/) 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.\n\n`Twitch`:\n\nThe player uses a custom [hls.js](https://github.com/video-dev/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](https://github.com/pixeltris/TwitchAdSolutions) method of switching streams.\n\nThe backend uses a PersistedQuery for the feed and a custom query to the Twitch API to retrieve user data and stream playback.\n\n## TODO\n\n- Update screenshots.\n- Add information about the content somewhere in the watch page.\n- Maybe cache users/emotes/feeds in the AppState, also maybe return them when possible in the same request instead of emitting an update event.\n- More logging and better errors.\n- Maybe make a custom player layout using tailwind.\n- YouTube:\n  - Maybe move from youtube embed to using RustyPipe's botguard and retrieve video URLs using it.\n  - Add YouTube channel page with video search.\n  - Allow downloading videos and thumbnails.\n  - Subscribe to channel from watch page.\n  - Search for videos in the feed.\n- Twitch:\n  - It seems there are issues with the `avif` format in emotes in Linux, maybe use `webp` or `png` instead.\n  - Put the seek bar at the end when joining a stream, currently it is some seconds behind when first joining.\n  - Add global Twitch emotes.\n","funding_links":[],"categories":["Svelte"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKyagara%2Frt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKyagara%2Frt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKyagara%2Frt/lists"}