Skip to content

Repository files navigation

PlexCurator

A Windows desktop app for cleaning up a Plex library. It lists every movie — and, on a second tab, every TV series — in one sortable, filterable table with its rating, streaming history, age, size and genres, and adds a collection score that estimates how much a title belongs in your library. You pick what to remove and delete it in bulk.

Main window

There is no automatic cleanup. The app shows the numbers; you decide what goes.

Two tabs, Filme (movies) and Serien (series), sit side by side. Movies delete a single file; series delete the whole show folder — a series is only ever removed as a whole, never a single episode.

Features

  • Two tabs — movies and TV series — each with its own table, filters and bulk delete. The series tab loads the first time you open it.
  • One table with everything about each movie: title, IMDb rating, when it was last streamed, play count and how many users watched it, date added, resolution, file size and genres. Every column sorts.
  • The same for series: each row is one show, with its seasons/episodes count and the summed size of all episodes in place of the single-file resolution and size. Streaming history is rolled up from every episode, so play count and "last streamed" cover the whole series.
  • A collection score from 0 to 100 that combines quality (TMDb rating) with reach (TMDb vote count), so well-known classics rank high and good but obscure titles sit in the middle. It works the same for movies and series (using TMDb's TV data for shows). The cell is colored green (keep), amber (borderline) or red (drop), and a tooltip shows how the number was worked out. See the score below.
  • Spreadsheet-style column filters: a funnel icon on each header opens a popup with a search box and a checklist of values. Filters on several columns combine with AND.
  • A genre filter that matches on any one genre. Since a film can carry several genres, picking "Horror" shows every horror film, including the ones also tagged as something else.
  • Poster preview on hover: move the cursor over a title and its poster shows next to it. Posters load on demand and are cached.
  • Bulk delete with a check: select rows, review the count, total size and the real paths, confirm twice, and they are gone. For a series the whole show folder is removed, guarded so the target must sit inside your configured TV folder and can never be the folder root itself.

Genre filter

Requirements

  • Windows 10 or 11
  • A running Plex Media Server (URL + token) with a movie library and/or a TV library
  • A running Tautulli (URL + API key) with some watch history collected
  • A network share where the files live (a Windows UNC path or a mapped drive)
  • Optional: a TMDb API key for the collection score
  • Movies stored as one flat folder of .mkv files (one file per movie); series stored as one folder per show (seasons and episodes inside)

Installation

Option A: download the EXE (recommended)

Download PlexCurator.exe from the latest release and run it. No Python needed.

The EXE is not signed, so Windows SmartScreen may warn you the first time. Click "More info", then "Run anyway". Some antivirus tools also flag PyInstaller binaries by mistake. If you would rather not trust the binary, build it from source.

Option B: build from source

python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python -m plexcurator

To build your own EXE:

pip install pyinstaller
pyinstaller packaging/PlexCurator.spec --distpath dist --workpath build --noconfirm

Configuration

On first launch, open Settings and fill in:

Field Example
Plex URL http://192.168.1.10:32400
Plex token your X-Plex-Token
Library Movies
Tautulli URL http://192.168.1.10:8181
Tautulli API key your key
TMDb API key (optional) your TMDb v3 key
Plex path prefix /movies/
Windows path prefix \\SERVER\Movies\
TV library TV Shows
Plex TV path prefix /tv/
Windows TV path prefix \\SERVER\TV\

Path mapping

Plex reports paths from its own point of view (for example /movies/Film.mkv or /tv/Breaking Bad), but the app deletes over your Windows share (for example \\SERVER\Movies\Film.mkv or \\SERVER\TV\Breaking Bad). The path prefix settings translate between the two: the Plex prefix is stripped and replaced with the Windows prefix, and the rest of the path stays the same. The delete confirmation shows the resolved Windows path, so you can see exactly what will be removed.

Movies and series have their own prefix pair, since Plex usually reports them under different roots. Leave the TV prefixes empty to reuse the movie mapping. If a path can't be resolved, the title is marked as not deletable and left alone.

Settings

The score

The collection score answers a different question than the rating does: how much does this film belong in the library? A well-rated but little-known film (say, a niche cult movie) is not the same as a well-known classic, even when both rate highly. So the score mixes two things.

Quality comes from the TMDb rating (0 to 10), scaled to a 0–100 range. Reach comes from the TMDb vote count on a logarithmic scale, since vote counts span orders of magnitude; this is the stable signal for how many people know a film. A small recency bonus comes from TMDb's popularity value, kept small on purpose so a number that moves day to day doesn't swing a decision that should stay put.

The blend leans on reach: 40% quality, 60% reach, because whether a film is worth keeping depends more on how known it is than on its rating alone. Scores of 66 and up show green (keep), 40 to 65 amber (borderline), and below 40 red (drop).

Series are scored the same way, using TMDb's TV data for the show. TMDb data is cached locally for 30 days, so only the first load makes TMDb requests. Without a TMDb key the score column stays blank and the rest of the app works as usual.

FAQ

Does it delete files immediately? Yes. There is no trash or recycle step, by design. Before anything is removed you get a two-step confirmation showing the count, total size and the real file paths.

What exactly gets deleted? For a movie, the single .mkv file (the app assumes a flat folder of .mkv files). For a series, the entire show folder with every season and episode inside — a series goes as a whole or not at all. The folder deletion is guarded: the target must sit inside your configured TV folder and can never be that folder root itself, so a misconfigured prefix can't wipe the whole library.

Do I need Plex write access? No. The app only reads from Plex, Tautulli and TMDb, and writes to the file system. Plex notices the removed files on its next scan.

A movie has no score, or no path. No TMDb match means a blank score. If the prefix mapping doesn't match a file's path, that movie is left alone and can't be deleted.

Can I try the UI without a server? Yes. Run it with --demo (or set PLEXCURATOR_DEMO=1) to load fake sample data. That is how the screenshots here were made.

Contributing

Issues and pull requests are welcome. To set up for development:

pip install -e ".[dev]"   # ruff + pytest
ruff check src tests
pytest -q

The core logic (path mapping, scoring, config, models, filtering) has unit tests. Network and GUI code is checked by hand.

About

I built PlexCurator to solve my own "what do I actually keep?" problem. It was developed with the help of AI tools.

License

MIT © 2026 Tim Semcken

About

Windows desktop app for cleaning up a Plex movie library: a sortable table with a collection score to help decide what to keep and what to delete.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages