eaf91b157b63423b6eea600fffdfc827a21db5eb
posters_scan passed each line to the worker with `xargs -I{}`, which splices
the text straight into the shell command. Any title containing an apostrophe
or a quote became a shell syntax error and that item was dropped — silently,
since the error went to stderr while the audit counted only what came back.
No show title happened to trigger it, so this survived the show-level work.
The first episode-level scan hit it immediately: titles like "That's a shirt?"
and "WAIT A MINUTE, ..." produced `unexpected EOF while looking for matching
quote`, which means that episode run reported nothing trustworthy.
Lines are now passed as a positional argument, so the shell never parses their
content. Regression-tested with titles containing apostrophes, double quotes,
commas, backticks and $(...) — all handled, and the $(...) case confirmed not
to execute.
Also tightens the check itself: a poster is OK only if the response is 200
*and* an image content-type. Plex answers some paths with 200 and an XML body,
which the status-only check counted as a working poster.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
scripts
Operational scripts for my self-hosted environment (odin, an Unraid host running Docker Compose behind Authelia and a Pangolin/Newt tunnel).
Each script collection lives in its own top-level folder and is fully self-contained — its own README, config, and dependencies. Collections never import from each other.
See CLAUDE.md for the environment details and repo conventions, and docs/odin-access.md for how to reach odin and drive its API.
Collections
| Collection | What it does | Runs on |
|---|---|---|
| plex | Health checks and library-artwork repair for the Plex server | this workstation, targeting odin |
Adding a collection
cp -r _template <collection-name>
Fill in its README.md, then add a line to the table above.
Languages
Shell
100%