Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 4m4s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 5m5s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 4m36s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 5m46s
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 3m47s
Extend the image smoke test from "serves HTTP" to a real E2E: after HTTP readiness, assert the Jellyfin-facing surfaces on the freshly built image — /iptv/channels.m3u returns 2xx containing #EXTM3U, and /iptv/xmltv.xml returns 2xx containing a <tv root. xmltv.xml needs channels.xml (the scheduler writes it a few seconds after boot), so each endpoint is polled with a deadline; container logs are dumped on failure. Catches routing / base-URL (#1) / migration regressions that leave the app "up" but serving broken playlists/guides. Validated the exact checks against the real :latest image on a fresh container (both 200 with the expected shape) before committing. Refs #16 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>