{"id":13552829,"url":"https://github.com/drgroot/plexcontroller","last_synced_at":"2026-03-11T22:39:28.945Z","repository":{"id":42236279,"uuid":"380237969","full_name":"drgroot/plexcontroller","owner":"drgroot","description":"Controls multiple instances of plex using the plex API","archived":false,"fork":false,"pushed_at":"2023-03-06T04:51:14.000Z","size":639,"stargazers_count":12,"open_issues_count":9,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-04T00:32:31.176Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/drgroot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null}},"created_at":"2021-06-25T12:56:39.000Z","updated_at":"2021-12-10T20:08:04.000Z","dependencies_parsed_at":"2023-10-21T10:57:27.855Z","dependency_job_id":null,"html_url":"https://github.com/drgroot/plexcontroller","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/drgroot%2Fplexcontroller","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drgroot%2Fplexcontroller/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drgroot%2Fplexcontroller/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drgroot%2Fplexcontroller/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/drgroot","download_url":"https://codeload.github.com/drgroot/plexcontroller/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246939122,"owners_count":20857916,"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":[],"created_at":"2024-08-01T12:02:11.202Z","updated_at":"2026-03-11T22:39:28.895Z","avatar_url":"https://github.com/drgroot.png","language":"TypeScript","readme":"# PlexController\n\n[![GitHub stars](https://img.shields.io/github/stars/drgroot/plexcontroller)](https://github.com/drgroot/plexcontroller/stargazers)\n\n**Description**\n\nPlexController syncs playback status between servers using Postgres and RabbitMQ. When a user starts playing media on one server, the information is written to the Postgres database, and instructions are sent via RabbitMQ to synchronize the playback status. Periodically (using CRON), the controllers will confirm that the playback status on the Plex Server is aligned to the database. When a conflict arises, the database is the winner. \n\n## Simple Setup\n\ndocker-compose.yml\n```yaml\nversion: '3'\nservices:\n\n  plexServer1:\n    container_name: plexServer1\n    image: plexinc/pms-docker\n\n  controller1:\n    container_name: controller1\n    image: yusufali/plexcontroller\n    environment:\n      # controllers use rabbitmq to send playback information to each other.\n      # controllers use postgres to store persistant playback information.\n      RABBITMQ_URL: ampq://rabbitmqHost/myVhost\n      DATABASE_URL: postgres://user:pass@mypostgresHost:5432/mydatabase\n\n      # specify credentials to log in to plex.tv. It needs to login to plex.tv\n      # to get the authTokens for users signed into the server. These authTokens\n      # is used to set playback information\n      PLEXUSERNAME: myplexusername\n      PLEXPASSWORD: myplexpassword\n\n      # configure when daily and monthly tasks are to run. scheduled tasks are to\n      # ensure that playback information is synced with playback information stored in\n      # the database\n      MONTHLY_CRON: '0 2 3 * *'\n      DAILY_CRON: '5 4 * * *'\n      CRON_TIMEZONE: 'America/Toronto'\n\n      # specify the IP address of the server for this controller to control\n      PLEXLOCAL_IP: plexServer1\n    links:\n      - plexServer1\n\n\n\n  plexServer2:\n    container_name: plexServer2\n    image: plexinc/pms-docker\n\n  controller2:\n    container_name: controller2\n    image: yusufali/plexcontroller\n    environment:\n      RABBITMQ_URL: ampq://rabbitmqHost/myVhost\n      DATABASE_URL: postgres://user:pass@mypostgresHost:5432/mydatabase\n      PLEXUSERNAME: myplexusername\n      PLEXPASSWORD: myplexpassword\n      MONTHLY_CRON: '0 2 3 * *'\n      DAILY_CRON: '5 4 * * *'\n      CRON_TIMEZONE: 'America/Toronto'\n      PLEXLOCAL_IP: plexServer2\n    links:\n      - plexServer2\n```\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrgroot%2Fplexcontroller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdrgroot%2Fplexcontroller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrgroot%2Fplexcontroller/lists"}