Skip to content

Cloud Play fixes for fallback regions: full catalog restore + Bloodborne launch (2.11.4) - #49

Merged
forward-technologies merged 11 commits into
release/betafrom
fix/cloud-play-regions
Aug 2, 2026
Merged

Cloud Play fixes for fallback regions: full catalog restore + Bloodborne launch (2.11.4)#49
forward-technologies merged 11 commits into
release/betafrom
fix/cloud-play-regions

Conversation

@forward-technologies

Copy link
Copy Markdown
Collaborator

Integrates and extends @nyakaspeter's #43 (all four fixes preserved — thank you!) on top of release/beta.

What this ships

Verification

Merging deploys BETA (2.11.4). Production promotion follows after the fallback-region retest confirms.

🤖 Generated with Claude Code

nyakaspeter and others added 11 commits July 21, 2026 20:56
Five workflow_dispatch workflows, one per platform, each building that platform
(build-only — no store deploy, no Dropbox, no signing/deploy secrets) and
uploading the result as a workflow artifact. Versions come from CMakeLists.txt
via the extract-version action.

- build-artifact-linux.yml    Pylux-Linux-<ver>.AppImage + Pylux-Linux-<ver>.zip
- build-artifact-android.yml  Pylux-Android-<ver>.apk (debug-signed)
- build-artifact-macos.yml    Pylux-macOS-<ver>.zip (ad-hoc .app, arm64)
- build-artifact-ios.yml      Pylux-iOS-<ver>.ipa (UNSIGNED, sideload only)
- build-artifact-windows.yml  Pylux-Windows-<ver>.exe + Pylux-Windows-<ver>.zip

Reuses the deploy/build workflows' build + toolchain steps; drops the
signing/deploy tails.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	lib/src/cloudsession_kamaji.c
#	test/cloudsession_kamaji.c
The public fallback paginated a single container expecting product rows, but
Sony restructured APOLLOROOT into one level of category containers, so
region-unsupported accounts got an empty PS Now catalog. Walking only the PS3
child (as PR #43 proposed) restores 264-330 classics but misses the ~535-title
PS4 streamable catalog that lives in the genre/alphabetical children.

Walk every child of the regional root once instead, deduped by product id, with
per-container completeness so a failed child still blocks caching a partial
list. Live-verified against an independent walk of both store families:
US 853 titles (537 PS4 + 316 legacy), GB/HU 786 (536 PS4 + 250 legacy),
identical id sets, zero duplicates; native-account fetch is byte-identical
before/after. Adds apollo-fallback-test, a region harness that runs the
anonymous walk as any account country.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
They came along with PR #43's branch but are unrelated to the cloud fixes;
they can land separately if wanted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mpleteness)

Protocol findings:
- Scope the legacy->US/GB Classics remap in km_resolve_store_locale to
  foreign-catalog (fallback-region) sessions. Native accounts resolve every id
  in their server-authoritative store exactly as before this branch — a native
  JP/NL classic must not be re-routed to a GB container that lacks it.
- Revert km_pick_streaming to the strict license_type==4 primary pass. The
  title-matched *GS fallback already catches reservations published with
  license_type=0 (Bloodborne EU); accepting untitled *GS rows in the primary
  pass risked acquiring a bundle sibling's sku.
- Foreign-catalog safety nets so no region can regress below the old behavior:
  0.5d retries the modern-title resolve once via the US/GB store when the
  account store 404s, and a failed /bin/zsh acquire falls through to Gaikai
  validation instead of surfacing a possibly-wrong PS+ error.
- km_is_legacy_classic_id now examines only the title-id segment between the
  first '-' and '_' (structural, per the data-handling rules) instead of
  substring-matching the whole id including the region-varying label tail.

Fallback-walk findings:
- A container row the walk cannot collect (nested deeper than one level, id
  missing/over-long, child table full) now marks the list incomplete with a
  log line, so a silently truncated catalog is never cached for the TTL.
- Empty-id product rows are dropped (they dodge the dedupe and the contract's
  uniqueness guarantee).
- One global 200-page budget bounds a misbehaving server to ~5x the observed
  live request count instead of children x per-container cap.
- stream_identifier's disc-rescue path reads product_id before storeProductId
  (the latter is normalized only after streamIdentifier is stamped).

Docs: schema example says 8, v6 changelog no longer overclaims storeProductId,
dedupe_contract_product_ids documents the plusCatalog stamp on input rows.

Live re-verified: HU walk 788 titles / US 853, complete, id sets matching an
independent walk; unit suite 126/126.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@forward-technologies
forward-technologies merged commit 5b55c88 into release/beta Aug 2, 2026
forward-technologies added a commit that referenced this pull request Aug 2, 2026
…egions

Cloud Play fixes for fallback regions: full catalog restore + Bloodborne launch (2.11.4)
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.

2 participants