Releases: PiBOH/vivi-music-de
Release list
Vivi Music 6.0.8.5_DE 1.54.13
Vivi Music 6.0.8.5_DE 1.54.13
Release channel: beta
✨ Added
- [DE] The emoji are drawn from a custom colour font. The app now bundles a subset of Noto Color Emoji (
fonts/NotoColorEmoji.ttf, SIL OFL 1.1) carrying exactly the emoji codepoints it draws, and a generated coverage list (EmojiCoverage) tells the renderer which codepoint belongs to which font. One the colour subset does not have falls through to the monochrome Noto Emoji, and only then to the OS font, so a heading emoji is asked of a font that can actually paint it.
🐛 Fixed
- [DE] Changelog bullets are bullets again. The list parser and the renderer had their
bulletflag swapped, so every-row was drawn as the literal-.and a numbered row as a bullet. Bullet rows show•and ordered rows show their number now. - [DE] The pointing hand appears only on a link. The hand was set for the whole clickable line, so a changelog paragraph that merely contained a link showed it over its entire surface. It is decided from the pointer's position inside the
URLannotation now, so the rest of the line keeps the ordinary arrow. - [DE] The System screen no longer shows the CPU/GPU description twice. The live monitor row borrowed the "enabled" status string as its subtitle and the Developer options row still carried the old performance-monitor text; the monitor row shows its real description and Developer options has its own, translated in every language.
📝 Commits
- v6.0.8.5_DE-1.54.13: colour emoji font, changelog bullets, link-only cursor, System descriptions
This release was built automatically from commit c6f0dc2571d99091fc66072046c86c9f8b1cad39.
Vivi Music 6.0.8.5_DE 1.54.12
Vivi Music 6.0.8.5_DE 1.54.12
Release channel: beta
Completes the 1.54.11 release. 1.54.11 was published from an earlier commit before the work below landed, so this release carries it. The two real fixes are the missing About entry and the sign-in route for a Spotify account created with Google.
✨ Added
- [DE]
DetailedStartupLogs, off by default, and a switch in Developer options. On, the four per-stage startup timing lines (for examplestartup: cached options loaded at +489395ms) are written toapp.log; off,startupStagewrites nothing at all, so the lines are removed rather than shortened. The JSON key is exactlyDetailedStartupLogs. - [DE]
super_logs_writeris now the JSON keydetailedPlaybackLogging. The option has a switch now, so it left the snake_case exception behind and follows the file's camelCase convention; an oldsuper_logs_writervalue is ignored and the option falls back to its default, off. - [DE] Every new string has a real translation in all 52 languages. The published
1.54.11still carried the English placeholder for the strings it added; the localization audit reports no missing or leaking keys and no wrong-script value now.
🔧 Changed
- [DE] The live CPU / RAM / GPU / network monitor is now the "Performance impact reader". It is reachable without any unlock and carries the new name in all 52 languages.
🐛 Fixed
- [DE] The About entry is back in the settings menu. The Spotify import row was inserted in the middle of
aboutItemswithout extending the index mapping below it, so every row from that point on was keyed to the wrong item and the last one, About, was never rendered at all. The mapping lists all seven rows in order again, so Settings > About is reachable. - [DE] The right-click menu is only as wide as its widest item. Each Material 3 card sizes to its content (
IntrinsicSize.Max); without it the rows'fillMaxWidthresolved against the Popup, which spans the window, and the menu came out as wide as the whole window. - [DE] A Spotify account created with Google can sign in now (issue #97). Google refuses to serve its sign-in page inside any embedded browser (
disallowed_useragent), and a JavaFXWebEnginehas no supported way to change that: the Chrome user agent the window already announces is not enough, because Google also inspects the engine itself. The window now offers a second link once Google blocks, Open it in your browser, which opens the same Spotify page in the user's own browser, where the Google button works, and swaps its status line for thesp_dcpaste instruction the screen behind it already carries. That is the one path that works for the account which has no password because it was created with Google.
📝 Commits
- v6.0.8.5_DE-1.54.12: real translations, About fix, narrow context menu, Google sign-in fallback
This release was built automatically from commit 701105f96588e813c201c79d6ec28212cc93c0e6.
Vivi Music 6.0.8.5_DE 1.54.11
Vivi Music 6.0.8.5_DE 1.54.11
Release channel: beta
✨ Added
- [DE] A real Developer options screen, unlocked by tapping the version code seven times. It appears under Settings > System > Advanced and holds the options that normally have no switch: the JVM heap (a picker from 1 GB to 16 GB, default 2 GB, applied on the next start by a one-time relaunch with the matching
-Xmx),DetailedPlaybackLogging(the oldsuper_logs_writer, now a toggle) andhide_custom_apk_download_button. The seven-tap no longer turns the performance monitor on by itself: it unlocks this screen. - [DE] A custom model field in the AI translation screen. The model picker now ends with a
Customentry that opens a text field, exactly like the mobile app, so any model id can be typed even when the provider list does not offer it. The OpenRouter list also gainsapodex/apodex-1.1-mini:freeandqwen/qwen3.8-27b:free, with a note that some free models may use your lyrics as training data. - [DE] The AI translation screen is rebuilt as grouped Material 3 cards. Provider, keys/model, mode and target language now render in the same card groups the mobile screen uses.
🔧 Changed
- [DE] The old "Developer options" screen is now "Performance options". It shows the same live CPU / RAM / GPU / network monitor, is reachable without any unlock, and is called Performance options everywhere from now on.
🐛 Fixed
- [DE] The changelog heading emoji are drawn, not boxed. The operating-system emoji fonts (Segoe UI Emoji, Apple Color Emoji) carry their emoji as colour glyphs that the desktop renderer drew as tofu, which is why only the BMP
✨ Addedcame out and every astral emoji (🐛 Fixed,🔧 Changed,📝 Commits) did not. A monochrome Noto Emoji is now bundled and used for every emoji codepoint, so each one is a plain outline the renderer can always paint; the OS emoji font stays only as a fallback for the few codepoints Noto Emoji omits. - [DE] The right-click menu is Material 3 Expressive. Compose Desktop's text menu was its own flat popup. A single Material 3
ContextMenuRepresentationis installed for the whole window, so every context menu (text selection andContextMenuArea) draws as a rounded, elevatedsurfaceContainerHighcard with Material 3 typography. It only changes how the items are drawn, never which items there are, so the Apple-only and APK-parity entries are untouched.
📝 Commits
- v6.0.8.5_DE-1.54.11: Material 3 context menu, real Developer options, custom AI model
This release was built automatically from commit 768e5b7afa10c1fc07694948392764cb907ad4b7.
Vivi Music 6.0.8.5_DE 1.54.9
Vivi Music 6.0.8.5_DE 1.54.9
Release channel: beta
✨ Added
- [DE] The changelog is rendered as real Markdown now, emoji included. About → Changelog showed the selected release through a renderer that stripped the markers it did not understand (
cleanInlineremoved**and backticks) and dropped everything else, which is why the body looked plain. The whole release body now goes through a new, dependency-free Markdown renderer (desktop/.../Markdown.kt): headings, bold, italic, strikethrough, inline and fenced code, clickable links, issue references (#N), nested bullet and numbered lists, block quotes, tables, horizontal rules and emoji. A construct it does not know is shown as plain text instead of breaking, so nothing can make the screen crash. - [DE] An available update shows its own release notes in the section below the update controls. Settings → Updates now renders the release's Markdown body under the download button, so what an update contains can be read before it is downloaded instead of only after installing it. The update check carries the release body (
UpdateStatus.Available.body) and the same renderer draws it, keeping the two changelog surfaces in step. - [DE]
ERRORS.mdgives the Spotify sign-in and import failures stable codes (SPOT-001…SPOT-013). Each code names where the message appears (window, screen or log), its cause and its remedy, so a report can point at an exact failure instead of pasting a sentence, and the code can be searched in the codebase.
🔧 Changed
Auto Releaseno longer starts the Telegram bot. Thenotify-botjob is gone: the owner posts by hand when a release should be announced, so a published release cannot launch the bot on its own any more. The only automatic trigger left is the schedule incall-vmde-bot.yml, which is now every 15 minutes (*/15 * * * *) instead of hourly: GitHub runs scheduled workflows best-effort and stretches the interval under load (an hourly cron was delivering roughly one run every 3-5 hours here), so a 15-minute request is what actually lands near hourly.- [DE] The sign-in windows' texts are readable and selectable. The status line (both windows) and the numbered steps (YouTube) were plain labels: on the dark header their default dark text was unreadable, and a label cannot be selected. They are now a transparent, non-editable, selectable control with explicit contrast (light text on the dark header, dark text on the light steps bar) whose height follows the text, so a long message wraps instead of growing an inner scrollbar.
🐛 Fixed
- [DE] The anti-embedded-browser check is now attempted, not only reported. On top of the real Chrome user agent the Spotify sign-in window injects a best-effort JavaScript shim on every page it loads:
navigator.webdriverreports false, awindow.chromeobject exists, andnavigator.userAgentData, plugins, mime types and languages match a desktop Chrome, so Google sees a normal browser where it used to see an embedded engine. Constraint: this is a mitigation, not a guarantee - Google can still identify the engine, and when it does the window keeps its honestspotify_google_blockedmessage and the Retry link instead of pretending.
📝 Commits
- v6.0.8.5_DE-1.54.9: rich changelog, legible sign-in window, manual bot
This release was built automatically from commit 45d8e7a5a9f63ea614a604decddaea380898c3d7.
Vivi Music 6.0.8.5_DE 1.54.8
Vivi Music 6.0.8.5_DE 1.54.8
Release channel: beta
[6.0.8.5_DE-1.54.8-beta] - 2026-10-01
Added
- [DE] The way into a Google-created Spotify account is now on the import screen, not only inside the sign-in window's message (#97). Google refuses its sign-in page to any embedded browser, so a profile created with Google has no way into the window at all until it has a password of its own — and the answer to that was a sentence inside a window the user only sees after trying. The screen now states it (
spotify_google_help, all 52 languages) and offers a button (spotify_set_password) that opens Spotify's own password-reset page (https://www.spotify.com/password-reset/, verified to redirect toaccounts.spotify.com/<locale>/password-reset), so the two steps — set a password, then sign in above with the email/password form — are visible where the decision is made. Constraint: this is guidance, not a bypass — Google's check cannot be faked from a WebView, and the password the user sets is what makes Spotify's own form usable. - [DE] Every horizontal row has scroll arrows, so a plain mouse can reach what is off the edge (#99). Each of these rows is a
LazyRow, and on a mouse without a horizontal wheel or a trackpad everything past the right edge was unreachable: the row showed its first three or four cards and nothing on screen said there were more, which is exactly what made "Mood & genres" and the "made for you" playlists look like they only held the entries that fit. The newHorizontalCarousel(Components.kt) wraps the row in aBoxand puts a round arrow over each end — the affordance Spotify's own desktop home rows use: the arrow in a direction that still has content is active, the other one is dimmed, and a press moves the row by about 85 % of a screenful (never less than 240 px, so a press can never look like it did nothing). It is applied to the Home sections, Recommended, Made for you, the Mood & genres preview, the Charts and Top music videos rows, the search-result cards and the album/artist carousels; a row that already fits shows no arrows at all, because an arrow that cannot do anything is worse than no arrow. Both arrows are named through the existingprevious/nextkeys in the sharedTooltip, like every other icon button. Constraint: the arrows only appear when the row really overflows — the two flags come from the row's own layout (canScrollBackward/canScrollForwardinsidederivedStateOf), so they follow a window resize instead of being decided once.
Fixed
- [DE] The embedded sign-in window can be opened again in the same session (#98). A window was only ever possible once per program start: after the first one closed, every later press of "Sign in to Spotify" or "Sign in" returned as if a window were already open. The window's own open flag is cleared by its close request, and the app closes the window itself the moment it has the session (
stage.close()from the cookie poll) — that path never runs the close request, so the flag stayed set for the rest of the session. Both windows (SpotifyLoginWebView,LoginWebView) now clear it in the one place every end of the window goes through (the capture delivery), which covers a capture, a close without one and a failure alike. Watch: inspotify.loga second attempt has to produce a secondsign-in captured sp_dc …line, not silence. - [DE] Google's "This browser or app may not be secure" page is no longer a dead end in the Spotify sign-in window (#97). Google refuses to serve its sign-in page to any embedded browser (
disallowed_useragent) — the message the user reported — so a Spotify profile created with Google can never be signed into from that window, and the block page was a wall with no way back. The window watches its own location now; when it lands on a Google host it says what happened (spotify_google_blocked, in all 52 languages) and offers the Spotify form back through a Retry link, which is the one route in that Google has no say in (the email/password form on the same page). Constraint: this is Google's own rule and nothing in a WebView can fake the browser checks it makes, so the honest answer is to say so and hand the user the form — the same page's email/password sign-in is unaffected, and a Google-created account can set a password onspotify.comfirst. Watch: choosing "Continue with Google" now logsGoogle refused its sign-in page inside the window (…)inspotify.logand the window shows the message instead of an unusable page. - [DE] The AppImage wears the app's own icon instead of the JVM's. The window is a plain AWT frame and nothing ever gave it an icon, so on Linux the panel, Alt+Tab and the window list showed Java's default mark — the AppDir's
.desktopnames the right file (Icon=vivimusic) and jpackage's app image carries no window icon of its own. The frame now takes the bundled brand mark (BrandLogo.awtImage), which is the same asset the tray already draws and which is also correct on Windows and macOS, and the AppImage job writes the.DirIconsymlink at the AppDir root so the AppImage file carries the icon too and not only the launcher entry it integrates into. - [DE] The Windows job's Inno Setup 7 step never even parsed, and that is why 1.54.6 and 1.54.7 were never published. The step added on 30 Sep ends with
Write-Host "Installed Inno Setup $installerVersion: $installDir", and PowerShell reads the:straight after a variable name as a scope qualifier: the whole script fails to parse (ParserError: Variable reference is not valid. ':' was not followed by a valid variable name character), the step exits 1 before downloading anything, and since the Windows job is what publishes the branded setup,Publish GitHub Releasewas skipped and no release was ever created — the last published release is 1.54.5, and every Inno Setup 7 change described for 1.54.6 shipped nowhere. It is${installerVersion}now (the brace is the escape), and everyshell: pwshstep of every workflow was re-parsed with PowerShell 7's own parser before this was pushed (4 steps, 0 errors) instead of trusting a green run that had never executed. Watch: the Windows job has to reachCompile branded installerand printCompiler engine version: Inno Setup 7.1.0; a failingInstall Inno Setup 7step means the download or the silent install broke, not the parser again.
Changed
- [DE] The Spotify cookie paste is no longer hidden behind a broken window (#97). The manual
sp_dc/sp_keyfields only appeared when no sign-in window could be created at all, which left a Google-created account with no way in — the window opens fine, Google just refuses the sign-in. A "Manual sign-in with cookies" entry now sits under the sign-in button on request, so the fallback that already existed is reachable without first making the window fail; the "the embedded window is not available on this system" line is only shown when that is actually true. - [DE] The chip rows got the same arrows as every other row (#99). The Home's category chips and the Search screen's filter chips are
LazyRows too, and they had the same unreachable-right-edge problem the carousels did, so they now go throughHorizontalCarouselas well. Every horizontal row in the desktop UI is behind it: the onlyLazyRowleft in the app is the one insideHorizontalCarouselitself.
Commits
- v6.0.8.5_DE-1.54.8: the release publishes again, and the Spotify way-in is on the screen
- v6.0.8.5_DE-1.54.7: carousel arrows, sign-in window and AppImage icon fixes
- fix(ci): name the repository when Release Manifest dispatches the pages deploy
- v6.0.8.5_DE-1.54.6-beta: the setup's language screen is on the screen, and CI compiles it with Inno Setup 7
This release was built automatically from commit 4bd71fb18339256e1698fd638a5332f1a5a65d90.
Vivi Music 6.0.8.5_DE 1.54.10
Vivi Music 6.0.8.5_DE 1.54.10
Release channel: beta
✨ Added
- [DE] The changelog's emoji and rare symbols render through the operating system's own fonts. Compose Desktop never falls back to a second font, so every character the app font does not carry (
✨,🐛,🔧,📝,🗑️,🌍,📌, but also a stray→,⋮,⠿or a CJK/fullwidth glyph in an entry that quotes a translation) was laid out as the "tofu" box the changelog was reported to show. A newMarkdownFontsresolves each such codepoint to the matching OS font (Segoe UI Emoji + Segoe UI Symbol + Yu Gothic on Windows, Apple Color Emoji + Apple Symbols + PingFang on macOS, Noto Color Emoji + Noto Sans Symbols + Noto Sans CJK on Linux) and the renderer gives each character a single-codepoint span pointing at it, so the real glyph is drawn. It is deliberately not in the font picker: it covers a handful of codepoints, not a text face. Verified: every non-ASCII character the currentCHANGELOG.mduses is present in the font it is routed to (checked against each file's owncmap), so nothing is sent to a font that cannot draw it.
🐛 Fixed
- [DE] The carousel shows one arrow at each end, on the correct side. Only the forward arrow was ever visible and it sat on the left: the alignment modifier was handed to the tooltip's own content, so both arrows fell back to the Box's default top-start position and the forward one (drawn last) covered the backward one. Each arrow is wrapped in its own aligned
Boxnow, so the back arrow sits at the left edge and the forward one at the right. - [DE] Hovering a changelog link shows the pointing hand again.
ClickableTextnever sets the hand cursor, so a link that opens a browser looked like inert text. A Markdown line that carries a link now setsPointerIcon.Handover itself. - [DE] The sign-in window's texts sit on their own background again. The header status and the numbered steps are selectable fields whose inner background had been left transparent, and the skin fell back to its default white: the light header text came out "light on a white box". The field now paints the exact colour of the bar it sits on (the dark header, the light steps bar), so the contrast holds whichever container CSS wins, dark text on light and light text on dark in both windows.
- [DE] The anti-embedded-browser shim is stronger and runs before the page's own scripts. The first attempt only ran once the page had finished loading, after Google's detection had already run; it is injected on SCHEDULED/RUNNING/SUCCEEDED now and adds the surface a desktop Chrome exposes (
navigator.vendor= "Google Inc.",platform,hardwareConcurrency,deviceMemory,pdfViewerEnabled,plugins,mimeTypes,userAgentData.getHighEntropyValues,chrome.csi/chrome.loadTimes). Constraint, unchanged: Google can still identify the engine, and when it does the window keeps its honest message instead of pretending.
🔧 Changed
- [DE] The "set a password on spotify.com" button and its guidance are gone. They told a user who already has a Spotify account to create a password the import never needed; the import has to work from the sign-in window. The button, its explanation text and the password-reset URL are removed, and the cookie paste stays one click away as the fallback for a window that cannot finish.
- The release body no longer repeats the version heading, and its commit list has an emoji.
Auto Releasecopied the changelog section including its own## [x.y.z_DE-n]line, so every release printed the version twice (once in the release title, once at the top of the body). The version line is skipped now and the section starts at its first###heading; the generated### Commitsheading is### 📝 Commits, matching the emoji the changelog sections carry. The already-published6.0.8.5_DE-1.54.9-betapage was corrected the same way.
📝 Commits
- v6.0.8.5_DE-1.54.10: carousel arrows, hand cursor, sign-in contrast, no tofu
- fix(ci): stop repeating the version heading in the release body
- docs: give every historical changelog section an emoji
This release was built automatically from commit bd21b033b0127df7b595db065bc7d506929628f1.
Vivi Music 6.0.8.5_DE 1.54.5
Vivi Music 6.0.8.5_DE 1.54.5
Release channel: beta
[6.0.8.5_DE-1.54.5-beta] - 2026-09-29
Added
- [DE] The Windows setup asks for the language on its first screen, and it asks in all 51 of them. The choice used to arrive on Inno's separate Select Language page, drawn in the wizard's own chrome — and since Inno Setup ships a wizard translation for only 29 of the 51 languages the program supports, a third of the users were asked which language they wanted in a page that stayed English. The picker now sits on the Welcome page, where the page's own text (
welcome_title/welcome_desc, the very lines the app's first screen shows) is generated into[CustomMessages]for every language and the list itself is built by[Code](scripts/generate_installer_welcome.py, oneAddLanguage(id, endonym, word)per language), so the screen that asks the question is in the user's language even where the wizard's buttons cannot follow. Constraint: Inno Setup loads its message table once at startup and exposes no way to change it (ActiveLanguageandGetUILanguageare getters;WizardStyleis compile-time andIsDarkInstallModeis read-only), so a live switch is impossible and the picker instead re-runs Setup with/LANG=the instant the choice changes — the new instance opens on the same page in about a second, becausePrivilegesRequired=adminmeans it is already elevated and does not ask again.ShowLanguageDialog=no(the picker is the question) andUsePreviousLanguagekeep an upgrade from re-asking; an unattended run (/SILENT,/VERYSILENT) is never handed a control that restarts the installer. Verified: compiled with Inno Setup 7 (ISCC.exe, exit 0, zero warnings or errors, all 51 languages parsed, both brand bitmaps loaded, and the[Code]section — whose member names the compiler checks — is what proves the picker's controls exist); the script's own encoding was checked with a throwaway script, because mine carries no BOM: a BOM-less UTF-8.issis read as UTF-8 (the Cyrillic text lands in the version resource asutf-16and not as its CP1252 mojibake), which is what keeps 51 languages of[CustomMessages]from shipping as garbage. - [DE] Import from Spotify signs in the way the phone does. The screen used to open the sign-in page in the browser and ask the user to find and paste the
sp_dccookie out of its developer tools — the step the mobile app's ownSpotifyLoginSheetexists to remove.SpotifyLoginWebViewis that sheet on the desktop: a JavaFX window (the same toolkit and cookie store the YouTube sign-in already uses, now shared throughJavaFxToolkitso one process starts JavaFX in exactly one place) opensSpotifyAuth.LOGIN_URL, the user signs in on Spotify's own page, andsp_dc/sp_keyare read off the store as soon as the page it lands on has them, which closes the window and connects the import. Constraint: the capture asks the cookie handler the same question the browser asks itself — which cookies would you send tohttps://open.spotify.com— instead of dumping the store, becausesp_dcfor the wrong host is not a session; the window clears only this host's cookies before it loads (java.net.CookieManageris shared with the YouTube window, whose session has nothing to do with this one), and the whole credential still never leaves the machine. The manual paste is not gone: it appears when no window can be created at all (no JavaFX, no display) with Inno's own "embedded sign-in window is not available" line, which is the only case where reading a cookie by hand is still the way in. - [DE] Dark mode for the setup, with the brand on it.
WizardStyle=modern dynamicfollows Windows' own light/dark setting — no question to answer, and no skin picker, for the same reason the language is a restart:WizardStyleis compile-time and the run-time side (IsDarkInstallMode) only reports. The dark wizard gets its own pair of brand bitmaps (logo_vmde_wizard_dark.bmp,logo_vmde_small_dark.bmpon the deep VIVI violet) instead of the light ones, so the white panel behind the mark does not sit on a dark page as a bright box. Both pairs are generated byscripts/generate_desktop_icons.py, and CI passes all four paths to the compiler.
Fixed
- [DE] The small wizard image was upside down.
logo_vmde_small.bmpis the mark drawn in the header of every page but the first, and its rows had been written bottom-up by the hand-made BMP rewrite that centred it — the file was a valid bitmap of an inverted logo, which is why the setup showed the mark standing on its head while the large one on the Welcome page was right. It is upright and centred on the 55x55 canvas the modern wizard wants. Verified: pixel-compared against the wizard's own logo region in the shipped 1.54.4 bitmap — mean absolute difference 3.6 as stored against 14.1 for the flipped rows, i.e. the file now matches what a correct wizard draws.
Changed
- [DE] The Spotify import wears Spotify's mark. The Settings row for it drew a generic library-music icon while the phone has always drawn the service's own logo, so the entry read as "some import" next to the app's other rows. The desktop now builds the same
ImageVectorfrom the APK's owndrawable/spotify.xmlpath data (same 50x50 viewport, tinted by the theme like every other icon), and the import screen wears it too — in its header and on the connect button.
Commits
- v6.0.8.5_DE-1.54.5-beta: the setup asks the language on its first screen, and Spotify signs in like the phone
This release was built automatically from commit 4037cc16edd61500647987cffecc1fd4df0b21e5.
Vivi Music 6.0.8.5_DE 1.54.4
Vivi Music 6.0.8.5_DE 1.54.4
Release channel: beta
[6.0.8.5_DE-1.54.4-beta] - 2026-09-29
Changed
- [DE] "Auto skip to next song when error occurs" says what the switch does instead of what it is good for. The row's description was the mobile app's own line — "Ensure your continuous playback experience" — a sentence about the benefit that names no behaviour, and which reads as filler in most languages because it was never about this switch: the Italian row promised "Garantisci la tua esperienza di riproduzione continua" under a setting that skips a track. Every language now states the behaviour ("Passa automaticamente alla canzone successiva in caso di errore" / "Automatically skip to the next song when a track fails to play"), rewritten through
scripts/desktop_extra_translations_91.py— all 52 of them, because the old sentence came from the shared Android resourceauto_skip_next_on_error_descand any language left out would have kept it. Constraint: the localization audit stays clean (0 missing keys, 0 leaking keys, 0 English left in a language map, 0 wrong-script values) and the two hand-tuned files (Localization_it.kt,Localization_sv.kt) keep their edits, which a regeneration of the tables now preserves for this key too.
Commits
- v6.0.8.5_DE-1.54.4-beta: the skip-on-error row says what it does
This release was built automatically from commit aa7672d8b7055cf8695e4fbad6cb4ad9c563c5bb.
Vivi Music 6.0.8.5_DE 1.54.3
Vivi Music 6.0.8.5_DE 1.54.3
Release channel: beta
[6.0.8.5_DE-1.54.3-beta] - 2026-09-29
Added
- [DE] Import from Spotify. Settings → Import from Spotify is the desktop port of the mobile screen: paste the
sp_dccookie (the credential Spotify's own web player uses, turned into a short-lived token with the TOTP the endpoint demands), pick the playlists you want — Liked Songs included — and every track is searched on YouTube Music and the best candidate bySpotifyMapper.matchScorebecomes a local playlist. The session lives only in~/.vivimusic/spotify.json; the screen restores and refreshes it when opened, so the app never talks to Spotify unless the user is there. Constraint: an import writes on this machine only — it goes straight toPlaylistStore.upsertunder a stableSPOT…id and deliberately not throughPlaylistSync, so importing can never create a playlist on the user's YouTube Music account (that stays the explicit, confirmed action in the Account screen). The stable id is also what makes a second import update the playlist instead of duplicating it, and it can never collide with the app's ownLP…rows or an account mirror (yt-…). Watch:spotify.lognames the outcome (library loaded: N playlist(s), M liked song(s), then'<name>': X of Y track(s) matched and written to the local playlist); a 401 renews the token from the stored cookie once instead of failing, so "Token expired" in that file means the cookie itself is gone. - [DE] The Windows setup speaks every language the program does, and shows VIVI Music DE while doing it. The installer declared one language (English) and never pointed at the brand artwork, so Inno Setup drew its own wizard images and the setup advertised Inno Setup instead of this app.
WizardImageFile/WizardSmallImageFilenow name the two bitmaps that were already sitting indesktop/icons(the small one corrected to the 55×55 the modern wizard wants, which also matches the generator), and[Languages]carries all 51 supported languages, English first and English the default (LanguageDetectionMethod=none, so the choice is never guessed from Windows and the Select Language page always appears). Inno Setup ships a full wizard translation for 29 of them, loaded fromcompiler:Languages; the other 21 still get their own name in that list (small[LangOptions]overlays ininstaller/windows/languages/) and their own wording for everything this installer authors — the task descriptions, the post-install run entry and the uninstall message come from Inno's own already-translated tables via{cm:…}, plus one[CustomMessages]entry. Constraint: where there is no wizard translation the chrome itself stays English by necessity; only the strings this project controls follow the selection. Also in the same pass: the setup writes a log in%TEMP%(SetupLogging), registers itself underApp PathssoVIVIMusicstarts from the Run dialog, carries the full-DEversion inAppVerName/ Programs & features / the file's version resource, and keeps a previous install's folder, shortcuts and language (UsePreviousAppDir/Tasks/Language). Verified: compiled with Inno Setup 7 (ISCC.exe, no warnings or errors, all 51 languages and both bitmaps loaded); the CI step now locatesISCC.exeby name instead of hardcodingInno Setup 6, so it keeps working when Chocolatey moves to the next major.
Commits
- v6.0.8.5_DE-1.54.3-beta: the installer only names the translations the compiler has
- v6.0.8.5_DE-1.54.3-beta: the Spotify import lands, and the Windows setup is ours
This release was built automatically from commit a4903f83b5f92347317c1e69fa450dc3a5424ac4.
Vivi Music 6.0.8.5_DE 1.54.2
Vivi Music 6.0.8.5_DE 1.54.2
Release channel: beta
[6.0.8.5_DE-1.54.2-beta] - 2026-09-28
Fixed
- [DE] "Sync OS volume" no longer switches itself back on. The native-volume switch is a per-device choice about this machine's own master volume, but it was also carried in the synced settings map in both directions — and the peer keeps pushing its stored value (default on, and it cannot be changed from the phone) while our own push is still in flight, so the local toggle lost the race and re-enabled itself a moment after being turned off. It is device-local now: the desktop neither sends it nor applies it, and the send/receive gates it controls are what actually stop the volume crossing — the peer's pushes are ignored and ours carry no
systemVolumeat all, so one side switching it off is enough. Constraint: the phone's own preference (syncNativeVolume, default on) is unchanged and still read by its push/apply gates, so a phone-side switch stays possible without ever being overwritten by the desktop.
Changed
- [DE] The row is called "Sync OS volume" and says so in all 52 languages. 1.54.0 borrowed the already-translated "Sync volume" (
lt_sync_volume, Listen Together's own label) because a new key meant 52 new translations for one row; sitting directly under "Sync VIVI volume" that read as a second app-volume sync instead of the operating system's. It has its own key now (sync_os_volume, supplied bydesktop_extra_translations_89.py) and each language renders "OS" with its own word for the operating system where one is in common use. Constraint: the localization audit stays clean (0 missing, 0 leaking, 0 English left, 0 wrong script). - [DE] Disconnect and Unpair are one action, not two buttons. Disconnect already drops the pairing (1.54.0: it tells the peer and clears the pair id), so showing Unpair next to a live link was the same action twice. Unpair now only appears when there is no link to disconnect — paired but offline, where Disconnect is not on screen — so exactly one leaving button is visible at a time. Constraint: the LAN mode keeps its own Stop LAN server button, which already takes the same path.
Commits
- v6.0.8.5_DE-1.54.2-beta: Sync OS volume stays off, and leaving is one button
This release was built automatically from commit 6a4ff40262d943a465086138aaad9ba083d60426.