0d0518d3cbdfea337e6607db77ed49cf45eb1222
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 13s
PR Gates / Docs update reminder (pull_request) Successful in 18s
PR Gates / decisions lifecycle (pull_request) Successful in 29s
Review verdict / Set review-verdict status (pull_request_target) Successful in 14s
PR Gates / Script tests (pytest) (pull_request) Successful in 1m59s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 9m23s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 6m37s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Skipped
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 6m20s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 10s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 7s
review-verdict/h10 Review-verdict: MERGEABLE @ 0d0518d (base: main)
PR #768's own run answered the question the identity line was added to answer: Marker identity: job=test run=1916 attempt=1 (from the runner) Marker identity: job=migrations run=1916 attempt=1 (from the runner) Both required jobs, on the build lane, printed to stdout where capture is not in question. So the variable IS exported here, the warn-and-default compromise has served its purpose, and all three identity components now REFUSE rather than falling back to a name other runs share. The residual that compromise left — a rerun inheriting attempt 1's markers — no longer exists. Recording HOW this was settled, because the first two attempts were worthless and the next reader will be tempted by both. Grepping a job log for the variable NAME proves nothing: logs do not dump the environment. Inferring it from the ABSENCE of the script's "not set" warning proves nothing either — that warning goes to stderr, and whether step stderr reaches a job log here was itself never established (the control offered for it turned out to be an ::error:: this script writes to STDOUT). Only making the script report its own resolved identity on stdout, and then reading it, settled anything. The docs said "not established either way", which this run falsifies — so the prose had to change regardless; promoting was the same edit surface. The identity line is kept, now as standing evidence rather than an open question, and is still asserted so it cannot rot into a line nobody can trust. Decisions-Edit: yes Refs: #756
fix(754,757): declare graphicsElementIds + padToNearestMinute, and pin every MCP tool to its OpenAPI contract (#760)
fix(754,757): declare graphicsElementIds + padToNearestMinute, and pin every MCP tool to its OpenAPI contract (#760)
ErsatzTV
ErsatzTV lets you transform your media library into a personalized, live TV experience - complete with EPG, channel scheduling, and seamless streaming to all your devices. Rediscover your content, your way.
How It Works
- Install ErsatzTV: Download and set up the server on your system.
- Add Your Media: Connect your media libraries and collections.
- Create Channels: Design and schedule your own live channels.
- Stream Anywhere: Watch on any device with IPTV and EPG support.
Key Features
- Custom channels: Create and schedule your own live TV channels.
- IPTV & EPG: Stream with IPTV and Electronic Program Guide support.
- Hardware Transcoding: High-performance streaming with hardware acceleration (NVENC, QSV, VAAPI, AMF, VideoToolbox)
- Media Server Integration: Connect Plex, Jellyfin, Emby and more.
- Music & Subtitles: Mix music videos and enjoy subtitle support.
- Open Source: Free, open, and community-driven project.
Documentation
Documentation is available at ersatztv.org.
License
This project is inspired by pseudotv-plex and the dizquetv fork and is released under the zlib license.
