Three bugs, all seen on Bubble Tower (itch.io game 4845491):
- Installs of bought games failed with "you must buy this game to download".
butlerd only learns itch.io download keys from Fetch.ProfileOwnedKeys,
which the library skips when "show_purchases" is off (the listing then
comes from collections, so owned games still show up). butlerd queued
the install without credentials and itch.io rejected the build request.
Install.Queue is now retried once after a fresh owned-keys sync when
itch.io answers with that error.
- The install-options upload dropdown never applied the user's pick: it
offers "<name> (<size>)" while _pick_upload compared against the bare
displayName/filename, so every multi-upload game silently fell back to
the default upload. The label format is now shared through
UPLOAD_SIZE_SEPARATOR and the name prefix counts as a match.
- Games whose receipt carries no launch block were resolved by scanning
for the largest executable and splitting "size path" on a space, which
truncated the path of any file with a space in its name (Unity's
"unity default resources") and pointed the launch at a file that does
not exist. Sizes and paths are now tab-separated, and Unity's data
files are skipped.
- Inject the user-level shared-libs dir into LD_LIBRARY_PATH for installed
games so FNF finds libvlc.so.5 (idempotent, avoids duplicate entries)
- Reconcile cached installs against butlerd's live caves: normalize
int/float ids, wait for butlerd when the cache claims installs, keep the
cache when Fetch.Caves fails, and re-save the reconciled cache
- get_caves() returns null on RPC error (vs [] for genuinely nothing
installed) so callers can tell a transient failure apart
- Patch freshly installed/updated items in place so the Play button launches
the new binary immediately
- Drop and re-add items through the LibraryManager so the library menu
re-renders after install/uninstall (core handler is a no-op upstream)
- Restore launch-page focus after uninstall by searching get_tree().root:
get_tree().current_scene is null in OGPU, so the old fix silently no-oped
and left the D-pad dead
The old `find | head -n 1` guess picked the wrong binary for many games
(e.g. a Unity LinuxPlayer_s.debug stub instead of the real .x64 launcher,
or nothing at all for .love games), so most fresh installs failed to
launch. Read .itch/receipt.json.gz (butlerd writes the authoritative
launch target on every install) and use its resolved command, with a
smarter best-effort scan as fallback. Re-resolve commands on cache load
so existing installs are fixed without a reinstall.
The new 'Only show games available on this platform' checkbox in the
plugin settings drops games whose platforms don't include the OS
OpenGamepadUI is running on (e.g. Windows-only games on Linux). Games
with no platform info at all (HTML5) are kept since there's nothing to
filter on. The setting is read on every library load, so toggling it
reloads the itch.io library without a restart.
OGPU wipes user://plugins/<id>/ (and everything inside it) whenever a
plugin is updated or re-extracted, so storing butler and butler.db under
user://plugins/itch/assets meant every version bump deleted the binary
and its login session. Store them in persistent user://butler instead,
and migrate any leftover install from the old location.