Releases: PiBOH/vivi-music
Release list
Vivi Music 6.4.45_DE 1.50.16
Vivi Music 6.4.45_DE 1.50.16
Release channel: nightly
[6.4.45_DE-1.50.16-nightly] - 2026-09-04
Added
- [DE] Native system playback controls and "Now Playing" on macOS: the app now registers with the system media session (Control Center and Lock Screen tile) through a small native helper (MediaPlayer.framework), so the current track is recognised system-wide and the physical media keys — keyboard, Touch Bar, headset buttons — control VIVI directly without needing Accessibility permission. Play/Pause, Next, Previous and scrubbing from the Lock Screen slider are wired to the player, and the tile shows the track title, artist and cover art (artwork is downloaded and cached locally). On Windows and Linux the existing global key hooks are unchanged. Closes #5.
Commits
- v6.4.45_DE-1.50.16-nightly: native macOS Now Playing + media keys via MediaPlayer helper
- docs: reply in the language of the user's message; app text English-first + translated, issues always in English; dedupe section 7
- docs: mark the embedded WebView sign-in as a do-not-touch area (verified working)
This release was built automatically from commit e425610ca3cb7e6dc1712e3d1e010ec15ab1bb10.
Vivi Music 6.4.45_DE 1.50.15
Vivi Music 6.4.45_DE 1.50.15
Release channel: nightly
[6.4.45_DE-1.50.15-nightly] - 2026-09-04
Fixed
- [DE] Audio micro-pauses/skips on macOS (random brief glitches on almost every track, coinciding with small UI hitches) reduced: the output line buffer was only ~90 ms of audio, so any decode-thread stall (moof scan after a network burst, disk read, GC pause) underran the line and caused an audible skip. The line now buffers ~250 ms (computed from the real audio format, with smaller fallbacks), atom scans are bounded to 256 KB windows so one burst can't stall the decode thread, frames are queued before scanning (so a scan overlaps with already-buffered audio), and the seek slider/lyrics now follow the real playhead instead of the decode-ahead position. Closes #4.
Commits
- v6.4.45_DE-1.50.15-nightly: reduce macOS audio micro-pauses/skips — bigger output buffer, bounded scans, playhead-based position. Closes #4
This release was built automatically from commit cd6add06162dfa542fc45282cc1ae863caab0ac5.
Vivi Music 6.4.45_DE 1.50.14
Vivi Music 6.4.45_DE 1.50.14
Release channel: nightly
[6.4.45_DE-1.50.14-nightly] - 2026-09-04
Added
- [DE] Sidebar "Playlists" entry now opens the full playlist list screen (all local playlists with create/rename/delete); the chevron arrow is the only control that expands/collapses the inline playlist list in the sidebar. Closes #3.
Commits
- v6.4.45_DE-1.50.14-nightly: sidebar Playlists header opens the full playlist list; only the chevron toggles the inline list. Closes #3
- docs: GitHub Issues workflow — open an issue before fixing, follow the repo templates, reference and close it
This release was built automatically from commit ca2e49a0bfd533f19c820c84178b3cf191ffbd97.
Vivi Music 6.4.45_DE 1.50.13
Vivi Music 6.4.45_DE 1.50.13
Release channel: nightly
[6.4.45_DE-1.50.13-nightly] - 2026-09-04
Fixed
- [DE] Mini player seek bar now works on tracks restored from the persistent queue without opening the full player: restored tracks used to lose their duration, so the seek bar fell back to a 0..1 range and the thumb snapped back to the start after a scrub, making the seek look dead. The scrubbed position now stays visible (shown as a percentage until the real duration is known) and playback starts from it; once a track is actually played its real duration is written back into the persistent queue, so on the next launch the seek bar has the correct range immediately.
Commits
- v6.4.45_DE-1.50.13-nightly: fix mini player seek bar for restored (never-played) tracks, persist real durations
- Update contributorsde.json
This release was built automatically from commit 80a173787eda3a28e52aed8e173546284bbf8df5.
Vivi Music 6.4.45_DE 1.50.9
Vivi Music 6.4.45_DE 1.50.9
Release channel: nightly
[6.4.45_DE-1.50.9-nightly] - 2026-09-03
Added
- [DE] About screen: new CONTRIBUTORS section below the developer card, listing the people behind the project (bogdan-developer, Ansu216, vivizzz007, dumbshrn) with their role, a link to their GitHub profile and their avatar fetched automatically from GitHub. The list is data-driven from
contributorsde.json(repo root, bundled into the app), so new contributors can be added without touching code; the file carries an inline_guideexplaining the format. Section header localized in all 47 languages; the contributor blurbs are intentionally neutral English.
Commits
- v6.4.45_DE-1.50.9-nightly: About contributors section, data-driven from contributorsde.json
This release was built automatically from commit afd391ae752feb8609356927afaf7b587d4f89e3.
Vivi Music 6.4.45_DE 1.50.8
Vivi Music 6.4.45_DE 1.50.8
Release channel: nightly
[6.4.45_DE-1.50.8-nightly] - 2026-09-03
Fixed
- [DE] Classic mini player seeking: the seek slider now seeks once when the drag ends, like the full player. Previously every drag tick restarted the whole decode thread, so the slider fought the live position reports and felt dead (could not scrub forward/backward reliably).
- [DE] Instant start on the restored queue: the startup prefetch now downloads the current track first. With a persistent queue the current track had no cache file (only the 3 next + 3 previous + the rest were prefetched), so pressing play had to resolve and download before the first sound; now it is already on disk when the app opens and starts immediately.
Commits
- v6.4.45_DE-1.50.8-nightly: fix classic mini player seeking, prefetch current track first at startup
- docs: branch policy — mobile commits to vivi-music-de + vivi-music-de-apk, main is an upstream mirror
This release was built automatically from commit af8c1e5bed9b7dc2e5a2a76521131708bdfaeb85.
Vivi Music 6.4.45_DE 1.50.7
Vivi Music 6.4.45_DE 1.50.7
Release channel: nightly
[6.4.45_DE-1.50.7-nightly] - 2026-09-03
Fixed
- [DE+APK] Bidirectional language sync that can never be hijacked at pair time: every manual language change now travels with a (deviceId, per-device sequence) marker. The peer only applies a language when the markers prove it is a newer manual change made on the other side — echoes and the stale stored value a phone pushes on every fresh pair are ignored, so pairing no longer flips the desktop back to English. The newest manual change wins on either device (change it on the DE and the APK follows, change it on the APK and the DE follows). Old peers without markers keep the previous behavior (desktop → phone mirroring only).
- [DE] Radio/Charts screen can never be silently blank: the charts parser now walks every section-list the response can use (any single-column tab, a top-level section list, the two-column tabs) instead of only the first tab, auto-issues the continuation once when the shell is empty, and the UI shows a localized empty state with a Retry button (plus one automatic retry) instead of an empty page.
- [DE] Single density selector: the duplicate "Density & grid" info row inside the Density sub-screen was folded into the one dropdown (its description), so the screen offers exactly one density option plus the separate grid-item-size picker.
- [DE] Every error is selectable: the shared error box, the login error/status lines, the update-failed / open-error texts and the Listen Together error lines are wrapped in
SelectionContainer, so any in-app error can be copied for a report. - [DE] Sign-in now strips the
||…suffix fromDATASYNC_ID: the delegated account id YouTube embeds inytcfgcan carry a trailing pipe-suffixed token; sent verbatim asonBehalfOfUserit made validation fail (401/500). The extracted value (WebView ytcfg capture and the shell fetch) keeps only the part before the first|— matching the manual test where removing the||made the login work. - [DE] Player-design dropdowns now highlight the selected option (the check compares the translated labels, not a raw key against the label) and
Localization.getgained a last-resort fallback that can never surface a raw snake-case key on screen. - Translations: 2 new keys (
retry,charts_empty) for the Charts empty state, translated across all 47 languages (translations assisted by AI — thanks to @CodebuffAI).
Commits
- v6.4.45_DE-1.50.7-nightly: pair-hijack-proof language sync, Radio/Charts never blank, selectable errors, DATASYNC_ID sanitize
This release was built automatically from commit 5cf0c829465b6f024a8a6eb04c4c07f902248c32.
Vivi Music 6.4.45_DE 1.50.12
Vivi Music 6.4.45_DE 1.50.12
Release channel: nightly
[6.4.45_DE-1.50.12-nightly] - 2026-09-03
Added
- [DE] Dedicated Contributors sub-screen: the About screen now shows a single "Contributors" row right under the lead developer card; tapping it opens a dedicated screen with the full list, so the About page no longer gets crowded as the list grows. Each entry shows the person's real name first with the GitHub handle in parentheses ("Name (@username)") when a
nameis present incontributorsde.json, otherwise just the handle. - [DE] Seek bars usable before the duration is known: a track loaded from the queue but never played can be scrubbed even while its length is still unknown (no more disabled slider); the chosen point is remembered as a fraction and playback starts from it the moment the duration becomes available (metadata or resolved stream).
Changed
- [DE]
contributorsde.jsonis now always read from the repository (vivi-music-debranch) with a silent refresh every time the Contributors screen opens — no local~/.vivimusic/contributorsde.jsoncopy is created or read anymore (a stale one from older builds is deleted by the app); the bundled copy is only the offline fallback.
Commits
- v6.4.45_DE-1.50.12-nightly: dedicated Contributors sub-screen with real names, contributors read only from the repo, seek-before-play with unknown duration
This release was built automatically from commit 1c4937b3c60657d76a4dca4c92c9849bfb303f06.
Vivi Music 6.4.45_DE 1.50.11
Vivi Music 6.4.45_DE 1.50.11
Release channel: nightly
[6.4.45_DE-1.50.11-nightly] - 2026-09-03
Added
- [DE] YouTube-style buffered progress on the seek bars of every player: while a track is still streaming/downloading, a fainter secondary segment shows how much of the audio is already available (full player - M3 Expressive and Classic designs, the Classic mini player slider, the Apple mini player bottom bar and the New mini player progress ring). Fully cached or finished downloads show no extra segment, and the buffer keeps advancing while the track is paused.
- [DE] Seek bars can now be scrubbed before playback starts: dragging the slider on a loaded-but-not-yet-started track (restored persistent queue, or a track that already ended) remembers the chosen position, and pressing play starts from there instead of ignoring the drag.
Changed
- [DE] The About -> Contributors list is now fetched live from GitHub (
contributorsde.jsonon thevivi-music-debranch) every time the screen opens, so new contributors appear without an app update; the local copy (~/.vivimusic/contributorsde.json) is kept only as an offline cache/fallback and is refreshed silently.
Commits
- v6.4.45_DE-1.50.11-nightly: buffered progress on player seek bars, seek before play, live contributors from GitHub
This release was built automatically from commit b2b632b42e11bb7f84d77ab5fecdde877f3c2622.
Vivi Music 6.4.45_DE 1.50.10
Vivi Music 6.4.45_DE 1.50.10
Release channel: nightly
[6.4.45_DE-1.50.10-nightly] - 2026-09-03
Changed
- [DE] The contributor list is now read from
~/.vivimusic/contributorsde.json(the bundled default is copied there on the first launch), so contributors can be added, edited and reordered without rebuilding the app — the About screen picks the changes up at the next launch.contributorsde.jsonin the repo root stays the shipped default, with a clearer multi-line_guide(one line per row) explaining the format, the user-data location and optional fields. vivizzz007 moved first in the default order.
Commits
- v6.4.45_DE-1.50.10-nightly: contributors editable via ~/.vivimusic/contributorsde.json, vivizzz007 first
This release was built automatically from commit 84d6dc3b32144c3fd16202437c030d475aa21bea.