Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
9786526
PS Plus Cloud Play: region catalog, PS4/PS5 streaming, cross-gen libr…
nyakaspeter Jun 3, 2026
36e5aff
Add PS3 Classics cloud streaming (region-generic, all platforms)
nyakaspeter Jun 3, 2026
773c9a9
Fix crash when starting a stream in portrait on tablets
nyakaspeter Jun 3, 2026
a05e6d1
Cloud library: stream the owned full game for disc-upgrade titles
nyakaspeter Jun 4, 2026
48c0bf3
Cloud library: always use the owned PS5 product id on merged catalog …
nyakaspeter Jun 4, 2026
fbef1ee
Cloud library: fix PS5 owned-id override never running in the "all" view
nyakaspeter Jun 4, 2026
e4dc28e
Merge PR #16 (cloud catalog & streaming fixes) onto master
forward-technologies Jun 7, 2026
966feb5
Android cloud: don't cache catalog when ownership check fails; warn t…
forward-technologies Jun 7, 2026
01294b9
Unify cloud catalog across Qt, Android, and iOS with ownership merge …
forward-technologies Jun 13, 2026
7d8230d
Cloud catalog: deterministic owned-game dedupe + trial/cross-buy fixe…
forward-technologies Jun 24, 2026
0063eec
Cloud catalog: surface expired-session warning + device-based browse …
forward-technologies Jun 25, 2026
b5a99e3
Cloud catalog: centralize fetch/merge in libchiaki + cross-platform g…
forward-technologies Jun 26, 2026
8c338af
Cloud: RTT safety offset, stream-language separation, and Cloud Play …
forward-technologies Jun 26, 2026
26c3a55
Streaming stats overlay + Android Cloud Play card polish
forward-technologies Jun 27, 2026
f4a1b83
Android CI: optional sideloadable test APK; bump version to 2.10.22
forward-technologies Jun 27, 2026
61bbe70
Address PR review: APK ABI pinning, CI publish guards, accurate dropp…
forward-technologies Jun 27, 2026
59815af
Revert dropped-frame counter tweak; keep videoreceiver untouched
forward-technologies Jun 27, 2026
ef803a1
Invalidate + reload cloud catalog on account/profile/locale change
forward-technologies Jun 27, 2026
202a575
Build scripts: unify non-hanging log capture; add android/build-local.sh
forward-technologies Jun 27, 2026
c669fb3
Phase 1: rename cloud locale settings; remove dead datacenter-languag…
forward-technologies Jun 27, 2026
0da7130
Phase 2: server-authoritative store country from base_url; step0_5d u…
forward-technologies Jun 27, 2026
a43e8af
Fix step0_5d language: use locale lang with resolved store country
forward-technologies Jun 27, 2026
b098f40
Cloud catalog cache: only invalidate when the npsso actually changes
forward-technologies Jun 27, 2026
e33d2df
test: cover cc_parse_container_store_locale (Phase 2 store-country pa…
forward-technologies Jun 27, 2026
b7eeb9f
macOS build: bundle SDL3 for sdl2-compat (fixes launch crash)
forward-technologies Jun 28, 2026
a90926d
Phase 3.1 (Qt): owned-PSNOW fast-path with one-shot fallback
forward-technologies Jun 28, 2026
8e14589
Fix iOS build: SecureStore referenced renamed cloud_fallback_region key
forward-technologies Jun 28, 2026
e37fc1a
Phase 3.1 (Android + iOS): owned-PSNOW fast-path with one-shot fallback
forward-technologies Jun 28, 2026
4ee975b
Cloud streaming: server-authoritative store language (resolvedStoreLang)
forward-technologies Jun 28, 2026
7f31f24
Cloud Play: hide region banner on auth failure or mid-load
forward-technologies Jun 28, 2026
57dc975
Merge pull request #24 from ForWard-Technologies-LLC/feat/unified-clo…
forward-technologies Jun 28, 2026
38d4ac4
CI(android): fix sideloadable-APK step failing when find matches nothing
forward-technologies Jun 28, 2026
8aaa31b
CI(android): make sideloadable APK installable (drop testOnly)
forward-technologies Jun 28, 2026
fdea780
cloudsession (phase 0): public API + module skeleton
forward-technologies Jun 29, 2026
0e6ad8e
cloudsession (phase 1): port the senkusha datacenter ping to C
forward-technologies Jun 29, 2026
8b1098b
cloudsession (phase 2a): Gaikai client_ids + config + session threading
forward-technologies Jun 29, 2026
28a1020
cloudsession (phase 2): full Gaikai allocation flow in C
forward-technologies Jun 29, 2026
816f4c9
cloudsession (phase 3+4): Kamaji resolve + orchestrator
forward-technologies Jun 29, 2026
2af429e
cloudsession: fix Kamaji OAuth scope encoding + add live probe harness
forward-technologies Jun 29, 2026
624fc92
cloudsession (phase 5): wire Qt to the unified C provisioning flow
forward-technologies Jun 29, 2026
5d944f7
cloudsession: parameterize probe harness to exercise every path
forward-technologies Jun 29, 2026
a97ba26
cloudsession: parallel datacenter ping + richer allocate progress
forward-technologies Jun 29, 2026
a681c31
cloudsession: restore the lock-retry + datacenter loading text verbatim
forward-technologies Jun 29, 2026
919e257
cloudsession (qt): always return to menu on a cloud error
forward-technologies Jun 29, 2026
0155932
cloudsession: restore PSNOW Kamaji "Step X of 6" progress; drop "Play…
forward-technologies Jun 29, 2026
6879b9f
cloudsession (qt): restore streaming-language catalog-locale fallback
forward-technologies Jun 29, 2026
605641f
cloudsession: build the Sony account-privacy upgrade URL (parity)
forward-technologies Jun 29, 2026
a67c509
cloudsession (ios): wire iOS to chiaki_cloud_provision_session + json…
forward-technologies Jun 29, 2026
3e9956f
cloudsession: surface "Selected datacenter not available" message
forward-technologies Jun 29, 2026
ea01912
cloudsession: produce the full merged datacenter list for the Setting…
forward-technologies Jun 29, 2026
8ccbb49
cloudsession (qt+ios): persist merged datacenter pings into Settings
forward-technologies Jun 29, 2026
76ecb43
cloudsession (android): wire Android to chiaki_cloud_provision_sessio…
forward-technologies Jun 29, 2026
925a7f8
cloudcatalog: badge PS Now titles "streamable" (not "owned")
forward-technologies Jun 29, 2026
4f5000a
settings: rename cloud sections to "Owned Games (PS5)" / "Streamable …
forward-technologies Jun 29, 2026
b0b7057
test: cover the Kamaji step 0.5d *GD full-game fallback
forward-technologies Jun 29, 2026
c168e89
cloudsession: fix review findings (thread-join UB; live JSESSIONID re…
forward-technologies Jun 29, 2026
05d7fa5
cloudsession: do the NPSSO authorizeCheck pre-flight in C
forward-technologies Jun 30, 2026
055db9c
cloudsession (ios): drop checkAuthorization (now in C) + delete old c…
forward-technologies Jun 30, 2026
e20bf92
cloudsession (qt): drop checkAuthorization (now in C) + delete old cl…
forward-technologies Jun 30, 2026
8725f8b
cloudsession (android): drop checkAuthorization (now in C) + delete o…
forward-technologies Jun 30, 2026
b1be26b
cloudsession: remove the obsolete PSCLOUD locale bootstrap (supersede…
forward-technologies Jun 30, 2026
738d172
cloudsession: remove dead Qt authManager + refresh stale comments
forward-technologies Jun 30, 2026
7fb453d
cloudsession: fix final-review findings (forced-DC RTT regression + d…
forward-technologies Jun 30, 2026
3dba3a9
cloudsession (ios): map ACCOUNT_PRIVACY_SETTINGS sentinel (safe, unte…
forward-technologies Jun 30, 2026
dbde906
cloudsession: address final-review nits (OOM header guard + dead code…
forward-technologies Jun 30, 2026
0f18eaa
cloudsession: address 3-agent review nits (OOM guards, dead field, cl…
forward-technologies Jun 30, 2026
0ab4517
cloudsession: consecutive Kamaji step numbers + de-dup PSNOW constants
forward-technologies Jun 30, 2026
db56da1
cloudsession: clarify game_name is logging-only (doc comment)
forward-technologies Jun 30, 2026
f2a89c1
cloudsession: handle GAME_NOT_FREE properly on all platforms (was gen…
forward-technologies Jun 30, 2026
f8bfe8e
cloudsession: remove the unused chiaki_cloud_ping_datacenters stub
forward-technologies Jun 30, 2026
4ee4c45
cloudsession: remove the unused cache_dir config field
forward-technologies Jun 30, 2026
2aa0a34
cloudsession: fix two behavior-drift regressions found by the parity …
forward-technologies Jun 30, 2026
a67865b
cloudsession (android): remove orphaned DatacenterPingNative JNI
forward-technologies Jun 30, 2026
59f58bf
cloudsession: tighten R1 store-locale fallback to byte-match the orig…
forward-technologies Jun 30, 2026
0a4eed8
Merge pull request #28 from ForWard-Technologies-LLC/feat/unified-clo…
forward-technologies Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 62 additions & 3 deletions .github/workflows/deploy-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ name: Deploy Android + Android TV (Google Play)

on:
workflow_dispatch:
inputs:
build_apk:
description: "APK-only: build a sideloadable test APK artifact and SKIP the Google Play publish"
type: boolean
default: false
workflow_call:
outputs:
chiaki_version:
Expand Down Expand Up @@ -122,16 +127,62 @@ jobs:
echo "No signing — unsigned build only"
fi

# Skipped on APK-only runs (build_apk checkbox): those just want a sideloadable
# APK and must not touch Google Play.
- name: Build release AAB
id: bundle_release
if: ${{ !inputs.build_apk }}
working-directory: android
run: |
./gradlew bundleRelease \
--parallel \
--build-cache \
-Dorg.gradle.java.home="$JAVA_HOME"

# Optional sideloadable APK. The AAB above can only go through Google Play,
# so this opt-in step (the "build_apk" checkbox on a manual run) produces an
# installable .apk testers can grab from the run's Artifacts. A signed release
# APK is built when signing is configured; otherwise a debug APK (still
# installable, self-signed) so the step never fails for lack of secrets.
- name: Build sideloadable APK
id: build_apk
if: ${{ inputs.build_apk }}
working-directory: android
run: |
# Plain assemble (NO android.injected.build.* properties): those mark the APK
# testOnly=true, which blocks normal sideloading (INSTALL_FAILED_TEST_ONLY / "can't
# install on this device"). abiFilters in build.gradle already limits native libs to the
# ABIs that were built (arm64-v8a), so this stays effectively arm64 while remaining
# installable from a file manager / the Downloads folder.
if [ "$SIGNING_CONFIGURED" = "true" ]; then
echo "Signing configured — building signed release APK"
./gradlew assembleRelease \
--parallel --build-cache -Dorg.gradle.java.home="$JAVA_HOME"
else
echo "::warning::No signing configured — building debug APK (self-signed, still installable for testing)"
./gradlew assembleDebug \
--parallel --build-cache -Dorg.gradle.java.home="$JAVA_HOME"
fi
# Newest final APK from the outputs dir (outputs/ only, so we never pick an intermediate
# unsigned APK). xargs -r so an empty find doesn't run `ls` on the cwd and yield a bogus path.
APK="$(find app/build/outputs/apk -name '*.apk' -print0 2>/dev/null | xargs -0 -r ls -t 2>/dev/null | head -1)"
test -n "$APK" || { echo "::error::No APK produced"; exit 1; }
SHORT_SHA="$(git rev-parse --short HEAD)"
DEST="pylux-${{ steps.extract_version.outputs.version }}-${SHORT_SHA}.apk"
cp "$APK" "$GITHUB_WORKSPACE/$DEST"
echo "apk_name=$DEST" >> "$GITHUB_OUTPUT"
echo "Built sideloadable APK: $DEST"

- name: Upload APK artifact
if: ${{ inputs.build_apk }}
uses: actions/upload-artifact@v4
with:
name: pylux-android-apk
path: ${{ steps.build_apk.outputs.apk_name }}
if-no-files-found: error

- name: Decode Google Play service account key
if: ${{ !inputs.build_apk }}
env:
JSON_BASE64: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON_BASE64 }}
run: |
Expand All @@ -148,7 +199,7 @@ jobs:
fi

- name: Determine Google Play track
if: env.UPLOAD_ENABLED == 'true'
if: ${{ env.UPLOAD_ENABLED == 'true' && !inputs.build_apk }}
run: |
if [ "${{ github.ref_name }}" = "master" ]; then
TRACK=production
Expand All @@ -160,7 +211,7 @@ jobs:

- name: Upload AAB to Google Play
id: upload_play
if: env.UPLOAD_ENABLED == 'true'
if: ${{ env.UPLOAD_ENABLED == 'true' && !inputs.build_apk }}
working-directory: android
env:
# Same value Gradle uses (extract-version semver_build_id); avoids Fastlane relying on a solo Gradle invoke.
Expand All @@ -177,7 +228,15 @@ jobs:
{
echo "## Pylux Android — v${CHIAKI_VERSION:-?}"
echo ""
if [ "${{ steps.bundle_release.outcome }}" = "skipped" ] || [ "${{ steps.bundle_release.outcome }}" != "success" ]; then
if [ "${{ inputs.build_apk }}" = "true" ]; then
echo "APK-only run — Google Play publish was skipped."
echo ""
if [ "${{ steps.build_apk.outcome }}" = "success" ]; then
echo "Sideloadable test APK \`${{ steps.build_apk.outputs.apk_name }}\` is attached to this run (see the **Artifacts** section, named \`pylux-android-apk\`)."
else
echo "APK build did not complete (outcome: **${{ steps.build_apk.outcome }}**). Check the logs above for details."
fi
elif [ "${{ steps.bundle_release.outcome }}" != "success" ]; then
echo "Build did not complete (outcome: **${{ steps.bundle_release.outcome }}**). Check the logs above for details."
else
case "${UPLOAD_ENABLED:-false}" in
Expand Down
18 changes: 18 additions & 0 deletions .github/workflows/deploy-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,24 @@ jobs:

ln -sf libvulkan.1.dylib build/gui/chiaki.app/Contents/Frameworks/vulkan 2>/dev/null || true

# Bundle SDL3 for sdl2-compat. Homebrew's `sdl2` (installed above) is now sdl2-compat -- an
# SDL2 API shim that dlopens SDL3 at runtime via @loader_path/libSDL3.dylib (next to libSDL2
# in Frameworks). macdeployqt does NOT copy SDL3 (it is loaded via dlopen, not linked), so
# without this the App Store .app aborts on launch with "Failed loading SDL3 library" before
# any of our code runs. It MUST be named libSDL3.dylib (the @loader_path name) -- not
# libSDL3.0.dylib, which only sdl2-compat's bare-name fallback (system search path) finds,
# masking the bug on dev machines. The per-arch copy is lipo-merged into the universal
# bundle in the create-appstore-pkg job and signed there with the rest of the dylibs.
SDL3_SRC="${{ matrix.brew_prefix }}/opt/sdl3/lib/libSDL3.0.dylib"
if [ -f "$SDL3_SRC" ]; then
echo "Bundling SDL3 (required by sdl2-compat)..."
cp -f "$SDL3_SRC" build/gui/chiaki.app/Contents/Frameworks/libSDL3.dylib
chmod u+w build/gui/chiaki.app/Contents/Frameworks/libSDL3.dylib
install_name_tool -id "@rpath/libSDL3.dylib" build/gui/chiaki.app/Contents/Frameworks/libSDL3.dylib
else
echo "::warning::SDL3 not found at $SDL3_SRC -- if libSDL2 is sdl2-compat the app will crash on launch"
fi

- name: Create tarball for PKG job (cache, not workflow artifact)
run: |
cd build/gui
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,4 @@ macos/fastlane/report.xml
# Local Flatpak testing (throwaway, never commit)
scripts/flatpak/test-flatpak-local.sh
pylux-test.flatpak
lib/test_cloudcatalog/.npsso
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ tri_option(CHIAKI_USE_SYSTEM_CURL "Use system-provided curl instead of submodule
# CI injects real values from the CHIAKI_VERSION_* lines below at archive time (.github/workflows/deploy-ios.yml).
set(CHIAKI_VERSION_MAJOR 2)
set(CHIAKI_VERSION_MINOR 10)
set(CHIAKI_VERSION_PATCH 21)
set(CHIAKI_VERSION_PATCH 22)
set(CHIAKI_VERSION ${CHIAKI_VERSION_MAJOR}.${CHIAKI_VERSION_MINOR}.${CHIAKI_VERSION_PATCH})

configure_file(
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

<activity android:name="com.metallic.chiaki.main.MainActivity"
android:exported="true"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
Expand Down
Loading
Loading