DoesTheDogWatchPlex
Content warnings from DoesTheDogDie.com in your Plex library
Install / Use
/learn @justkorix/DoesTheDogWatchPlexREADME
DoesTheDogWatchPlex
Add content warnings from DoesTheDogDie.com to your Plex movie summaries — so anyone browsing your library can see trigger warnings without leaving the Plex interface.
Rebuilt from valknight/DoesTheDogWatchPlex (2018) for modern Plex and the current DTDD API.
What It Does
For each movie in your Plex library, the script:
- Matches it to DoesTheDogDie.com (by IMDB ID first, then title/year)
- Fetches community-voted content warnings (animal death, sexual assault, etc.)
- Appends a formatted warning block to the movie's summary in Plex
The result looks like this in Plex:
Original movie summary here...
———— Content Warnings (via DoesTheDogDie.com) ————
⚠️ a dog dies · an animal is sad · someone is buried alive
✅ no cats die · nobody is stalked
Warnings are filtered by vote count and confidence ratio, so you only see things the community is reasonably sure about.
Setup
Docker (recommended)
git clone https://github.com/justkorix/DoesTheDogWatchPlex.git
cd DoesTheDogWatchPlex
Edit docker-compose.yml with your Plex URL, token, and DTDD API key, then:
# Preview first
docker compose run --rm doesthedogwatchplex --dry-run
# Run once
docker compose run --rm doesthedogwatchplex
# Run as a background service (re-scans every 24h by default)
docker compose up -d
Or run directly with docker run:
docker run --rm \
-e PLEX_URL=http://YOUR_PLEX_IP:32400 \
-e PLEX_TOKEN=your-plex-token \
-e DTDD_API_KEY=your-dtdd-api-key \
-v dtdd-cache:/app/.cache \
ghcr.io/justkorix/doesthedogwatchplex --dry-run
Set SCHEDULE=86400 to re-scan every 24 hours, or omit it to run once and exit.
Manual (no Docker)
Prerequisites: Python 3.7+, a Plex server, a DoesTheDogDie.com account.
# Clone or copy the files to your server
cd ~/DoesTheDogWatchPlex
# Create a virtual environment (no sudo needed)
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Configure
cp config.py.example config.py
# Edit config.py with your Plex URL, token, and DTDD API key
Getting Your Credentials
Plex Token: Open Plex in a browser, play any media, and inspect network requests for the X-Plex-Token parameter. Or see Plex's guide.
DTDD API Key: Create an account at doesthedogdie.com, then visit your profile page to find your API key.
Usage
# Activate venv first
source venv/bin/activate
# Preview what would change (safe, doesn't modify Plex)
python plex_warnings.py --dry-run
# Run it for real
python plex_warnings.py
# Process a single movie
python plex_warnings.py --movie "Midsommar"
# Remove all content warnings from your library
python plex_warnings.py --clear
# Clear the local API cache (forces fresh DTDD lookups)
python plex_warnings.py --clear-cache
# List all available topic names for filtering
python plex_warnings.py --list-topics
Running on a Schedule (cron)
To automatically process new additions:
crontab -e
Add a line like this to run nightly at 3am:
0 3 * * * cd ~/DoesTheDogWatchPlex && venv/bin/python plex_warnings.py >> dtdd.log 2>&1
Configuration
All settings are in config.py. Key options:
| Setting | Env Var | Default | Description |
|---|---|---|---|
| PLEX_LIBRARIES | PLEX_LIBRARIES | ["Movies"] | Which libraries to process. None/empty = all movie libraries |
| MIN_YES_VOTES | MIN_YES_VOTES | 5 | Minimum "yes" votes to include a warning |
| MIN_YES_RATIO | MIN_YES_RATIO | 0.7 | Minimum ratio of yes/(yes+no) to flag a warning |
| SHOW_SAFE_TOPICS | SHOW_SAFE_TOPICS | False | Include the ✅ "safe" list (e.g., "no dogs die") |
| INCLUDE_TOPICS | INCLUDE_TOPICS | None | Only show these topics (comma-separated). Overrides EXCLUDE_TOPICS |
| EXCLUDE_TOPICS | EXCLUDE_TOPICS | None | Hide these topics (comma-separated). Ignored if INCLUDE_TOPICS is set |
| LANGUAGE | LANGUAGE | None | Translate warnings to another language (e.g., es, fr, de, pt, ja) |
| API_DELAY | - | 1.0 | Seconds between DTDD API calls |
| CACHE_TTL | - | 604800 | Cache duration in seconds (default: 7 days) |
| DRY_RUN | DRY_RUN | False | Set to True to preview without writing |
| - | SCHEDULE | - | Docker only: seconds between re-runs (e.g., 86400 for daily) |
Topic Filtering
You can control which topics appear in your warnings using INCLUDE_TOPICS and EXCLUDE_TOPICS. Both use the plain English topic names from DoesTheDogDie.com (not numeric IDs). Matching is case-insensitive.
To see every available topic name, run:
python plex_warnings.py --list-topics
This prints all ~200 topics in a copy-paste-ready format. Example output:
Available topics from DoesTheDogDie.com:
- a dog dies
- a cat dies
- an animal is sad
- someone is sexually assaulted
- there are bugs
...
Only show specific topics you care about:
# config.py
INCLUDE_TOPICS = ["a dog dies", "a cat dies", "someone is sexually assaulted"]
# docker-compose.yml
INCLUDE_TOPICS=a dog dies,a cat dies,someone is sexually assaulted
Hide topics you don't want to see:
# config.py
EXCLUDE_TOPICS = ["there is copaganda", "there are shower scenes"]
# docker-compose.yml
EXCLUDE_TOPICS=there is copaganda,there are shower scenes
If both are set, INCLUDE_TOPICS takes priority and EXCLUDE_TOPICS is ignored.
How It Works
- Matching: Tries IMDB ID first (via Plex's GUID metadata), then falls back to title+year search against the DTDD API.
- Caching: API responses are cached locally in
.cache/as JSON files to avoid hammering DTDD on re-runs. - Idempotent: Safe to re-run. Existing warnings are stripped and replaced with fresh data each time.
- Reversible:
--clearremoves all DTDD-added content from summaries, restoring originals.
License
MIT
