subredit: epgo
A robust, secure, and multi-arch Docker image for EpGo, a command-line tool for downloading television listings from Schedules Direct.
This image is built from source, ensuring compatibility with any Docker host architecture. It includes an intelligent entrypoint script to handle initial configuration and can be run either on a cron schedule or as a one-time task.
epgo on a cron schedule or as a single, one-off task.app user.config.yaml on the first run.overrides.txt file.This image is controlled via environment variables in your docker-compose.yaml.
mkdir epgo-stack
cd epgo-stack
docker-compose.yaml:services:
epgo:
image: nillivanilli0815/epgo:latest
container_name: epgo
environment:
- TZ=Europe/Berlin
- PUID=1000
- PGID=1000
# --- CHOOSE ONE EXECUTION MODE ---
- CRON_SCHEDULE=0 2 * * * # Example: run daily at 02:00
# - RUN_ONCE=true # Or run once and exit
volumes:
- ./epgo_data:/app # persistent config/cache/XML + images
restart: unless-stopped
docker compose up -d
Use the new Preindex SD Posters option (enabled by default) to control when the ProgramID→image index is rebuilt. Leave it on for consistent proxy performance, or disable it to shorten refreshes on very large caches and let the proxy build mappings lazily at runtime.
Set Skip EPG refresh if XMLTV younger than hours in your config to skip refreshing EPG on startup. EPGo checks the XMLTV modification time at startup and skips the download if it’s newer than the threshold you specify.
Keep your artwork fresh without hammering the API. Version 1.3 introduces a configurable cache lifetime via Max Cache Age Days—set it to the number of days you want to retain pinned images before a background refresh, or leave it at 0 to keep cached art indefinitely.
Purge Stale Posters to delete posters that haven’t been requested for twice the configured lifetime (e.g., 14 days when Max Cache Age Days is 7).Tell EPGo exactly which Schedules Direct image ID to use for a show.
overrides.txt file next to your cache/index files (e.g., beside config_cache.json → config_cache.imgindex.json).imageID:"The Simpsons","fsadkjljdföakdfsjkfladjsfdasgkljocjv8a90j9fh23uw7zh798g8asdfu"
"Law & Order: Special Victims Unit","301122dasdsadjlkgkalfdjalsödjksdksjdadsladjaskhsjkfhksdhfk"
Notes
/proxy/sd/{programID} (no image ID), ensuring the override stays in effect without leaking the original ID.YAML additions (v1.3)
Options:
Skip EPG refresh if XMLTV younger than hours: 0 # reuse an existing XMLTV file newer than N hours (0 = always refresh)
Images:
Max Cache Age Days: 0 # 0 disables expiry; otherwise refresh pinned art after N days
Purge Stale Posters: false # if true, remove posters untouched for 2× Max Cache Age Days
What it does
/app/images/, and serves it immediately.YAML additions (v1.2+)
Options:
Images:
Download Images from Schedules Direct: false # set false to allow on-demand fetch, true will download all images on building epg
Image Path: /app/images/ # persistent cache directory
Poster Aspect: 2x3 # 2x3 | 4x3 | 16x9 | all
Proxy Mode: true # enable built-in proxy
Proxy Base URL: # optional; set if clients reach EPGo externally
Quick notes
/app/images/ as a persistent volume.Proxy Base URL to your public base.Download Images from Schedules Direct: false, only previously cached files are served.Under the hood (brief)
Set exactly one of:
Run continuously with cron and execute on a schedule:
CRON_SCHEDULE=0 2 * * *
Container logs receive the task output.
RUN_ONCE=true
Runs a single job and exits.
Tip: with
RUN_ONCE, preferrestart: "no"to avoid restart loops.
Run the wizard in a temporary container:
docker compose run --rm epgo epgo -configure /app/config.yaml
The entrypoint ensures /app is owned by the unprivileged app user; host-side you may see numeric UID/GID ownership—that’s expected.
Sample reflecting Poster Aspect, TMDb changes, and v1.2+ cache/proxy options (including v1.3 cache expiry).
Account:
Username: YOUR_USERNAME
Password: YOUR_PASSWORD
Files:
Cache: config_cache.json
XMLTV: config.xml
The MovieDB cache file: imdb_image_cache.json
Server:
Enable: true # enable the built-in HTTP server
Address: 0.0.0.0
Port: "8765"
Options:
Live and New icons: false
Schedule Days: 1
Skip EPG refresh if XMLTV younger than hours: 0 # reuse an existing XMLTV file newer than N hours (0 = always refresh)
Subtitle into Description: false
Insert credits tag into XML file: false
Images:
Download Images from Schedules Direct: false # set false to allow on-demand fetch, true will download all images on building EPG (legacy)
Image Path: /app/images/
Preindex SD Posters: true # disable to build the ProgramID→image index lazily at runtime
Poster Aspect: 2x3
Proxy Mode: true # set false when using "Download Images from Schedules Direct: true"
Proxy Base URL: "" # e.g., https://epgo.example.com if accessed externally
Max Cache Age Days: 0 # refresh artwork after N days (0 = disabled)
Purge Stale Posters: false # remove posters untouched for 2× Max Cache Age Days
The MovieDB:
Enable: false # set true to enable TMDB-fallback on missing SD posters
Api Key: "" # the longer key from your TMDB-api page
Rating:
Insert rating tag into XML file: false
Maximum rating entries. 0 for all entries: 1
Preferred countries. ISO 3166-1 alpha-3 country code. Leave empty for all systems:
- USA
- COL
Use country code as rating system: false
Show download errors from Schedules Direct in the log: false
Station:
- Name: MTV
ID: "12345"
Lineup: SAMPLE
TMDb fallback: if enabled and SD has no image, EPGo queries TMDb; poster URLs default to w500 for sharper results.
Create or edit config:
epgo -configure MY_CONFIG_FILE.yaml
Generate XMLTV:
epgo -config MY_CONFIG_FILE.yaml
Help:
epgo -h
/app/images/ is persisted.go mod tidy
go build epgo
See releases.
epgo -h
-config string Get data from Schedules Direct with configuration file. [filename.yaml]
-configure string Create or modify the configuration file. [filename.yaml]
-version Show version
-h Show help
epgo -configure MY_CONFIG_FILE.yaml
Configuration file from version 1.0.6 or earlier is not compatible.
This sample reflects the new Poster Aspect option and TMDb changes.
Account:
Username: YOUR_USERNAME
Password: YOUR_PASSWORD
Files:
Cache: config_cache.json
XMLTV: config.xml
The MovieDB cache file: imdb_image_cache.json
Server:
Enable: false
Address: localhost
Port: "80"
Options:
Live and New icons: false
Schedule Days: 1
Skip EPG refresh if XMLTV younger than hours: 0 # reuse an existing XMLTV file newer than N hours (0 = always refresh)
Subtitle into Description: false
Insert credits tag into XML file: false
Images:
Download Images from Schedules Direct: false
Image Path: ""
Preindex SD Posters: true # disable to build the ProgramID→image index lazily at runtime
Poster Aspect: 2x3 # ← new (2x3 | 4x3 | 16x9 | all)
The MovieDB:
Enable: false
Api Key: ""
Rating:
Insert rating tag into XML file: false
Maximum rating entries. 0 for all entries: 1
Preferred countries. ISO 3166-1 alpha-3 country code. Leave empty for all systems:
- USA
- COL
Use country code as rating system: false
Show download errors from Schedules Direct in the log: false
Station:
- Name: MTV
ID: "12345"
Lineup: SAMPLE
Cache: /app/file.json
XMLTV: /app/xml
Enable: false
Address: localhost
Port: "80"
Set Skip EPG refresh if XMLTV younger than hours to a value greater than zero to short-circuit the Schedules Direct download when a locally cached XMLTV file is still fresh. On each run, EPGo checks the modification time of Files.XMLTV and skips the refresh if the file is newer than the threshold you set. Leave it at 0 to always fetch new guide data.
When enabled, the subtitle is prepended to the description for clients that ignore <sub-title>.
Images:
Download Images from Schedules Direct: false
Image Path: ""
Poster Aspect: 2x3
Download Images from Schedules Direct:
true → images are downloaded and served locally from the built-in server.false → XMLTV references SD/TMDb URLs directly.Image Path: local folder to store downloaded images (defaults to images/ if empty).
Poster Aspect (new): choose which Schedules Direct aspect to prefer:
2x3 (portrait), 4x3, 16x9, or all (no filtering).Images:
The MovieDB:
Enable: false
Api Key: ""
w500 (about 500×750) for sharper results.
No config change needed. (If you upgraded from a very old cache that stored full TMDb URLs, you may delete The MovieDB cache file once; current versions store poster paths and generate w500 at read time.)(unchanged; left as in the original README)
epgo -config MY_CONFIG_FILE.yaml
The configuration file must exist.
If you want me to add a short “Upgrade notes” section (e.g., “v1.0: Poster Aspect support; TMDb posters now w500”), I can append that too.
Content type
Image
Digest
sha256:f3a5ef1f6…
Size
8.7 MB
Last updated
5 months ago
docker pull nillivanilli0815/epgo