A vibe coded, accessible plex client for blind screen reader users
  • Python 97.1%
  • Batchfile 2.9%
Find a file
2026-03-17 22:43:43 -07:00
build/plexible Fix update_helper.bat to clean install dir before copying new files (prevents mixed Python versions) 2026-02-01 11:24:00 -08:00
dist/Plexible Fix update_helper.bat to clean install dir before copying new files (prevents mixed Python versions) 2026-02-01 11:24:00 -08:00
plex_client Bump version to v1.39.2 2026-02-21 23:31:51 -08:00
release Fix update_helper.bat to clean install dir before copying new files (prevents mixed Python versions) 2026-02-01 11:24:00 -08:00
tests plexAPI bugfixes 2026-02-21 23:30:24 -08:00
tools Move batch release helpers into Python tool 2026-02-21 22:53:27 -08:00
.gitattributes Add .gitattributes to mark build output as generated, show Python as primary language 2026-03-17 22:43:43 -07:00
agents.md Updated the build so it works everywhere, hopefully 2025-12-22 18:01:49 -08:00
build_exe.bat Refactor release batch steps into subroutines 2026-02-21 23:11:17 -08:00
main.py Skip requirements install when running as frozen app 2025-12-20 18:42:28 -08:00
Plexible-v1.39.0.zip Fix update_helper.bat to clean install dir before copying new files (prevents mixed Python versions) 2026-02-01 11:24:00 -08:00
plexible.spec Fix updater: correct signing thumbprint, robust helper path resolution, preserve config 2026-02-01 11:17:35 -08:00
README.md Allow manifest-specified signing thumbprint 2025-12-28 15:47:21 -08:00
requirements.txt Add PyInstaller spec and update docs for Plexible 2025-12-19 18:03:08 -08:00

Plexible

Plexible is a desktop Plex client built with wxPython and the latest python-plexapi fork. It supports browser-based authentication, browsing any Plex library, and streaming video or audio through an embedded VLC.

Features

  • Plex account sign-in using the official browser PIN flow.
  • Automatic discovery of your Plex servers and libraries.
  • Lazy-loaded navigation tree for large libraries (movies, shows, music, photos, and collections).
  • Metadata viewer with quick playback controls.
  • Embedded playback surface powered by LibVLC.
  • Global search across all Plex libraries with Ctrl+F, plus quick server switching from the File menu.

Getting Started

  1. Run the application:

    python main.py
    

    Missing dependencies are installed automatically on first launch. The script invokes python -m pip install -r requirements.txt under the hood and may restart itself once installation completes.

    Note: wxPython and the custom python-plexapi fork both require build tools on some systems. Refer to their documentation if installation fails.

  2. (Optional) Install dependencies manually if you prefer to control the environment:

    python -m pip install -r requirements.txt
    
  3. Use File > Sign In... to launch the Plex browser login. After approving the request your libraries appear on the left.

  4. Control playback using the toolbar above the video surface or the Player menu (play/pause, stop, volume slider, mute, and player selection). Use File > Global Search... (Ctrl+F) to find content quickly, or File > Change Server... to switch Plex servers.

Development Notes

  • Configuration and the Plex authentication token are stored in config.json in the project root (next to main.py).
  • The client id persists between runs to avoid repeated approval prompts.
  • Playback uses the Plex stream URLs directly. Depending on codecs installed locally, videos may sometimes fall back to Plex's transcoding pipeline.

Troubleshooting

  • If playback does not start, confirm that the stream URL opens in your default browser. Some file types may require additional codecs in Windows.
  • LibVLC playback requires a local VLC installation that Python can discover. Install VLC and, if needed, set VLC_PATH (for the desktop app) or PYTHON_VLC_MODULE_PATH to point at the VLC installation directory.
  • For MPC-HC/BE fallback, install MPC-HC (or MPC-BE) and optionally set MPC_PATH to the player executable.
  • Signing out clears the cached token. If your token expires, simply sign out and sign back in.

Building

To build a standalone executable (directory-based for better compatibility):

Using the build script:

build_exe.bat build

Using PyInstaller directly:

pyinstaller plexible.spec

The output will be in the dist/Plexible folder. Run Plexible.exe from that directory.

Releases

The build script now supports automated releases and update metadata generation.

Prerequisites

  • Git and GitHub CLI (gh) installed and authenticated (gh auth login).
  • Windows SDK signtool available (defaults to C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe).
  • Code signing certificate installed and accessible by signtool.
  • Optional: set SIGNTOOL_PATH to override the default signtool location.
  • Optional: set SIGN_CERT_THUMBPRINT to force signtool to use a specific cert hash (self-signed is supported for testing/public builds).
  • Optional: set SIGN_CERT_STORE (default MY) and SIGN_CERT_MACHINE=1 for LocalMachine certs.
  • Optional: set PLEXIBLE_TRUSTED_SIGNING_THUMBPRINTS (comma-separated) to allow additional update signatures during testing.

Commands

build_exe.bat release

Runs end-to-end: computes the next version, updates plex_client/version.py, builds via plexible.spec, signs Plexible.exe, zips the dist\Plexible folder, generates Plexible-update.json, commits the version bump, tags, pushes, and creates a GitHub release with the zip + manifest attached.

build_exe.bat build

Builds, signs, zips, and generates update metadata locally (no git tag or GitHub release).

build_exe.bat dry-run

Prints the actions without modifying git or creating releases.

build_exe.bat

Legacy behavior (clean + build only).

Updater

Plexible checks GitHub Releases for the latest tag and reads Plexible-update.json from the release assets. It compares versions semver-style, downloads the release zip, validates its SHA-256 hash, and verifies the Authenticode signature before installing. Updates are applied by a helper script that waits for Plexible to exit, swaps files with a staged copy, keeps a backup for rollback, and restarts the app. For self-signed certificates, the updater accepts the pinned signing thumbprint if the OS trust chain is not available. The release manifest can include signing_thumbprint to allow updates signed with a specific cert, which avoids hard-coding certs in the app.

Controls

  • Help > Check for Updates... triggers a manual check.
  • Help > Automatically Check for Updates toggles the startup auto-check (default on).

Test Plan (Manual)

  1. Build an older version (or edit plex_client/version.py to 1.37.0) and run the app from dist\Plexible\Plexible.exe.
  2. Publish a release using build_exe.bat release (ensures a newer version exists on GitHub).
  3. In the older build, open Help > Check for Updates..., accept the update prompt, and confirm Plexible restarts on the new version.
  4. Validate that the update folder is created under %LOCALAPPDATA%\Plexible\updates and that the new exe is signed.

License

This project is provided without an explicit license. Adapt it to your needs or reach out if you require formal licensing terms.