- TypeScript 89.9%
- Shell 5.2%
- JavaScript 4.1%
- Dockerfile 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| migrations | ||
| src | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .env.local.example | ||
| .gitignore | ||
| architecture.md | ||
| deploy-portainer.sh | ||
| design.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| requirements.md | ||
| stack.yml | ||
| tasks.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
Denver OTA XMLTV Guide
Fastify API that serves a Jellyfin-compatible XMLTV feed for the Denver OTA lineup USA-OTA80022 using EPGShare US_LOCALS1.
Source
Primary source:
- XMLTV:
https://epgshare01.online/epgshare01/epg_ripper_US_LOCALS1.xml.gz - ID list:
https://epgshare01.online/epgshare01/epg_ripper_US_LOCALS1.txt - Denver callsigns:
KUSA,KCNC,KMGH,KDVR,KRMA,KWGN,KTVD,KBDI
Open-EPG is not wired into runtime. Its public files are documented as an emergency manual fallback only because the public guide page advertises 2 days of guide data, daily updates, 20 downloads/day per file, and an unstable migration period.
References:
Local Colima Setup
Install Docker CLI and Compose first if docker version or docker compose version fails.
colima start --cpu 4 --memory 6 --disk 40
docker version
docker compose version
cp .env.local.example .env.local
docker compose --env-file .env.local up --build
If docker compose is not available but standalone Compose is installed, use docker-compose --env-file .env.local up --build.
The API is exposed at http://localhost:3330.
Smoke checks:
curl http://localhost:3330/healthz
curl http://localhost:3330/guide/status
curl http://localhost:3330/channels/denver
curl 'http://localhost:3330/lineups/USA-OTA80022/xmltv?days=4'
Endpoints
GET /healthzGET /metrics.jsonGET /guide/statusGET /channels/denverGET /lineups/USA-OTA80022/channelsGET /lineups/USA-OTA80022/xmltv?days=4POST /refreshGET /ui
Retired source-specific endpoints return 410 Gone, including /xmltv/tvpass, /tvpass/playlist.m3u, /tvpass/playlist.meta, /epgshare/xmltv, and /epgshare/xmltv/match.
USA-OTA800222 is treated as an invalid lineup typo; use USA-OTA80022.
Cache Behavior
The app stores the filtered Denver XMLTV and metadata in cache_items.
- Refreshes are skipped while the cache is younger than
GUIDE_REFRESH_INTERVAL_MINUTES. - Conditional request headers are sent when EPGShare provides
ETagorLast-Modified. - If EPGShare fails and a previous feed exists, the app serves stale XMLTV and marks
/guide/statusas degraded. - Cache is stale when older than
GUIDE_STALE_AFTER_HOURS.
Environment
See .env.local.example for Docker/Colima and .env.example for local process defaults.
Important values:
DEFAULT_LINEUP_ID=USA-OTA80022GUIDE_SOURCE=epgshareGUIDE_TIMEZONE=America/DenverEPGSHARE_ID=US_LOCALS1DENVER_CALLSIGNS=KUSA,KCNC,KMGH,KDVR,KRMA,KWGN,KTVD,KBDIPUBLIC_PORT=3330
Tests
npm run typecheck
npm run test:run