2020-10-08 23:53:16 +00:00
[github-release-badge]: https://img.shields.io/github/workflow/status/synclounge/synclounge/release?label=release& style=for-the-badge
[docker-version-badge]: https://img.shields.io/docker/v/synclounge/synclounge?label=Docker& sort=semver& style=for-the-badge
[docker-latest-size-badge]: https://img.shields.io/docker/image-size/synclounge/synclounge?sort=semver& style=for-the-badge
[docker-pulls-badge]: https://img.shields.io/docker/pulls/synclounge/synclounge?style=for-the-badge
2020-09-05 23:12:20 +00:00
[npm-badge]: https://img.shields.io/npm/v/synclounge?style=for-the-badge
2020-10-08 23:53:16 +00:00
[dependencies-badge]: https://img.shields.io/david/synclounge/synclounge?style=for-the-badge
[devdependencies-badge]: https://img.shields.io/david/dev/synclounge/synclounge?style=for-the-badge
[license-badge]: https://img.shields.io/github/license/synclounge/synclounge?style=for-the-badge
[app-badge]: https://img.shields.io/website?label=App& style=for-the-badge& up_message=online& url=https%3A%2F%2Fapp.synclounge.tv
[release-action-link]: https://github.com/synclounge/synclounge/actions?query=workflow%3Arelease+branch%3Amaster "Release action"
[dockerhub-link]: https://hub.docker.com/r/synclounge/synclounge "Docker images of SyncLounge"
[dockerhub-tags-link]: https://hub.docker.com/r/synclounge/synclounge/tags "Docker tags of Synclounge"
[docker-microbadger-link]: https://microbadger.com/images/synclounge/synclounge "Docker size"
2020-09-05 23:12:20 +00:00
[npm-link]: https://www.npmjs.com/package/synclounge "NPM package"
2020-10-08 23:53:16 +00:00
[dependencies-link]: https://david-dm.org/synclounge/synclounge
[devdependencies-link]: https://david-dm.org/synclounge/synclounge?type=dev
[app-link]: https://app.synclounge.tv
2020-07-24 21:25:45 +00:00
[license-link]: https://opensource.org/licenses/MIT "MIT License"
2020-10-08 23:53:16 +00:00
![SyncLounge ](https://github.com/synclounge/synclounge/raw/master/src/assets/images/logos/logo-long-dark.png )
2020-07-24 21:25:45 +00:00
2020-09-05 23:29:45 +00:00
[![App][app-badge]][app-link]
2020-09-05 23:12:20 +00:00
[![npm][npm-badge]][npm-link]
[![Docker Version][docker-version-badge]][dockerhub-link]
[![Docker Size][docker-latest-size-badge]][dockerhub-link]
[![Docker Pulls][docker-pulls-badge]][dockerhub-link]
2020-08-27 01:22:33 +00:00
[![Release][github-release-badge]][release-action-link]
2020-09-05 23:12:20 +00:00
[![Dependencies][dependencies-badge]][dependencies-link]
[![Dev Dependencies][devdependencies-badge]][devdependencies-link]
2020-07-24 21:25:45 +00:00
[![License][license-badge]][license-link]
2017-04-07 05:09:03 +00:00
2020-10-08 23:53:16 +00:00
SyncLounge (Previously PlexTogether) is a tool to sync [Plex ](https://plex.tv ) content across multiple players in multiple locations.
2017-04-07 05:09:03 +00:00
## How it works
2020-10-13 21:45:08 +00:00
2017-12-13 23:19:59 +00:00
SyncLounge aims to keep multiple viewing sessions in sync regardless of whether the clients are in the same room or across the globe. To do this SyncLounge utilizes a middle-man server to communicate between each of the SyncLounge clients. Users choose their Plex client, decide on a SyncLounge Server and Room name and join up. Your friends/family can do the same. Whoever joins the room first will become the host.
2017-04-07 05:09:03 +00:00
2017-12-13 23:19:59 +00:00
The host has complete control over a room. Commands they send to their client will be sent through to other people in the room (Play, Pause, Seek etc). If the host starts playing something different, SyncLounge will search all of your available Plex Media Servers for an equiavalent copy, even if it is not from the same Plex Media Server as the Host.
2017-04-07 05:09:03 +00:00
## Features
2020-10-13 21:45:08 +00:00
- Syncing between Plex Clients over the Internet
- SyncLounge Player
- Plays content directly within SyncLounge.
- Built specifically for syncing.
- Settings to tune SyncLounge to your environment
- Client Polling Interval - Sets how frequently SyncLounge will poll the client for new information.
- Sync Flexability - Sets the acceptable distance away from the host in milliseconds.
- Sync method:
- Clean seek - Seeks straight to where the host is.
- Skip ahead - Seeks 10 seconds ahead, pauses and then resumes 10 seconds later.
- Plex Media Server blocking - allows you to restrict the servers SyncLounge searches for content.
- Autoplay content
- SyncLounge will automatically search all of your available Plex Media Servers for content that is similar to the Host.
- Plex Media Server Browsing - find, search and fling content to Plex Clients from within SyncLounge.
- Metadata fetching from Plex Media Server
- Chat to others in your room
- Password locked rooms
- Invite others via generated short link
- Movies and TV Shows (Music not supported)
2017-04-07 05:09:03 +00:00
## Screenshots
2020-10-08 23:53:16 +00:00
Head to the [website ](https://synclounge.tv )
2017-04-07 05:09:03 +00:00
## Supported Plex Clients
2020-10-13 21:45:08 +00:00
2017-12-13 12:58:15 +00:00
Theoretically, all Plex Clients that implement the Plex Client Protocol will work. As some clients have this implemented slightly differently, compability with SyncLounge may vary. If you have access to one of the untested clients please let us know so we can update our list below.
2017-04-07 05:09:03 +00:00
Some low powered clients may be hard to achieve a perfect sync with (for example: Raspberry Pi clients).
2020-03-04 04:15:36 +00:00
2017-06-08 18:31:10 +00:00
### Unsupported
2020-10-13 21:45:08 +00:00
- Plex Web Player (Chrome/Safari/Firefox)
2017-06-08 18:31:10 +00:00
2017-04-07 05:09:03 +00:00
### Supported
2020-10-13 21:45:08 +00:00
- Plex Media Player
- Plex Home Theater
- OpenPHT
- Rasplex
- Roku
- Android
- Nvidia Shield
- iOS (iPhone & iPad)
- AppleTV
2018-07-20 04:37:24 +00:00
### Broken
2020-10-13 21:45:08 +00:00
- Xbox One
- Xbox 360
- PS3
- PS4
2017-04-07 05:09:03 +00:00
2020-04-01 00:51:39 +00:00
## Documentation
2017-04-07 05:09:03 +00:00
2020-08-28 00:35:21 +00:00
### Installation
2020-10-13 21:45:08 +00:00
By default, it listens on port 8088. All the paths are relative, so you can use a reverse proxy at any subdirectory or subdomain without any additional configuration to SyncLounge. In this version, the webapp and socket server are combined so you only need to proxy that one port if you are using a reverse proxy.
2020-08-28 00:35:21 +00:00
#### Docker
2020-10-13 21:45:08 +00:00
2020-08-28 00:35:21 +00:00
Using the Docker image is the easiest path because it works out of the box.
You can get it running immediately by
2020-10-13 21:45:08 +00:00
2020-08-28 00:35:21 +00:00
```sh
2020-10-08 23:53:16 +00:00
docker pull synclounge/synclounge
docker run -p 8088:8088 synclounge/synclounge:latest
2020-08-28 00:35:21 +00:00
```
2020-10-08 23:53:16 +00:00
You can use environment variables to change any of the [default configuration ](https://github.com/synclounge/synclounge/blob/master/config/defaults.js ).
2020-08-28 00:35:21 +00:00
#### Linux (Without Docker)
2020-10-13 21:45:08 +00:00
2020-08-31 22:55:14 +00:00
Make sure you have nodejs installed.
2020-10-13 21:45:08 +00:00
2020-08-28 00:35:21 +00:00
```sh
2020-08-31 22:55:14 +00:00
sudo npm install -g synclounge
2020-08-28 00:35:21 +00:00
```
2020-08-31 22:55:14 +00:00
Then you can run it:
2020-10-13 21:45:08 +00:00
2020-08-31 22:55:14 +00:00
```
synclounge
2020-08-28 00:35:21 +00:00
```
2020-10-08 23:53:16 +00:00
If you want to change any of the [default configuration ](https://github.com/synclounge/synclounge/blob/master/config/defaults.js ), you can either use environment variables with the same name, use command line arguments, or use a config file and run synclounge like `synclounge --config_file /path/to/config.json`
2020-08-28 00:35:21 +00:00
2020-09-05 00:41:55 +00:00
### Sample Nginx config
2020-10-13 21:45:08 +00:00
2020-09-05 00:41:55 +00:00
If you want to run SyncLounge behind Nginx, here is an example configuration
2020-09-05 02:22:43 +00:00
#### Subdomain sub.domain.com
2020-10-13 21:45:08 +00:00
2020-09-05 00:41:55 +00:00
```
map $http_upgrade $connection_upgrade {
default upgrade;
'' '';
}
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
2020-09-05 02:22:43 +00:00
# TODO: Replace this with your domain
server_name somesubdomain.yourserver.com;
# TODO: include your ssl certs and parms, etc
2020-09-05 00:41:55 +00:00
location / {
2020-09-05 02:22:43 +00:00
# TODO: Replace this with your container address or localhost
2020-09-05 00:41:55 +00:00
proxy_pass http://containeraddress:8088;
proxy_http_version 1.1;
proxy_socket_keepalive on;
proxy_redirect off;
2020-09-05 02:22:43 +00:00
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
}
}
```
#### Subfolder domain.com/somefolder/
2020-10-13 21:45:08 +00:00
2020-09-05 02:22:43 +00:00
To make synclounge run at a subfolder, all you need to do is change your reverse proxy configuration.
2020-10-13 21:45:08 +00:00
2020-09-05 02:22:43 +00:00
```
map $http_upgrade $connection_upgrade {
default upgrade;
'' '';
}
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# TODO: Replace this with your domain
server_name somesubdomain.yourserver.com;
# TODO: include your ssl certs and parms, etc
# TODO: replace "somefolder" with your desired subfolder
location /somefolder/ {
# TODO: Replace this with your container address or localhost.
# Important: keep the trailing slash
proxy_pass http://containeraddress:8088/;
proxy_http_version 1.1;
proxy_socket_keepalive on;
proxy_redirect off;
2020-09-05 00:41:55 +00:00
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
}
}
2020-10-13 21:45:08 +00:00
```
2020-08-28 00:35:21 +00:00
2020-10-08 23:53:16 +00:00
The FAQ, Self-Hosting, Development, Contributing, and other documentation has been move to [docs.synclounge.tv ](https://docs.synclounge.tv )! Head there for more information!
2017-04-07 05:09:03 +00:00
## Contributors
2020-10-13 21:45:08 +00:00
2017-04-07 05:09:03 +00:00
[samcm ](https://twitter.com/durksau ) - Developer
2020-10-11 06:07:18 +00:00
[gcordalis ](https://twitter.com/gcordalis ) - User Interface
2017-04-07 05:09:03 +00:00
2020-10-13 21:45:08 +00:00
[ttshivers ](https://github.com/ttshivers ) - Developer
2017-04-07 05:09:03 +00:00
[Brandz ](https://twitter.com/homebrandz ) - Design
[TheGrimmChester ](https://github.com/TheGrimmChester ) - Developer/Tester
2020-03-14 05:41:37 +00:00
[MagicalCodeMonkey ](https://github.com/MagicalCodeMonkey ) - Developer/Tester
2017-06-04 08:13:26 +00:00
[Starbix ](https://github.com/Starbix ) - Docker Support
2017-06-04 08:13:01 +00:00
2017-04-07 05:09:03 +00:00
kg6jay - Tester
## Contact
2020-10-13 21:45:08 +00:00
2017-04-07 05:09:03 +00:00
[Discord Server ](https://discord.gg/Cp9RPSJ )
Twitter:
2017-12-13 12:58:15 +00:00
[SyncLounge ](https://twitter.com/syncloungetv )
2017-04-07 05:09:03 +00:00
## License
2020-10-13 21:45:08 +00:00
SyncLounge is licensed under MIT License. See the `LICENSE.txt` file.
2017-12-13 12:58:15 +00:00
SyncLounge is in no way affiliated with Plex Inc.
2020-07-24 20:10:04 +00:00
Using [Material Design libraries ](https://material.io/ ) provided under [CC-BY 4.0 ](https://creativecommons.org/licenses/by/4.0/legalcode )