Repository navigation
2.6.2-dev.17 (nightly)
Pre-release
Pre-release
Source: Vateron-Media/XC_VM@007982a
Nightly build from main. Untested — for test servers only.
Changes since 8a3b295d18db
- test: start the divergence test's Redis on a free port and wait for it (e390aac6)
- fix(i18n): say where an account's legacy API key is (a97beeb1)
- docs(cluster): rolling update, guided cutover and placement advice (8e0bc99e)
- feat(cluster): placement advice on the Servers page (dacffeda)
- feat(cluster): guided cutover of a load balancer up to mode 1 (e7d3682e)
- feat(cluster): update the load balancers one at a time (510c342c)
- fix(cluster): ask an unanswering agent once per viewer pass; describe mode 2's wait (e1245b96)
- fix(cluster): refuse a mode 2 viewer whose check the agent did not answer (7ac47580)
- fix(cluster): wait longer for the agent in mode 2 and never fall back to MAIN's store (05f677c0)
- fix(vod): run the release parsers through ProcessRunner (99e30eee)
- docs(operations): document maintenance, metrics, alerts, reminders and off-site backups (8b555391)
- feat(backups): copy backups off-site, seal a recovery bundle and test restores (b194cb03)
- feat(alerts): send alerts and expiry reminders by Telegram, webhook and e-mail (15891955)
- feat(monitoring): add /metrics for Prometheus and /healthz (ca105d2d)
- feat(maintenance): close the client APIs and resellers during maintenance (4f1f71bd)
- feat(audit): record what admins change (a643e33f)
- feat(api): named, scoped API tokens in place of the single key (84f13e40)
- feat(auth): two-factor sign-in for admins and resellers (5a8b4bf8)
- fix(i18n): restore placeholders the translator broke (43c04e05)
- feat(dashboard): warn when a server's clock is off MAIN's (84bee4c2)
- feat(service): wait for NTP's first synchronisation at boot (26a5efd7)
- fix(streaming): read a stream token's times on MAIN's clock (2bafab96)
- chore: ignore Playwright MCP output (6d50ef39)
- fix(ministra): restore the handshake methods the main merge dropped (715d4291)
- fix(status, epg): mark the schema with the release and name XMLTV files by SHA-256 (506a638b)
- test(ci): one suite run per pull request with Redis, make test, a faster LB gate and the player_api contract (10c2e0ff)
- chore(i18n): the new and removed panel strings (ec54536b)
- refactor(reseller): one text per action in the reseller logs and the dashboard (eb64326d)
- refactor(settings): drop the eleven fields nothing reads; new installs keep logs 180 and 365 days (f5a71555)
- feat(dashboard): judge every server, add disk, backup, certificate and cache rows, read the map only when shown (bdb12e22)
- perf(epg): dedupe in one pass and render a source set's XMLTV programmes once; imports fetch icons six at a time (69fba1c0)
- perf(logs): batched retention, log-table indexes, one aggregate per stats window, Stream Rank links the stream (75bcb55c)
- perf(cache): read the episodes once, shard the bouquet map, keep the last good run on a failed one (29ea8e9a)
- perf(playlists): cache a playlist under everything it is built from, for any TTL; order and filter the API lists cheaper (e5d6788b)
- feat(update): report a failed migration, dump MAIN before an update, reverse a rollback only for 2.5.x targets (87ac2d96)
- feat(backups): dump the live database before a restore and leave the restored file alone (311f42e6)
- chore: ignore Playwright MCP output (0df8738c)
- feat(vod): carry an M3U entry's title in VodImportResultEvent (39bbcddd)
- fix(vod): drop provider pipe tags from a release name before matching (167dadd7)
- fix(signals): restart the daemon when a Redis signal read drops (37b0c54d)
- docs: Direct Source is the operator's choice, and a stream form tab escapes what it prints (5ff77795)
- fix(admin): edit_proxy and edit_server edit only their own kind of server (b6c5aa10)
- fix(admin): start every record edit from the row as stored (c004d510)
- fix(cluster): hold a node to the mint proof where MAIN withholds its stream secret (a6687b90)
- feat(cluster): bind a node's connection records to the token MAIN minted (2fc8cdd0)
- feat(admin): keep the fields every admin API edit leaves out (654afd02)
- fix: import UserCredits in the users API, list keep_syslog for nodes and post the players' actions in tests (cc0c2a9a)
- docs: describe the quarantine, the updating hold, the cron limit, POST-only player actions and DECIMAL credits (599a2e76)
- chore(i18n): add the message of the commands a quarantine ends (cfcf4d7d)
- test(streaming): pin the Direct Source redirect every client but the web player keeps (0af90d29)
- fix(logs): store MariaDB's errors, keep the note of a manual block and prune System Logs (6ade2284)
- fix(player): sign out, refresh and reorder bouquets only on POST (421444e0)
- fix(admin): keep a line's state, owner and stored text on an edit, and read is_trial as a switch (98194aa9)
- fix(cron): end a cron:servers or cron:streams run that hangs past ten minutes (309b7413)
- feat(cluster): end a node's granting commands when it is quarantined (dcb67ae2)
- feat(cluster): keep a node that reports updating out of routing for a minute (a762f4a2)
- feat(reseller): store balances and prices as DECIMAL(16,4) (a7efd517)
- docs: describe the decided behaviour and the cluster designs awaiting approval (8132bbbd)
- chore(i18n): add the import switches and reword the username guess limit (69a1ab22)
- test(i18n): give the panel its own strings back after the translator test (92e5c7c2)
- feat(cli): add root:paths, a read-only check of what root runs from the tree (fb55ec88)
- feat(ministra): keep a box's token until get_profile has verified the new one (c51513ab)
- feat(admin): keep fields edit_line leaves out, restore the import switches and rate-limit access codes (27b7d145)
- fix(cron): keep a running cron's lock, drop the MySQL login block and enforce the download limit (84e9db3a)
- feat(database): keep panel account names unique, blank old logged values and print why a step failed (02d6cc9c)
- feat(reseller): charge exact prices, sell by the package switches and hold codes nobody redeemed (198c2627)
- feat(streaming): start streams from their stored values, complete source cookies and give utc links six hours (302240aa)
- feat(player): give the web players a session cookie of their own and play radio through the panel (2a70c882)
- feat(auth): block an address that tries many passwords for one username (10a4707c)
- fix(cron): run the crontab install and the firewall flush with literal commands (abb2432c)
- chore(security): annotate the fixed commands of the crontab and firewall code for Semgrep (cb7c256b)
- refactor(session): check a reseller's enabled status in a statement of its own (3ed03a4f)
- fix(security): mint MAG session tokens from the secure random source and count sign-in terms by SHA-256 (bd0783b3)
- fix(streaming): take a token's connection id only in the form the panel mints (efa75212)
- chore(security): annotate the Semgrep false positives in the catch-up stream scripts (91e3d75a)
- test(modules): keep the JIT out of the module update test's child process (9d58fd6a)
- docs: describe the rules the panel enforces after the fixes (9e73209e)
- chore(i18n): add and translate the messages of the new refusals (820a19da)
- fix(install): verify installer downloads and validate certificate host names (c758b66e)
- fix(modules): skip a module that cannot load and apply its schema steps on every update path (0374b93d)
- fix(core): keep the newest backups, verify what is downloaded and keep values out of the query log (bde28888)
- fix(cron): act on stream lists only when they were read, and flush only the panel's own firewall rules (e0d6f009)
- fix(bouquets): let one writer at a time change a bouquet's lists (94068ada)
- fix(streams): pass stream options to ffmpeg as typed and fill each command in one pass (e66b2bcb)
- fix(admin): ask the right permission on every page, action, table and admin API call (1c54a2b0)
- fix(reseller): make credits atomic and hold resellers to their tree, packages and trials (e551ba21)
- fix(player): keep both web players to the line's own content and escape what they print (99c36026)
- fix(session): start every panel session with the hardened cookie settings (3037539c)
- fix(player): fetch only public addresses and bound the image resizer (2581106f)
- fix(ministra): serve a MAG device only once the portal has verified it (6625ffcf)
- fix(auth): count refused sign-ins on every client entry point (c9f11ec8)
- fix(streaming): check viewer requests, tokens and connection rows at the stream entry points (90855afa)
- fix(cluster): hold the mode 2 rules for flows, credentials and enrolment (50e017c6)
- fix(ministra): send channel and genre fields as strings (27f62c07)
- fix(ministra): restore the player prefix in channel and radio cmd (ce3ad1ff)
- fix(ministra): answer a missing or stale token with "Authorization failed." (4a523927)
- fix(ministra): serve the Stalker API at
/server/load.php directly (b18cf165)