Commit Graph

939 Commits

Author SHA1 Message Date
Timo bc5d1a0ea6 fix(sync): harden terminal state races 2026-09-01 03:34:01 +02:00
Timo 77e7d0c103 fix(sync): make episode transitions relay-authoritative 2026-09-01 03:21:02 +02:00
Timo 0dd6f5bba5 fix(extension): clear stale target after room exit 2026-08-31 23:43:41 +02:00
KoalaDev 1bd9da6bc5 fix(i18n): correct Romance locale translations 2026-08-30 01:06:28 +02:00
KoalaDev 05cfa5efb1 Merge pull request #41 from Kaia-Alenia/refactor/improve-locales-es-it-pt
refactor(locales): refine translations for Spanish, Italian, and Portuguese
2026-08-30 01:00:26 +02:00
KoalaDev 2ab3cbf170 fix(extension): harden Netflix page API sync 2026-08-30 00:50:35 +02:00
KoalaDev 8e4f64566b Merge pull request #35 from Shik3i/feat/canonical-media-state-v1
feat(sync): add canonical media state and resilient offline recovery
2026-08-30 00:02:42 +02:00
Timo 6a748fb3f5 fix(sync): harden async session and lobby races 2026-08-27 01:03:55 +02:00
Timo f615e4d236 fix(release): close remaining PR review gaps 2026-08-27 00:24:03 +02:00
Timo 59788e0749 fix(sync): let newer commands own recovery state 2026-08-27 00:10:33 +02:00
Timo 981776d374 fix(sync): close episode lobby without ready race 2026-08-26 23:56:48 +02:00
Kaia-Alenia 6ba1a98de1 add: translate locales Es,It,Pt and Pt-BR 2026-08-26 13:28:01 -06:00
Timo e5110504c1 fix(sync): cancel superseded canonical apply 2026-08-26 00:41:54 +02:00
Timo 5854c106b8 test(e2e): close fixture server reliably 2026-08-26 00:08:00 +02:00
Timo 76a123fac9 test(sync): isolate relay recovery setup 2026-08-25 23:39:31 +02:00
Timo ea39c7c384 Merge remote-tracking branch 'origin/main' into feat/canonical-media-state-v1 2026-08-25 22:58:31 +02:00
Timo e736bb9861 fix(ci): limit prepared release permissions 2026-08-25 22:49:31 +02:00
Timo cba2731c75 test(sync): preserve canonical race coverage 2026-08-25 22:30:52 +02:00
Timo 0d23859a9f fix(sync): close canonical recovery merge blockers 2026-08-25 22:24:37 +02:00
Timo 213a639314 test(sync): allow repeated relay e2e startup 2026-08-25 21:43:12 +02:00
Timo 8572d3694e test(sync): fix canonical recovery harness 2026-08-25 21:34:56 +02:00
Timo e9ec19b641 test(sync): account for playing snapshot projection 2026-08-25 21:23:54 +02:00
Timo def5e1a380 fix(sync): harden canonical recovery 2026-08-25 21:21:18 +02:00
Timo a65fe2f576 merge main and harden canonical media recovery 2026-08-25 16:58:15 +02:00
KoalaDev 5fffeadded fix: restore automatic tag versioning 2026-08-25 14:42:24 +02:00
KoalaDev eb925eca5e fix: keep README release banner current 2026-08-25 14:24:19 +02:00
KoalaDev 6ff49c75cf docs: add v3.1.5 changelog 2026-08-25 14:14:19 +02:00
KoalaDev 82fe929fda fix: canonicalize release image references (#39)
fix: canonicalize release image references
v3.1.5
2026-08-25 03:14:56 +02:00
KoalaDev e88fe40314 fix: canonicalize release image references 2026-08-25 03:01:28 +02:00
KoalaDev 3b3ac723ed fix: enforce CI-parity release gates (#38)
fix: enforce CI-parity release gates
2026-08-25 02:38:00 +02:00
KoalaDev 0f3da9659d fix: verify final gate against remote main 2026-08-25 02:26:13 +02:00
KoalaDev 26c5a1a08f fix: enforce CI-parity release gates 2026-08-25 02:07:10 +02:00
KoalaDev eb60d74579 Merge pull request #37 from Shik3i/codex/test-suite-hardening
Release v3.1.5: harden teardown and popup containment
2026-08-25 01:30:37 +02:00
KoalaDev f84c3677ac test: close release review gaps 2026-08-25 01:26:26 +02:00
KoalaDev e155973630 test: scope autoplay flag to Chromium 2026-08-25 01:19:25 +02:00
KoalaDev 204f1d0a8f fix: harden room teardown and popup containment 2026-08-25 01:10:41 +02:00
KoalaDev 7286a6db3d test: harden release and browser gates 2026-08-21 15:49:51 +02:00
KoalaDev 230e7f5932 test: harden coverage and browser release gates 2026-08-21 14:10:35 +02:00
GitHub Action 368daa6e2e chore(release): update versions to v3.1.4 [skip ci] 2026-08-21 10:33:30 +00:00
KoalaDev 258f66f240 fix(extension): harden player discovery for Crunchyroll v3.1.4 2026-08-21 12:15:44 +02:00
KoalaDev a477356d25 fix(sync): harden media state reconnect races 2026-08-20 22:39:38 +02:00
KoalaDev 90050bd9ec feat(sync): coalesce offline media intent 2026-08-20 20:30:54 +02:00
KoalaDev c064953cca feat(sync): add canonical room media state 2026-08-20 17:27:08 +02:00
GitHub Action 1e41d98c2f chore(release): update versions to v3.1.3 [skip ci] 2026-08-18 19:38:09 +00:00
Timo e8d1c847d8 docs(changelog): update for v3.1.3 release and consolidate changes v3.1.3 2026-08-18 21:37:40 +02:00
KoalaDev 48f8ba98ef Merge pull request #33 from Shik3i/fix/3.1.3-clean
fix(extension): nested cross-origin player targeting without webNavigation and instant mirror switching
2026-08-18 21:27:38 +02:00
Timo df86264a77 fix(extension): instant mirror switching and prevent uncaught timeout errors 2026-08-18 21:27:02 +02:00
Timo 6628eaa72d docs: correct the scoping claim in the frame-targeting handoff
The proposal said a registered content script could be scoped to the selected
tab's origin. It cannot, in two ways that both matter.

matches is evaluated against each frame's own URL, not the tab's, so a pattern
for the top-level site would never reach the embedded player frame — the only
frame the change exists to reach. Covering a player origin that is unknown
before discovery requires <all_urls>.

And registration has no tab scoping at all: with several tabs open on the same
site, every one of them gets the script.

The honest cost is therefore that a passive monitor runs in every frame of every
http/https tab while a target is selected, which is a privacy-posture change for
a project that advertises touching only the chosen tab. Recorded so the decision
is made against the real trade rather than the flattering version.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 20:56:07 +02:00
Timo bf0dfb82c6 fix(extension): report a video the monitor finds when it installs
A monitor took the current DOM as its baseline on install, so a video that was
already present counted as "not a change" and was never announced. The discovery
poll added in the previous commit reinstalled monitors every 2s, which meant a
video appearing between two reinstalls was silently swallowed — the reported
debug log had no [Content] lines at all, which is the signature of exactly this.

Monitors now announce a video that is already there when they install, which
also makes the rebuilt-frame case work by construction rather than by timing.
The reinstall interval is raised to 5s now that each install is informative.

Also adds docs/frame-targeting-handoff.md: why v3.1.2 worked immediately with
webNavigation, why reconstructing that single call from sweeps, a learned
registry, per-frame monitors and a poll keeps producing timing windows, and the
proposed structural replacement (chrome.scripting.registerContentScripts with
allFrames, no new permission) together with the project invariant it conflicts
with — which is the owner's decision, not a code change to make unasked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 20:54:53 +02:00
Timo 226453fd45 fix(extension): release a dead frame election and break the discovery deadlock
Reported as "Receiving end does not exist" with targetReady true and no
activation errors: the election named a frame the player had already torn down.
Three defects were stacked, each hidden by the one in front of it.

The election was never released. getReadyTabVideoState() recovered through the
guarded refresh, which reports "unchanged" when no video is reachable, so the
stale frameId/documentId survived; adoption compounded it by setting hasVideo,
after which the target only moves on a frame change. An unreachable content
script — as opposed to a page that simply has no video yet — now releases the
frame election back to the top frame. The tab selection is never touched.

Switching frames destroyed the top frame's scripts. Promoting the target out of
frame 0 called deactivateTargetTab() on the previous target, which sent
TARGET_DEACTIVATE to frame 0 and tore down its content script and the chat
overlay with it. That is why chat delivery failed after promotion, and why
releasing the election pointed at an empty frame. An in-tab frame switch now
leaves the top frame alone.

Discovery could deadlock. Monitors announce new players, but a rebuilt frame is
a new document with no monitor, so the video created in it was never reported —
and nothing then triggered the upkeep that would have installed one. Monitors
are reinstalled on every lifecycle notification with a trailing-edge debounce,
and a bounded discovery poll breaks the cycle when no notification arrives at
all: 2s, capped, only while a tab is selected with no video found, stopping the
moment one is.

The new browser test adopts a nested player, destroys its document the way the
real player does, and asserts both the release and that the rebuilt player is
picked up again without touching the popup. It was flaky until the deadlock was
closed, and now passes repeatedly at a stable 8.3s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 20:43:58 +02:00