Skip to content

fix(player): keep a paused video paused and in place when its player item dies - #551

Merged
Quick104 merged 1 commit into
mainfrom
fix/aether-paused-item-death
Sep 29, 2026
Merged

Quick104 merged 1 commit into
mainfrom
fix/aether-paused-item-death

Conversation

@Quick104

@Quick104 Quick104 commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Problem

On Apple TV, a paused video can start playing by itself, sometimes from the beginning (#549). A diagnostics report from an Apple TV 4K (2nd generation, tvOS 26.6, build 57) logged the full sequence:

  1. The viewer paused a Dolby Vision title at 28:11.
  2. Five minutes later the player item died with -11868.
  3. AetherEngine's recovery reloaded the item and called play().
  4. AVPlayer refused the reloaded item's master.
  5. The media-playlist fallback restarted the title at 0:00, played it, and dropped the subtitle renditions.

The fallback went back to 0:00 because it reused the session's first start position, not the position the recovery had reloaded at.

Solution

This PR moves the AetherEngine pin from a02975ed to b1e4879e. The new revision includes:

The pin changes in project.yml, Package.resolved, THIRD_PARTY_NOTICES.md and the bundled README.txt. The engine's own dependencies (FFmpegBuild, SiloObjectAudio) did not change.

#549 was closed when AetherEngine#10 merged. This PR ships that fix and the rest of it in the app.

Validation

  • SiloTV (tvOS Simulator), Silo (iOS Simulator) and SiloMac (macOS) build against b1e4879e with CODE_SIGNING_ALLOWED=NO. This is a compile-only check.
  • On macOS, swift test passes on the engine for both PRs, locally and in the engine's CI. New tests cover:
    • The fallback position after a recovery swap.
    • The fallback's resume rule: a Play from the engine or AVKit, a pause before the refusal, and a command after it.
    • The item-death pause decision.
  • Not verified on an Apple TV. The failure needs a TV that refuses the HDR master after the screensaver, and I could not reproduce that on demand. After this ships, check a TestFlight build on an Apple TV with an HDR or Dolby Vision title:
    1. Pause the title.
    2. Let the screensaver run for a few minutes.
    3. Come back and confirm the title is still paused at the same position.
    4. Press Play and confirm it resumes from there.

Validation tasks: none. No passed v1.0 case covers pausing playback.

Risks and follow-ups

AI disclosure: written with Claude Opus 5.5 (claude-opus-5-5) in Claude Code (T3 Code). The Codex, Kody and CodeRabbit review bots reviewed the engine PRs. No other AI tooling was used.

🤖 Generated with Claude Code

…item dies

Moves the AetherEngine pin to b1e4879e, which includes
Silo-Server/AetherEngine#10 (the item-death reload keeps a viewer's pause) and
Silo-Server/AetherEngine#11 (the media fallback returns to the recovery
position and plays only for a viewer who was playing).

Refs #549

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@kody-ai

kody-ai Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Code Review Completed! 🔥

The code review was successfully completed based on your current configurations.

Kody Guide: Usage and Configuration
Interacting with Kody
  • Request a Review: Ask Kody to review your PR manually by adding a comment with the `@kody start-review` command at the root of your PR.

  • Provide Feedback: Help Kody learn and improve by reacting to its comments with a 👍 for helpful suggestions or a 👎 if improvements are needed.

Providing Context (Files & MCPs)

Add these hints in your PR description (or a comment) to unlock deeper checks:

  • Ticket / Acceptance Criteria: `Refs: ABC-123` (Linear/Jira/Asana/ClickUp/Trello) or a direct ticket link.
  • Bugfix Validation: a Sentry/Datadog/Bugsnag event link (or paste the stack trace/error message).
  • Endpoint Risk: mention the route (e.g., `POST /api/payments`) or controller/action name.
  • Attach a repo file as context: use an explicit marker like `@file:docs/guide.mdx#L10-L50` (replace with your real path).
  • API Contract Docs: include `@file:openapi.yaml` or `@file:swagger.json` when changing routes/schemas.
  • Definition of Done / Standards: include `@file:DOD.md` or `@file:CONTRIBUTING.md` if your repo has them.
  • Design System Source of Truth: include `@file:ui/index.ts` (replace with your DS entrypoint path).
  • Feature Flags: include the flag key/name and `@file:flags.ts` / `@file:config.json` (and optionally the PostHog flag name).
  • Edge/CDN Rules: link the Cloudflare rule/zone or describe the intended redirect/header behavior.
  • Attach an MCP tool output: use `@mcp<provider|tool>` (replace with an installed MCP provider + tool, e.g., `@mcp<sentry|events.search>`).
Current Kody Configuration
Review Options

The following review options are enabled or disabled:

Options Enabled
Bug ✅
Performance ✅
Security ✅
Business Logic ❌

Access your configuration settings here.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-29T14:56:16.772869Z fbf57a6 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 64ad2cd7-ce50-44df-9fed-8b9df5788639

📥 Commits

Reviewing files that changed from the base of the PR and between 4e7ed67 and fbf57a6.

⛔ Files ignored due to path filters (1)
  • iosApp/Silo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved is excluded by !**/Package.resolved
📒 Files selected for processing (3)
  • THIRD_PARTY_NOTICES.md
  • iosApp/Resources/OpenSourceLicenses/README.txt
  • iosApp/project.yml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The AetherEngine package pin and its source acknowledgements now reference revision b1e4879e6a41477ebef3b68e8d9f65239d1ba80b. The listed patches include paused-item recovery.

Changes

AetherEngine revision update

Layer / File(s) Summary
Package revision and acknowledgements
iosApp/project.yml, iosApp/Resources/OpenSourceLicenses/README.txt, THIRD_PARTY_NOTICES.md
The package pin and source links use the updated revision. The patch descriptions now include paused-item recovery.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~4 minutes

Change: Bug fix

Suggested reviewers: zenjabba

Merge Risk: ⚪ Minimal · up to fbf57

The updated engine revision and its acknowledgements are consistent, including the playback-recovery changes. No concrete merge-blocking issue remains; the change is ready for normal checks.

Architecture Summary

Architecture risk: 🔵 Low · up to fbf57

The change affects 2 systems.

Changed systems: iosApp, THIRD_PARTY_NOTICES.md

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — iosApp (service) was modified; 2 changed files map to changed impact.
  • observed — THIRD_PARTY_NOTICES.md (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in THIRD_PARTY_NOTICES.md: The AetherEngine package entry adds playback recovery patches to its description and updates the pinned revision.
  • observed — Modified behavior in THIRD_PARTY_NOTICES.md: The exact-source link now points to revision b1e4879e6a41477ebef3b68e8d9f65239d1ba80b instead of a02975eda62a13c7c24a2f1ac57840a12975c0b.
  • observed — Modified behavior in iosApp/Resources/OpenSourceLicenses/README.txt: The AetherEngine revision and modified-source URL were updated to the new commit; the patch list now also includes paused-item recovery. The license and other listed patches remain unchanged.
  • observed — Modified behavior in iosApp/project.yml: The AetherEngine package revision is updated from a02975eda62a13c7c24a2f1ac57840a12975c0b5 to b1e4879e6a41477ebef3b68e8d9f65239d1ba80b.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary playback fix: preserving a paused video's paused state and position after player-item failure.
Description check ✅ Passed The description is directly related to the changeset. It explains the playback issue, the AetherEngine pin update, the upstream fixes, affected files, validation, risks, and follow-up testing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Quick104
Quick104 merged commit bb4f4a5 into main Sep 29, 2026
5 checks passed
@Quick104
Quick104 deleted the fix/aether-paused-item-death branch September 29, 2026 15:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant