diff --git a/android/app/src/test/java/tv/orbit/classic/BeerusPremiereReplayTest.kt b/android/app/src/test/java/tv/orbit/classic/BeerusPremiereReplayTest.kt index 4ae7074..e4dcc0e 100644 --- a/android/app/src/test/java/tv/orbit/classic/BeerusPremiereReplayTest.kt +++ b/android/app/src/test/java/tv/orbit/classic/BeerusPremiereReplayTest.kt @@ -9,8 +9,9 @@ import java.io.File /** * Stage D1's check: Vortex as built, with the Afterburn premiere of Dragon Ball Super: Beerus, from copies of the box's files. - * Beerus's four episodes, as the box's inspection read them (Emby 8016753, 23 minutes each; their exact seconds aren't in that - * read, so each is taken as 23:40), join Vortex's pool from the first top-up, as the release's first pool read would add them. + * Beerus's four episodes come from Vortex's pool when the box has read them (0.99.17 onwards). Before that they're taken + * from the box's inspection (Emby 8016753, 23 minutes each, taken as 23:40), joining from the first top-up as the release's + * first pool read would add them. * Four weeks of top-ups every six hours with Beerus and without it, avoiding every other channel's committed programmes. * Run by hand: * ORBIT_REPLAY_DIR= ./gradlew :app:testDebugUnitTest --tests '*BeerusPremiereReplayTest*' @@ -70,11 +71,13 @@ class BeerusPremiereReplayTest { @Test fun premiere() { assumeTrue(dir != null && File(dir, "schedule-601.json").exists()) val vortex = SmartChannels.first { it.number == VORTEX_NUMBER } - val committed = plan(File(dir, "schedule-601.json")); val series = withoutWithdrawn(pool(File(dir, "episodes-601.json")), vortex.withdrawn) + val committed = plan(File(dir, "schedule-601.json")); val read = withoutWithdrawn(pool(File(dir, "episodes-601.json")), vortex.withdrawn) + // Once the box has read Beerus into Vortex's pool, its own copy and runtimes are used; before that, the inspected episodes. + val series = read.filter { it.id != "8016753" } fun at(date: String, h: Int, m: Int = 0) = java.time.LocalDate.parse(date).atTime(h, m).atZone(zone).toInstant().toEpochMilli() fun t(ms: Long) = java.time.Instant.ofEpochMilli(ms).atZone(zone).toLocalDateTime().withNano(0) val minute = 60_000L - val beerus = PoolSeries("8016753", BEERUS, listOf("8016755", "8055410", "8062564", "8070600").mapIndexed { i, id -> + val beerus = read.firstOrNull { it.id == "8016753" } ?: PoolSeries("8016753", BEERUS, listOf("8016755", "8055410", "8062564", "8070600").mapIndexed { i, id -> PoolEpisode(id, "mediasource_$id", EpisodeMark(1, i + 1), "Episode ${i + 1}", 23 * minute + 40_000L) }) val others = clashesWith(SmartChannels.filter { it.number != VORTEX_NUMBER && File(dir, "schedule-${it.number}.json").exists() }.map { plan(File(dir, "schedule-${it.number}.json")) }) val (without, _) = replay(committed, series, vortex, others) diff --git a/docs/VERIFICATION-0.99.17.md b/docs/VERIFICATION-0.99.17.md index 663f08e..f4cf499 100644 --- a/docs/VERIFICATION-0.99.17.md +++ b/docs/VERIFICATION-0.99.17.md @@ -75,3 +75,47 @@ Paul approved building and verifying this on 4 November 2026 at 15:28. Installin ## Rollback Install 0.99.16. Bookings made by 0.99.17 stay as booked, because the never-rewrite rule applies, and their premiere key is ignored by older readers. Beerus would stay booked on those nights, without the key. + +## Installation record (4 November 2026, 16:11 GMT) + +Paul approved this at 16:10 ("install right away"). Orbit was on screen from the earlier playback test. + +- **Snapshot and rollback:** + - All 191 schedule-folder files and the settings file were copied off the box, to install-0.99.17-20261104-161040. + - A rollback copy is on the box in `no_backup/schedule-rollback-0.99.16`. + - The 0.99.16 APK is in outputs/revision-0.99.16. + - The cutover snapshots and every earlier install snapshot are kept. +- **Install:** the APK's SHA-256 was checked. The box reports versionCode 147, 0.99.17-beerus-premiere. +- **Vortex pool refresh:** Vortex's changed list made it read its pool again at the first top-up (167 requests, 157 s). + - Shows went from 117 to 118, and episodes from 7,003 to 7,007. + - The pool file holds **Dragon Ball Super: Beerus from Emby 8016753 only**, with episodes 1 to 4 in order. Each passed the box's playability check and runs 23.3 minutes. + - **Copy 8055740 isn't read:** no two-copy line was logged for Beerus. +- **Committed bookings:** all 31 plans compared. + - Nothing was added, and every plan cursor is identical. Every remaining entry and presentation key is identical, and the only drops are the daily trim. + - 12 aired places moved, each to the latest programme of its show already started. + - Besides the plans and progress files, only Vortex's pool file and its backup changed. +- **Top-ups:** all 30 channels topped up with `added=0` and `clashes=0`, with no player, decoder or crash errors. +- **Subtitles:** the playback test on Beerus episode 1 again chose English automatically (30 subtitle updates, 0 errors), with the setting off. The settings file is byte-identical. +- **Replay on the installed box's files** (docs/replays/beerus-premiere-replay-0.99.17-installed.txt), using the pool as the box read it: + +| | Result | +|---|---| +| Committed plan | kept exactly | +| Premiere eligibility | booked at the top-up of Sunday 15 November about 15:50, when the plan ends 21 November 10:01, so the slots are uncommitted | +| 21 November | 20:27 Dead Zone (whole), 21:08:34 episode 1, 21:31:52 episode 2, key `vortex.afterburn.premiere` | +| 28 November | 20:00 The World's Strongest (whole), 21:00:18 episode 3, 21:23:36 episode 4 | +| 5 December | no Beerus, no repeat | +| Gaps, clashes | 0, 0 | +| Save and reload | identical | + +- **Other channels:** the four-week replay on the same files is identical to 0.99.16 on all 29 other channels. Vortex's committed fingerprint is identical, and only its four-week fingerprint differs, from the premiere (docs/replays/replay-fingerprints-0.99.17-installed.txt). + +## On-air verification (pending) + +- **When the bookings appear** (about 15 November, at the top-up that brings 21 November into the seven-day horizon): + - check Vortex's plan for Beerus 8016755 and 8055410 from about 21:00 on 21 November; + - check the key `vortex.afterburn.premiere` and the "premiere: first airing on Orbit" reasons; + - check that the film before them is whole. + + Nothing is promoted as confirmed before then. +- **On the night:** picture, sound, subtitles and the standard Vortex ident. diff --git a/docs/replays/beerus-premiere-replay-0.99.17-installed.txt b/docs/replays/beerus-premiere-replay-0.99.17-installed.txt new file mode 100644 index 0000000..accf9e6 --- /dev/null +++ b/docs/replays/beerus-premiere-replay-0.99.17-installed.txt @@ -0,0 +1,45 @@ +Stage D1 replay: Vortex as built, from the box's files (committed 2026-11-03T15:50:19 to 2026-11-11T13:22:31), four weeks of top-ups every six hours, avoiding other channels' committed programmes. +with and without Beerus, identical until 2026-11-21T19:57:30 +premiere episode booked for 2026-11-21T21:08:34 at the top-up of 2026-11-15T15:50:19; the plan then ended 2026-11-21T10:01:54, so the slot was uncommitted: true +premiere episode booked for 2026-11-21T21:31:52 at the top-up of 2026-11-15T15:50:19; the plan then ended 2026-11-21T10:01:54, so the slot was uncommitted: true +premiere episode booked for 2026-11-28T21:00:18 at the top-up of 2026-11-21T21:50:19; the plan then ended 2026-11-27T16:02:12, so the slot was uncommitted: true +premiere episode booked for 2026-11-28T21:23:36 at the top-up of 2026-11-21T21:50:19; the plan then ended 2026-11-27T16:02:12, so the slot was uncommitted: true +Dragon Ball Super (2015) Beerus saga (season 1, 14 episodes): last episode S1E14 at 2026-11-20T02:12:42; first after it S2E1 at 2026-11-22T00:27:51; committed plan holds up to EpisodeMark(season=1, episode=6) +== Saturday 2026-11-14, 19:00 to 23:00 + 19:05:49-19:30:06 Mobile Suit Zeta Gundam [-] block night + 19:30:06-19:54 Mobile Suit Gundam SEED [-] block night + 19:54-20:18:27 Nobunaga the Fool [-] block night + 20:18:27-21:10:15 Dragon Ball Z: Wrath of the Dragon [vortex.movie] event movie + 21:10:15-21:51:29 Dragon Ball Z: Dead Zone [vortex.movie] event movie + 21:51:29-22:43:30 Dragon Ball Z: Lord Slug [vortex.movie] event movie + 22:43:30-23:05:47 ThunderCats [-] block toonami +== Saturday 2026-11-21, 19:00 to 23:00 + 19:09:15-19:33:23 Dragon Ball GT [-] block night + 19:33:23-19:57:30 Sailor Moon [-] block night + 19:57:30-20:27:21 Tenchi Muyo! Ryo-Ohki [-] block night + 20:27:21-21:08:34 Dragon Ball Z: Dead Zone [vortex.movie] event 20-21 + 21:08:34-21:31:52 Dragon Ball Super: Beerus episode 1 [vortex.afterburn.premiere] event 21-22; first airing on Orbit + 21:31:52-21:55:10 Dragon Ball Super: Beerus episode 2 [vortex.afterburn.premiere] event 21-22; first airing on Orbit + 21:55:10-22:17:17 Yu-Gi-Oh! Duel Monsters [-] block toonami + 22:17:17-22:39:35 ThunderCats [-] block toonami + 22:39:35-23:09:32 Tenchi Muyo! Ryo-Ohki [-] block toonami +== Saturday 2026-11-28, 19:00 to 23:00 + 19:12:22-19:36:34 Dragon Ball [-] block night + 19:36:34-20:00:47 Dragon Ball Z [-] block night + 20:00:47-21:00:18 Dragon Ball Z: The World's Strongest [vortex.movie] event 20-21 + 21:00:18-21:23:36 Dragon Ball Super: Beerus episode 3 [vortex.afterburn.premiere] event 21-22; first airing on Orbit + 21:23:36-21:46:53 Dragon Ball Super: Beerus episode 4 [vortex.afterburn.premiere] event 21-22; first airing on Orbit + 21:46:53-22:11:06 Dragon Ball [-] block toonami + 22:11:06-22:35:18 Dragon Ball Z [-] block toonami + 22:35:18-22:59:27 Dragon Ball GT [-] block toonami + 22:59:27-23:21:42 ThunderCats [-] block toonami +== Saturday 2026-12-05, 19:00 to 23:00 + 19:11:13-19:35:12 Mobile Suit Gundam Wing [-] block night + 19:35:12-19:59:28 My Hero Academia [-] block night + 19:59:28-20:20:52 Yu-Gi-Oh! Duel Monsters [-] block night + 20:20:52-21:11:16 Dragon Ball Z: Bojack Unbound [vortex.movie] event movie + 21:11:16-22:10:48 Dragon Ball Z: The World's Strongest [vortex.movie] event movie + 22:10:48-22:32:12 Yu-Gi-Oh! Duel Monsters [-] block toonami + 22:32:12-22:57:29 The Big O [-] block toonami + 22:57:29-23:23:07 Outlaw Star [-] block toonami +Beerus bookings 4: [E1 2026-11-21T21:08:34, E2 2026-11-21T21:31:52, E3 2026-11-28T21:00:18, E4 2026-11-28T21:23:36]; gaps or overlaps 0; clashes with other channels 0; a save and reload every 18 hours gives the same: true diff --git a/docs/replays/replay-fingerprints-0.99.17-installed.txt b/docs/replays/replay-fingerprints-0.99.17-installed.txt new file mode 100644 index 0000000..873669e --- /dev/null +++ b/docs/replays/replay-fingerprints-0.99.17-installed.txt @@ -0,0 +1,62 @@ +--- 0.99.16 (commit 0d2ea65), box files after the 0.99.17 install (Vortex pool with Beerus) +101 committed=f9a03287d77de1c7 kept=true fourWeeks=6439795399eaa5b6 programmes=2161 +102 committed=9a7f37fa19ff90d1 kept=true fourWeeks=2035a37c1e7d720b programmes=1312 +103 committed=cf104365eacc2205 kept=true fourWeeks=a8d8dafd254273f1 programmes=1809 +104 committed=9ca16bec10a81354 kept=true fourWeeks=48a16c9741454bf0 programmes=1723 +105 committed=94a2c1a343d88915 kept=true fourWeeks=38f0b51d273ec26b programmes=2540 +106 committed=4925d4e0c8380835 kept=true fourWeeks=a780407103052ca9 programmes=1143 +107 committed=a291aa5b6dcb2d51 kept=true fourWeeks=317b39d184075dd4 programmes=1006 +201 committed=8eac36151d3db5c7 kept=true fourWeeks=c1dac10fa4ccc575 programmes=956 +202 committed=d83fecad57ca4c72 kept=true fourWeeks=df5c405ea065836a programmes=1124 +203 committed=e49176fcc4de75cd kept=true fourWeeks=765e2c520af309bc programmes=1130 +204 committed=30802ae42f0b84e6 kept=true fourWeeks=2557236f6e8c3920 programmes=1254 +301 committed=a60230082d64c730 kept=true fourWeeks=e52b5c61079837aa programmes=359 +302 committed=25292ff5bc2e143e kept=true fourWeeks=018d08db70e2de5f programmes=439 +303 committed=a8f13e22455a5da9 kept=true fourWeeks=a4aad9cf93bab051 programmes=416 +304 committed=a935177668a9e2c6 kept=true fourWeeks=44c8d10e2f3f104b programmes=490 +305 committed=4078f134215f37bb kept=true fourWeeks=97e4f77b7fc48b9d programmes=500 +306 committed=efaae3caa156fdbe kept=true fourWeeks=2967c19d6183c578 programmes=489 +307 committed=8adb935ea55ff9a2 kept=true fourWeeks=ff4450b5f41cfd0f programmes=438 +308 committed=107aceee3dc5262a kept=true fourWeeks=7ebe266852de6ff9 programmes=510 +309 committed=85d3ae0fd77478d1 kept=true fourWeeks=89f9801411746431 programmes=494 +401 committed=4f0314b7876321e0 kept=true fourWeeks=58cda58c4e8d9983 programmes=874 +601 committed=3fe28f317fbd918b kept=true fourWeeks=4dea9b94a7422ca1 programmes=2187 +602 committed=8b3a94c47708943f kept=true fourWeeks=8422fc9677bb8ffa programmes=2320 +603 committed=f96f78f248fbf8fe kept=true fourWeeks=0f9df57be0242ec7 programmes=2300 +604 committed=5d4a52d179d1f30a kept=true fourWeeks=c9789aad3a8843e3 programmes=3232 +605 committed=5e645c0f9cf87f6e kept=true fourWeeks=3c105829d206d116 programmes=4479 +611 committed=549e3c1d1a8cf02f kept=true fourWeeks=f719006122c5bf61 programmes=2731 +612 committed=cbf2dd848f845343 kept=true fourWeeks=845ca5b5602ea2a1 programmes=575 +613 committed=e072fd42fa7bec53 kept=true fourWeeks=98e5dea86bb07759 programmes=518 +614 committed=38a6a3b64a4c8f3c kept=true fourWeeks=f68607419ee1ca91 programmes=3822 +--- 0.99.17 +101 committed=f9a03287d77de1c7 kept=true fourWeeks=6439795399eaa5b6 programmes=2161 +102 committed=9a7f37fa19ff90d1 kept=true fourWeeks=2035a37c1e7d720b programmes=1312 +103 committed=cf104365eacc2205 kept=true fourWeeks=a8d8dafd254273f1 programmes=1809 +104 committed=9ca16bec10a81354 kept=true fourWeeks=48a16c9741454bf0 programmes=1723 +105 committed=94a2c1a343d88915 kept=true fourWeeks=38f0b51d273ec26b programmes=2540 +106 committed=4925d4e0c8380835 kept=true fourWeeks=a780407103052ca9 programmes=1143 +107 committed=a291aa5b6dcb2d51 kept=true fourWeeks=317b39d184075dd4 programmes=1006 +201 committed=8eac36151d3db5c7 kept=true fourWeeks=c1dac10fa4ccc575 programmes=956 +202 committed=d83fecad57ca4c72 kept=true fourWeeks=df5c405ea065836a programmes=1124 +203 committed=e49176fcc4de75cd kept=true fourWeeks=765e2c520af309bc programmes=1130 +204 committed=30802ae42f0b84e6 kept=true fourWeeks=2557236f6e8c3920 programmes=1254 +301 committed=a60230082d64c730 kept=true fourWeeks=e52b5c61079837aa programmes=359 +302 committed=25292ff5bc2e143e kept=true fourWeeks=018d08db70e2de5f programmes=439 +303 committed=a8f13e22455a5da9 kept=true fourWeeks=a4aad9cf93bab051 programmes=416 +304 committed=a935177668a9e2c6 kept=true fourWeeks=44c8d10e2f3f104b programmes=490 +305 committed=4078f134215f37bb kept=true fourWeeks=97e4f77b7fc48b9d programmes=500 +306 committed=efaae3caa156fdbe kept=true fourWeeks=2967c19d6183c578 programmes=489 +307 committed=8adb935ea55ff9a2 kept=true fourWeeks=ff4450b5f41cfd0f programmes=438 +308 committed=107aceee3dc5262a kept=true fourWeeks=7ebe266852de6ff9 programmes=510 +309 committed=85d3ae0fd77478d1 kept=true fourWeeks=89f9801411746431 programmes=494 +401 committed=4f0314b7876321e0 kept=true fourWeeks=58cda58c4e8d9983 programmes=874 +601 committed=3fe28f317fbd918b kept=true fourWeeks=666be19c335bc81d programmes=2190 +602 committed=8b3a94c47708943f kept=true fourWeeks=8422fc9677bb8ffa programmes=2320 +603 committed=f96f78f248fbf8fe kept=true fourWeeks=0f9df57be0242ec7 programmes=2300 +604 committed=5d4a52d179d1f30a kept=true fourWeeks=c9789aad3a8843e3 programmes=3232 +605 committed=5e645c0f9cf87f6e kept=true fourWeeks=3c105829d206d116 programmes=4479 +611 committed=549e3c1d1a8cf02f kept=true fourWeeks=f719006122c5bf61 programmes=2731 +612 committed=cbf2dd848f845343 kept=true fourWeeks=845ca5b5602ea2a1 programmes=575 +613 committed=e072fd42fa7bec53 kept=true fourWeeks=98e5dea86bb07759 programmes=518 +614 committed=38a6a3b64a4c8f3c kept=true fourWeeks=f68607419ee1ca91 programmes=3822