Skip to content

📝 docs: update README, add editorconfig, license, wire up stream warmup - #4

Merged
Nxssie merged 14 commits into
mainfrom
feature/pending-fixes
Aug 13, 2026
Merged

Nxssie merged 14 commits into
mainfrom
feature/pending-fixes

Conversation

@Nxssie

@Nxssie Nxssie commented Apr 25, 2026

Copy link
Copy Markdown
Owner

Summary

  • Update README: fix PKCE mention, add missing features (lyrics, theme toggle, now playing), complete architecture diagram
  • Add LICENSE (MIT) — was missing from repo
  • Add .editorconfig for consistent code style across editors
  • Wire up warmupStreamConnection() in main.kt (was defined but never called)
  • Fix CI artifact paths to match renamed outputs (Wren-.msi, Wren-.dmg)

Nxssie added 14 commits April 25, 2026 23:52
- Added multi-signal EOF detection (null frame threshold + position stuck + exception budget)
- Extracted PlaybackStateMachine for testable EOF logic (26 unit tests)
Move all desktop source under desktop/, wire up the shared/desktop/android
Gradle modules that were scaffolded but never populated, and extract the
domain models (SearchResult, QueueItem, Playlist, etc.) that were duplicated
across api/player files into shared/models for future reuse from Android.
Nothing was logged anywhere before this — failures in the audio pipeline,
yt-dlp resolution, and OAuth refresh were silently swallowed by
runCatching/getOrNull, leaving no trace to diagnose crashes reported from
a GUI app launched without an attached terminal. Writes to
~/.local/state/wren/wren.log and installs a global uncaught-exception
handler so real crashes leave a stack trace too.
Only the stream URL was prefetched for the next track — the actual
FFmpegFrameGrabber connection was cold-started on EOF, and the network
connect + stream probe latency during that window was the audible cut
before jumping to the next song. Now the next track's grabber is opened
and connected ahead of time and reused instantly on transition.

Also: a track that fails to open (e.g. a rejected googlevideo connection)
used to just stop playback silently instead of advancing — auto-skip to
the next track now kicks in, bounded to 3 consecutive failures so an
entirely unplayable queue doesn't loop forever. Reconnect options are
added to the grabber for transient mid-stream network drops.
createDistributable and wren.png moved under desktop/ during the
multiplatform migration; the packaging script still referenced the old
root-level paths.
Wraps build-appimage.sh with versioning and gh release create/upload so
cutting a release is one command.
…ration

build/test/package tasks and artifact paths were still targeting the root
project, which no longer builds an application after the module split.
- Add a centered logo + build/license/kotlin badges header, matching the
  usual OSS README convention.
- Update the architecture tree and build commands (gradlew run,
  packageDeb/Rpm) to the desktop/shared module layout from the KMP
  migration — they still showed the old single-module paths.
Compose Desktop places packaged output under main/<format>/ (e.g.
main/dmg/, main/msi/), not directly under main/ — the rename and
upload-artifact steps were looking in the wrong place. Also pin the
rename step to bash explicitly since windows-latest defaults run: steps
to PowerShell, which doesn't understand the case/glob syntax.
upload-artifact@v6 mis-resolves the common ancestor when given multiple
sibling globs across format subdirectories and fails with an invalid-path
error, even though exactly one of them matches. Compute the one relevant
glob for the current matrix job instead.
Every track played at its native level, so switching tracks could mean a
jarring volume jump. Add an RMS-based auto-gain that smoothly steers each
track's short-term loudness toward a common target, and fade the first/
last ~2.5s of each track in/out.

This isn't a true overlapping crossfade — that would need decoding and
mixing two streams simultaneously — but combined with the gapless
preload it gives a similarly smooth transition for much less complexity.
mv wren-*.msi Wren-*.msi renames to the literal string "Wren-*.msi" —
bash doesn't expand a destination glob that matches no existing file, so
the asterisk landed in the real filename and upload-artifact rejected it.
Derive the destination name from the actual matched source file instead.
@Nxssie
Nxssie merged commit ba9a029 into main Aug 13, 2026
5 checks passed
@Nxssie
Nxssie deleted the feature/pending-fixes branch September 11, 2026 11:19
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