Merge pull request #736 from lokal-music/release/v14.1.2
Changelog
Windows builds: free code signing provided by SignPath.io, certificate by SignPath Foundation (code signing policy).
FYI:
Lokal is 100% local; the library, history, anything in database, or any info that is used for API's such as yt-dlp, LRCLIB, is NOT seen by us.
What's Changed
-
feat(desktop): port LastWave playback and independently timed background lyrics (#735)
Details
Investigation: what actually made Mobile work
Supporting vocals: Mobile's working implementation reads FLAC VORBIS_COMMENT directly, preserving separately stored
[bg:]enhanced-LRC blocks, merges them with lead lyrics, and renders each backing singer on its own timeline beneath the currently focused lead. Desktop already parsed [bg:] when present in the same text field, but its metadata extraction could lose separately stored fields; its renderer also painted backing voices permanently under the lead row they were originally attached to.LastWave: Desktop already supports an optional per-add-on HMAC signing key, search and direct HTTP playback. What blocked many LastWave streams was assuming
manifest: 'dash'always means adaptive transport and handling only direct URL replies. Mobile handles LastWave's protocol defaults, nestedstreampayloads, actual static MPD audio and per-trackhybrid-v1byte range/CENC plans.Ported behavior
Supporting vocals
- Add bounded, metadata-only FLAC Vorbis comments reader (
electron/lyrics/flacVorbis.js), merging independent [bg:] fields into the lead's source without duplicating backing events. - Use the reader for the actual local-lyrics provider, even when
music-metadataflattens or omits those fields. Preserve sidecar and private Lokal lyric priority; merge vocals onto those timelines rather than replacing precise lead timings. - Mark older cached FLAC lyrics for one new supporting-vocal rescan.
- Animate the background singer under the currently focused row of
LyricsPanelwith an independently timed selector; preserve per-word karaoke timing and smooth opacity/height motion. This same component is used in the fullscreen and side lyrics views.
LastWave
- Keep existing per-addon HMAC signing. Search, manifest, stream and download request headers stay scoped to the configured add-on, not every add-on.
- Support nested
data/streamreplies, optional direct FLAC URLs even with defaultformat/manifest: dash, and single retry on HTTP 502/503 stream minting. - Parse bounded, unencrypted static audio MPDs with
SegmentTemplateandSegmentTimeline, fetch declared media segments, stage a local seekable fMP4 file. - Stage hybrid-v1 CDN byte ranges and decrypt declared AES-CTR/CENC samples locally with Node crypto; validate host, offsets, sizes, scheme and content key; never forward keys to the React renderer or logs. Keep DRM/unknown protections rejected.
- The existing
electron/online/sources.jsfile-response path serves the resulting local media with HTTP Range support.
Regression / CI coverage
- FLAC Vorbis comment fixture with separately stored lead and 16-style [bg:] fields, actual bounded FLAC read and timed overlap across a lead change.
- Real HTTP-addon install/stream mock preserving default LastWave DASH labels with a progressive FLAC URL.
- Inline/base64/remote MPD recognition, static DASH staging and rejected dynamic/DRM/unsafe manifests.
- Clear hybrid range validation/assembly, encrypted hybrid sample fixture with AES-CTR/CENC decryption.
- New PR-triggered GitHub workflow runs these + the existing HTTP signing and enhanced-LRC tests and compiles the React/Vite lyrics view.
Scope and verification
Playback transport is implemented for direct, supported static-DASH and supported hybrid-v1 renditions. The existing Save to library downloader currently requests a direct URL and has not yet been adapted to take staged MPD/hybrid files; leave download capability unclaimed until that flow is implemented.
GitHub Actions tests were added but have not been claimed as passing until workflow results arrive. Runtime playback/visual verification on desktop is still necessary, particularly real-world LastWave CENC variants.
Summary by CodeRabbit
- New Features
- Lyrics can now include backing vocals embedded in FLAC files, alongside sidecar and online lyrics.
- Timed backing vocals follow playback and remain visible across lead-vocal transitions.
- LastWave playback now supports eligible DASH and hybrid audio streams.
- Improvements
- Backing vocals are merged without duplicating existing lines or replacing online lead-lyric timing.
- Embedded lyric selection retains available translations, and FLAC lyrics remain available when other metadata cannot be loaded.
- Staged playback media is cleaned up after playback becomes idle.
- Add bounded, metadata-only FLAC Vorbis comments reader (
Contributors: @CHEYCKIT
Full Changelog: v14.1.1...v14.1.2
Setup
See README.md for full setup instructions.
macOS: this build is ad-hoc signed, not notarized (no Developer ID certificate is configured). The first time, right-click Lokal in Applications and choose Open, or run xattr -dr com.apple.quarantine /Applications/Lokal.app.
Binary Checksums (SHA-256)
Lokal-14.1.2-arm64-mac.zip:
[FB355E29501A77911E9D745647B098D30DBEB968B7CDB52EDC046A0AB63E5A18]
Lokal-14.1.2-arm64-mac.zip.blockmap:[F283D524867C1AECBF04AE0DD0AA05706CD8DB2E7F26D4414BE3F4C02D3A6A17]
Lokal-14.1.2-arm64.AppImage:[BEF04F3ED93915BC88CC060C29C23EF7D377E47BDBAAE3BC7249D71C96D4C80B]
Lokal-14.1.2-arm64.dmg:[A2D3C740CBED1624E4295355C67F759BCFE4ACF6C2E21E58FB5AAED53B48051A]
Lokal-14.1.2-arm64.dmg.blockmap:[6C5B647E134D0E05D96689AF8FA9A51269A090F5F0C4F8AC681A3619E41B2B37]
Lokal-14.1.2-mac.zip:[6D29F5918DC35C7D60B089991545B11B2A84B2D0832CE266FDDD1D60FA6FB676]
Lokal-14.1.2-mac.zip.blockmap:[E0FED62A730737E8C38D1B89CFA2A8F91EE12792D70A00E2423882129898E5AE]
Lokal-14.1.2.AppImage:[17F10A62DF7725E15A1EB24DB37B4801E1816EE87B439A381BB8444A239B122D]
Lokal-14.1.2.dmg:[AF2E14AD80085D8153C075D564CB68FB670FF04A818A7E988A4DD066399A1773]
Lokal-14.1.2.dmg.blockmap:[45AE1BFC99D4209D1EE55EF06B5F1A24C202E309710789AF5395C8627351818B]
Lokal-14.1.2.exe:[D243F6144CBF92596FBA96BC1FD1CB5FDA92CC5AF3A39C58157E0DB9D83CB09E]
Lokal-Setup-14.1.2.exe:[77E69A743978BA3AAFA2F14E8DF33B3F214EC94CD0CDB0B58E2F406DB0C543A7]
Lokal-Setup-14.1.2.exe.blockmap:[7584FAA72C5652FCBE9EB08D1CF9F33BEF9FCCBD8CB34E45DBE60D7E2FD22C94]
builder-debug.yml:[0CF258D71A1CB72B8F3C1D03A2505E1209D20D2FECEBDEF7302800F5FCAEC0B5]
latest-linux-arm64.yml:[E29E00F8A3A591E75034815F55A61F792C201BA56A4A2421196CD94DA27EF008]
latest-linux.yml:[4D0EE14F0284B4FAB611708D2F137DBF3C8DA7C2E36ED0EBA8736986EC576FDD]
latest-mac.yml:[2CC374A73D111B49F271245E030595360494B375EF4867C70E04D18A7CABC1CA]
latest.yml:[9DA1DAA74AFE0FA709BC1FB40FFAF11266B7B28D20B9BA61BF44CDD68133B80F]
lokal-music_14.1.2_amd64.deb:[687261CFD936B5D758855707C24C3F11E59B4049608EB58E833553980277A1BF]
lokal-music_14.1.2_arm64.deb:[AC09ECA36C12587EA709BD9DDECDD8E34FAD0F80390731FDFAF00C98FE1FA08D]
