v2.5.0 - #157
Merged
Merged
Conversation
…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
…ebui artwork pipeline
…n normalization; autoplay tests
…andler polish; rm stale tests
… 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
… pkg; build-webui rewrite
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.