{"id":23503438,"url":"https://github.com/rblsb/synctube","last_synced_at":"2025-05-16T08:00:21.467Z","repository":{"id":39534149,"uuid":"240267082","full_name":"RblSb/SyncTube","owner":"RblSb","description":"Synchronized video viewing with chat and other features (one-channel web service)","archived":false,"fork":false,"pushed_at":"2025-04-09T22:02:36.000Z","size":1090,"stargazers_count":300,"open_issues_count":3,"forks_count":59,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-28T14:44:34.155Z","etag":null,"topics":["haxe","nodejs","self-hosted","synctube"],"latest_commit_sha":null,"homepage":"","language":"Haxe","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RblSb.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,"zenodo":null}},"created_at":"2020-02-13T13:29:50.000Z","updated_at":"2025-04-21T07:35:30.000Z","dependencies_parsed_at":"2024-01-07T14:11:25.415Z","dependency_job_id":"ddae0b00-15fc-448a-b24f-b6621aa4dee0","html_url":"https://github.com/RblSb/SyncTube","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RblSb%2FSyncTube","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RblSb%2FSyncTube/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RblSb%2FSyncTube/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RblSb%2FSyncTube/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RblSb","download_url":"https://codeload.github.com/RblSb/SyncTube/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254493382,"owners_count":22080126,"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":["haxe","nodejs","self-hosted","synctube"],"created_at":"2024-12-25T08:29:45.378Z","updated_at":"2025-05-16T08:00:21.328Z","avatar_url":"https://github.com/RblSb.png","language":"Haxe","readme":"# \u003cimg src=\"./res/img/favicon.svg\" height=\"40\" align=\"top\"\u003e SyncTube\r\nSynchronized video viewing with chat and other features.\r\nLightweight modern implementation and a very easy way to run locally.\r\n\r\nDefault channel example: https://synctube.onrender.com/\r\n\r\n## Features\r\n- Control video playback for all users with active `Leader` button\r\n- Start watching local videos while uploading them to the server, before upload completes\r\n- External `vtt`/`srt`/`ass` subtitles support\r\n- External audiotrack / voiceover support\r\n- `/30`, `/-21`, etc chat commands to rewind video playback by seconds\r\n- Hotkeys (`Alt-P` for global play/pause, [etc](https://github.com/RblSb/SyncTube/blob/382f9b2ebedca905028341825350a0fa69d88673/src/client/Buttons.hx#L416-L427))\r\n- Compact view button with page fullscreen on Android\r\n- Playback rate synchronization (with leader)\r\n- Links mask: `foo.com/bar${1-4}.mp4` to add multiple items\r\n- Override every front-end file you want (`user/res` folder)\r\n- [Native mobile client](https://github.com/RblSb/SyncTubeApp)\r\n\r\n### Easier playback controls for smaller groups\r\n- Enable `requestLeaderOnPause` to allow global pause by any user, without `Leader` button\r\n- Enable `unpauseWithoutLeader` to allow global unpause for non-leaders\r\n\r\n## Supported players\r\n- Youtube (videos, shorts, streams and playlists)\r\n- [Streamable](https://streamable.com)\r\n- [VK](https://vk.com/video)\r\n- [Peertube](https://joinpeertube.org) (with `pt:` url prefix)\r\n- Raw mp4 videos and m3u8 playlists (or any other media format supported in browser)\r\n- Iframes (without sync)\r\n\r\n## Setup\r\n- Open `4200` port in your router settings (port is customizable)\r\n- `npm ci` in this project folder ([NodeJS 14+](https://nodejs.org) required)\r\n- Run `node build/server.js`\r\n- Open showed \"Local\" link for yourself and send \"Global\" link to friends\r\n\r\n## Setup (Docker)\r\nAs alternative, you can install Docker and run:\r\n\u003e ```shell\r\n\u003e docker build -t synctube .\r\n\u003e docker run --rm -it -p 4200:4200 -v ${PWD}/user:/usr/src/app/user synctube\r\n\u003e ```\r\n\r\nor\r\n\r\n\u003e ```shell\r\n\u003e docker compose up -d\r\n\u003e ```\r\n\r\n- (Docker container hides real local/global ips, so you need to checkout it manually)\r\n\r\n\r\n## Optional dependencies\r\nIf you want to enable `Cache on server` feature for Youtube player, you can also run:\r\n```shell\r\nnpm i @distube/ytdl-core@latest\r\n```\r\nAnd install `ffmpeg` on your server system, it's only used to build single mp4 from downloaded audio/video tracks. Default cache size is 3.0 GiB.\r\n\r\n## Configuration\r\nIt just works, but you can also check [user/ folder](/user/README.md) for server settings and additional customization.\r\n\r\n## How to use\r\n- Login with any nickname\r\n- Add your video url with \"plus\" button below (youtube or direct link to mp4 for example)\r\n- Now it plays and syncs for all page users, well done\r\n- You can click \"leader\" button to get access to global video controls (play/pause, seeking, playback speed)\r\n- If you want to restrict permissions or add admins/emotes, see `Configuration` above\r\n\r\n## Chat commands\r\n- `/1h9m54` - Command format to rewind video by `1 hour 9 minutes 54 seconds`\r\n- `/-1h9m54` - Same, but rewinds back\r\n- `/ad` - Rewind sponsored block in active YouTube video\r\n- `/fb` (`/flashback`) - Rewind video to a prev time if someone rewinded/restarted video accidentally\r\n- `/volume 2.6` - Change player volume in `0-1` range or boost it in `0-3` range for quiet videos\r\n- `/clear` - Clear chat. Admin clears chat globally\r\n- `/help` - Show initial tutorial message\r\n\r\n### Admins only:\r\n\r\n- `/ban Guest 1 2h` - Ban user `Guest 1` ip for `2 hours`\r\n- `/unban Foo` (`/removeBan`) - Unban user `Foo`\r\n- `/kick Foo` - Force `Foo` disconnection until page reload\r\n- `/dump` - Download state dump to report issues\r\n\r\n## Plugins\r\n- [octosubs](https://github.com/RblSb/SyncTube-octosubs) - More colorful `ASS`/`SSA` subtitles support\r\n- [qswitcher](https://github.com/aNNiMON/SyncTube-QSwitcher) - Raw video quality switcher\r\n\r\n## Integrations\r\n### Platform services without permanent storage:\r\n- Create app and commit repo to get build\r\n- Remove `user/` folder from `.gitignore` and commit it to change default configuration\r\n- Add `APP_URL` config var with `your-app-link.herokuapp.com` value if you need to prevent sleeping when clients online\r\n\r\n## Development\r\n- Install [Haxe 4.3](https://haxe.org/download/), [VSCode](https://code.visualstudio.com) and [Haxe extension](https://marketplace.visualstudio.com/items?itemName=nadako.vshaxe)\r\n- `haxelib install all` to install extern libs\r\n- If you skipped `Setup` section before: `npm ci`\r\n- Open project in VSCode and press `F5` for client+server build and run\r\n\r\n## About\r\n- [Redesign](https://github.com/RblSb/SyncTube/pull/5) by Austin Riddell\r\n- [Original idea](https://github.com/calzoneman/sync) by Calvin Montgomery\r\n- Default emotes by [emlan](https://www.deviantart.com/emlan)\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frblsb%2Fsynctube","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frblsb%2Fsynctube","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frblsb%2Fsynctube/lists"}