Skip to content

v2.5.0 - #157

Merged
alexballas merged 76 commits into
mainfrom
devel
Aug 4, 2026
Merged

v2.5.0#157
alexballas merged 76 commits into
mainfrom
devel

Conversation

@alexballas

Copy link
Copy Markdown
Owner

No description provided.

alexballas added 30 commits July 7, 2026 09:43
…ble artwork cache

- Remove -artwork CLI flag and PrepareWithOverride/Resolve/Register (Phase 6 revert)
- Add playbackTarget struct and traversal/auto-play helpers for GUI
- Add immutable cache-control and ETag for content-addressed artwork routes
- Use active device endpoints in queueNext and gapless routing
- Replace selectedDevice references with active/traversal targets in Fini/settings
- Update artwork-plan.md to Phase 7 status
… absolute path

- make build runs webui first; new webui phony target
- AddQueueItem deduplicates by absolute path; QueueAndPlay reuses existing
- Queue.Move uses proper slice shifting, fixes multi-position currentIndex
- MediaRef.AbsolutePath and library.Metadata.AbsolutePath plumbing
- SVG icon system: play/pause/stop/volume/spinner/grip/list icons
- Playlist drag-and-drop with pointer events and keyboard reorder
- Back-to-top button on scroll
- library.play action: QueueAndPlay from webUI library
- queue.move accepts any non-zero delta
- CSS redesign: scrollbar styling, new brand palette, grid layout
- GUI queue row: removed subtitle, selection details shows full path
- Updated deps: refyne, go-colorable, go-isatty, goldmark
Remove duplicated newJSONLogger and discardLogger from castprotocol,
soapcalls, and utils. Add CI webui job. Tidy go.sum.
…CLI provisioning

Android share intent handler for video/audio/image via share sheet.
Extract setMobileMediaURI so file picker and share use same path.
FyneApp.toml: add ShareMimeTypes, bump build to 133.
Makefile: android-fyne target builds packaging CLI from go.mod refyne version,
add ELF 16 KB page alignment checks, manifest assertions, zipalign -P 16.
CI: remove stale fyne install step that caused missing share target.
soapcalls: remove directlyConnected check (broken on Android), accept any
routable renderer address. Test for routed address acceptance.
…ix artwork/content URI reads

version.go with //go:embed version.txt replaces -ldflags -X and sed injection in CI and Makefile. CI workflows cleaned up.

Android casts now run inside a foreground service to survive backgrounding. Multicast lock wraps SSDP and mDNS discovery scans so devices are reachable on Android.

Artwork resolution reworked to work from file descriptors (content:// / sandboxed picks). ResolveArtwork no longer fails on unlistable directories. Stream MIME detection uses io.ReadFull for short-read sources like content:// pipes. Chromecast media URL encoding fixed for spaces in filenames.
- GetStatus uses UpdateOnce (single attempt, no retry sleep)
- Play/pause queries live device state instead of cached screen state
- receiveLoop closes socket immediately on read failure
- Mute state synced by status watcher, not separate poll
- dropDeadChromecastSession helper for mobile
Android sets TMPDIR but not HOME/XDG_CACHE_HOME, so crash logging was
silently disabled on mobile - #158 came with a bare tombstone instead of
a Go traceback.
refyne's blur shader declared uniform float kernel[401], which fails to
link wherever GL_MAX_FRAGMENT_UNIFORM_VECTORS is below that, killing the
app at startup (#158). The kernel now travels as a texture.
Slider moves out of main.go into progress_slider.go, timeline math into
progress_timeline.go (+tests), mobile-only helpers in progress_mobile.go.
Mobile FyneScreen gains SlideBar, CurrentPos/EndPos bindings, ffmpegSeek,
sliderActive, dlnaSeekRestart, activeDevice.

Clamp the displayed position to the duration: ffprobe durations can
undershoot and push the bar past the end.
finishRun publishes the terminal state under the lock, then releases the
lease after unlocking, so awaitState can return before the release is
visible. Under whole-repo -race load that window is wide enough to fail.
Poll for the count like awaitState polls for the state.
hub.serve checked the client limits, upgraded, then registered. The
upgrade completes the handshake, so a client whose Dial returned was not
yet counted and the next one could pass the check, get a 101, and then be
closed silently by the second check instead of a 503 client_limit. Under
CI load that lost race failed TestWebSocketGlobalLimit.

Take the slot before upgrading and hand it back if the upgrade fails or
the hub closed; the per-IP limit had the same window.
Android and Windows both hardcoded --app-build 1, and the macOS workflows
passed nothing so they defaulted to 1 too. Every release therefore shipped
the same version code, which sideload updaters (Obtainium, F-Droid) use to
detect a new version, so they never saw one - and no build was
distinguishable from another on-device.

APP_BUILD now comes from version.txt as xxyyzz00, +99 for a release, so it
rises on its own and a -dev build stays below the release it leads to.
2.5.0 -> 2050099, 2.5.0-dev -> 2050000.

Also move the default debug keystore out of BUILD_DIR, which make clean
wipes; a regenerated key breaks installing over an existing build.
Every release APK so far was signed by a key that existed for one CI run
and was then discarded: build-android.yml never set GO2TV_ANDROID_KEYSTORE,
so make android generated a debug key each time. Published fingerprints
prove it - 2.3.0 is 7406e14b, 2.4.0 is 7f3afe19 - and Android rejects
installing over a build signed by a different key, so users had to
uninstall and lose their data on every upgrade.

The workflow now decodes an ANDROID_KEYSTORE_BASE64 secret into RUNNER_TEMP
(outside the workspace, so it cannot reach an artifact) and hands it to the
existing GO2TV_ANDROID_* contract. Without the secret the build still runs
and warns, so forks keep working. apksigner now prints the certificate so
the signer is visible in every build log.
…napshot

update() dropped updateMediaStatus errors, so an unreadable media session
looked like a successful refresh of the previous state. Return the error and
keep the snapshot: callers map nil to IDLE and the playback monitor ends
playback on the first IDLE poll, so clearing it would turn one lost response
into a spurious 'finished'. An error goes through the monitor's lost-poll
tolerance instead.

updateMediaStatus does clear the snapshot when the receiver reports no
session, so Skip, SeekFromStart and Skipad now re-check for nil after
refreshing rather than dereferencing it.
First refyne tag under the fork's module path. The pseudo-version read as
2.0.0, which failed the packaging CLI's >=2.2 gate, so metadata injection
was silently skipped and builds shipped with no app ID, version or icon.
Fixes flaky windows test panic from concurrent test binaries racing on
the same %LOCALAPPDATA%\GoGL install dir.

Claude-Session: https://claude.ai/code/session_01XuPZ9hX3Qhzinwd31drsVC
@alexballas
alexballas merged commit e745f68 into main Aug 4, 2026
11 checks passed
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