Build deterministic, path-first ErsatzTV channels without fighting fragile manual playlist edits.
clickOR separates channel programming into two safe phases:
solve: turn channel intent (JSON) into a concrete looping lineup (YAML)apply: update ErsatzTV sqlite state deterministically from that lineup
The result is repeatable channel operations, safer dry-runs, and easier iteration on programming ideas.
- Deterministic: same config + seed means predictable outputs
- Operationally safe:
solvenever touches the DB - Debuggable:
applycan emit SQL before execution - Path-first: media identity is based on concrete library paths
- Long-form content channels (shows, films, music videos)
- Bumper/interstitial-driven channels
- Mixed channels with short-form + long-form blocks
- Flat playlists where very short clips can optionally auto-loop
- Flat playlists where looped short clips collapse duplicate guide rows
cd /path/to/clickor
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e .
clickor --helpOptional environment file:
cp .env.example .envTypical flow:
# 1) Export a concrete config from ErsatzTV
clickor export-from-db --spec examples/export-spec-television.json --out /tmp/television.config.json
# 2) Solve config -> lineup YAML
clickor solve --config /tmp/television.config.json --out /tmp/television.yaml --seed auto --report /tmp/television.report.json
# 3) Preview apply SQL (dry run)
clickor apply --yaml /tmp/television.yaml --dry-run --output /tmp/television.sql
# 4) Apply to ErsatzTV
clickor apply --yaml /tmp/television.yaml --apply --mode replacedocs/STEP_BY_STEP.mddocs/FLAT_PLAYLIST_RUNBOOK.mddocs/CONFIG.mddocs/EXPORT_FROM_DB.mddocs/PROBING.mddocs/TROUBLESHOOTING.md
clickOR is the product name. clickor is used for the Python package and CLI command.