Repository navigation
Releases
Lavender v0.1.1
💜 If you enjoy Lavender, a star on this repo goes a long way, and if you'd like to help me afford to keep developing it, consider donating.
✨ Added
- 📂 Removing a library folder keeps its scan: add the folder back and its tracks return with their lyrics and lookup history without reading every file's tags again, and only files that changed in the meantime are rescanned. The folder chooser lists these saved scans with their track counts, with a button to add one back or forget it.
- 🍺 Macs can install and update Lavender with Homebrew:
brew install --cask iamprivacy/lavender/lavender.
🐛 Fixed
- 🎤 Lyrics stay with their song after a full rescan, or after music is removed and other music added; before, a new track could show the lyrics of a removed one.
- 🐛 Switching to a different library folder and refreshing no longer fails with a long error full of question marks when the old folder held many tracks.
🔐 Verify
| Asset | SHA-256 |
|---|---|
Lavender-0.1.1-1.x86_64.rpm |
cb6e10d1733e452283d04455d0a419cb0c9144feb4f18a68602be329bf71ada1 |
Lavender-0.1.1-1.x86_64.rpm.sig |
524dfe06d12543ccda09e6a570e32de3ac4f593194e1939cc4d4b9e4a423ce88 |
Lavender_0.1.1.flatpak |
1c4cfb635030fe01d91a1e16bbe225d97b3512f9f27b26b48782b7a42916e58b |
Lavender_0.1.1_aarch64.dmg |
f05631f198d583da2c806a077e3a4e3dd6a1e637c0f45d5ebd65c49c79ba8825 |
Lavender_0.1.1_amd64.AppImage |
072e7d74631c8417799ca0ad9da2f4c29c13e15d0c404fa1b5ff10cf5eaf8afd |
Lavender_0.1.1_amd64.AppImage.sig |
ee7351285fbd5641b1b72c805e6522c5cab147383c2bb7b0a2d3ef28481702ed |
Lavender_0.1.1_amd64.deb |
82971353b15725a3e1ac767ddab6f2ec225a25cb70dc75a68232b4b659f206d8 |
Lavender_0.1.1_amd64.deb.sig |
95aa6ad4f97e901e71756d1f022c968f44a5eb8995c6f5c69e8126c98d7b97c9 |
Lavender_0.1.1_x64-setup.exe |
60e0a52cdd8c09471dbe7322d8f8d905ecc6654f31a5e4d01b7991f2a328f7e3 |
Lavender_0.1.1_x64-setup.exe.sig |
0056c2eaad3e5a4a5895da75e93dbed371b0e3701ab0c0828718028814d49c55 |
Lavender_0.1.1_x64.dmg |
11494d51014206de402b7cec293f0b8415424db33b8eaa152ce1b0bfcbd63c7e |
Lavender_0.1.1_x64_en-US.msi |
9e4b7bd14c28b790c645a67cd3f8d289d50a68f26dab4fe529d14f68b64fa1a6 |
Lavender_0.1.1_x64_en-US.msi.sig |
35f7a16ad003c6198e53755e380d6dc3d6f6dae0111223a4f5eb8a84d2f95805 |
Lavender_aarch64.app.tar.gz |
4226bf9eadf387a79a6fa124dd37a2a502fc200acc386b0b84528354582e6bc9 |
Lavender_aarch64.app.tar.gz.sig |
019b14e48ed5f558881858ef7d3489b0704deae723e58557d527b4c8cff2a03d |
Lavender_x64.app.tar.gz |
ecb9f195a3824f6847c28ed1e6e12d63abf12897f200d8679e8aa5c769f986cf |
Lavender_x64.app.tar.gz.sig |
37733ffc56d051051f1495f9a06698dc944b2462a4161dae924fd420da05d8a7 |
latest.json |
c2cd7dc0652cad17ad1ca0034b53a56eef74b5eb545dd340ceec8dfe003f63fa |
SHA256SUMS lists these hashes, and SHA256SUMS.sig is a minisign signature over it, made with the Lavender release key. The app installs an update only after this signature and the hash of the download both match. The public key, also compiled into every build:
RWQxlZAQAK7g5fERs9rsa+Y9qgWcaY5kBoCrB8wttQwI0wp6bUvOediI
To check a download yourself (base64 -D on older macOS):
base64 -d SHA256SUMS.sig > SHA256SUMS.minisig
minisign -Vm SHA256SUMS -x SHA256SUMS.minisig -P RWQxlZAQAK7g5fERs9rsa+Y9qgWcaY5kBoCrB8wttQwI0wp6bUvOediI
shasum -a 256 --ignore-missing -c SHA256SUMSLavender v0.1.0
💜 If you enjoy Lavender, a star on this repo goes a long way, and if you'd like to help me afford to keep developing it, consider donating.
First Lavender release, based on LRCGET 2.2.2. Everything LRCGET does is still here; with the lyrics source set to Online LRCLIB and the extra sources off, lyrics are looked up exactly as LRCGET looks them up.
✨ Added
- 💾 A Local database lyrics source: point Lavender at a copy of the LRCLIB database dump and mass downloads, the per-track lyrics search and My LRCLIB previews run against your own disk, following the LRCLIB server's own matching rules.
- 🔎 Local search uses the search index that ships inside the dump, with the best matches first; a dump without a usable index gets exact title searches and online keyword searches, and Lavender tells you so once.
- 🌐 If not found locally, try online LRCLIB (on by default) asks lrclib.net for the tracks the local database cannot answer; a missing database (an unplugged drive, say) is reported once and picked up again when it is back.
- 🗄️ A database card in Settings shows the file, its size, the number of tracks and lyrics, the dump date and whether a search index is available; the dump is opened read-only and never modified, so it can live on an external drive.
- ⬇️ Check for a newer dump reads LRCLIB's dump listing and downloads the archive over up to 8 connections with live speed and progress; a download can be stopped and resumed later from its partial file, even after closing the app, the finished file is checked against the expected size, and an update never deletes a file it did not download.
- 📦 The
.gzarchive is decompressed in the app with a progress bar (an archive you downloaded yourself works too), even with Settings closed, and your current database stays in use until the new one is downloaded, decompressed and checked. - 💽 A disk-space check before a download shows how much space the archive and the new database need and warns when the chosen folders do not have it.
- 🎯 Tolerant local matching (on by default) retries a miss while allowing for several artists joined with commas or "&", "(feat. ...)" credits on one side only, version tags such as "(Radio Edit)" or "- Live", explicit badges and the same recording filed under another album; an exact match with plain lyrics only gives way to a synced copy of the same performance filed under another album spelling. Each tolerant match says how it matched in the download log.
- 🧭 A content score decides among rows the metadata rules rank alike, before the length gap: sanity checks on the timed lines (no timing, too few lines, stamps past the end, stopping early, stacked duplicates, a credits line), then how many other uploads of the song agree with the timing, then word sync over line sync. The mass download, the Search Lyrics dialog and Upgrade all rank by it, a local exact match shared by several rows is picked the same way, and a live, acoustic or demo take never outranks a row of the recording the file holds.
- 🥇 The per-track Search Lyrics dialog puts the rows a mass download would accept first, in the download's own order (artist, album, synced over plain, content, closest length), and marks the first one "Best match"; local mode only, the rest of the list stays as it was.
- ⏭️ Skip tracks already not found in this database leaves out the tracks the current dump could not answer on the next mass download; a track counts again after a retag, a newer dump or more lookup options, online misses are asked again after 14 days. The download dialog shows how many tracks were left out.
- ⬆️ A fourth "Download lyrics for" choice, Upgrade to the best match (local mode): plain lyrics get synced ones from the local database, then online LRCLIB and the extra sources you turned on (synced only); synced lyrics are replaced only by a row of the local database that ranks above the row they came from, and lyrics you edited or got elsewhere are kept (lyrics picked from this database in Search Lyrics can be replaced by a higher-ranked row); an
.lrcalready next to the music is never rewritten, and each kept track says why in the download log. - 🧠 An Upgrade run remembers each track it looked at and kept (with the files it wrote), so the next Upgrade run leaves it out, the way misses are already left out; the track is looked at again when its lyrics, tags, the database, the lookup settings or the export selection change. The popup's checkbox and the settings page count these next to the remembered misses, and Clear empties both.
- 🎹 Mark titles tagged (Instrumental) as instrumental (on by default, local only): a track whose title ends in "(Instrumental)", "[Instrumental Version]" or "- Instrumental", behind an explicit or clean badge too, is marked instrumental without taking lyrics text from the local database, since a dump row with words for an instrumental is a wrong upload.
- 🔞 A "Lyrics edition" setting on the Lyrics source page: uncensored lyrics unless the file's title or album says Clean (the default), always uncensored, or always clean. The local database and the extra sources rank the other edition last, by a "(Clean)" or "[Explicit]" badge, Apple Music's own rating, or words masked with asterisks ("b***h"), and an extra source asks its next candidates when the first answer masks words; Upgrade replaces stored lyrics with masked words by an uncensored text, whoever wrote them. Online LRCLIB answers are passed on as they come.
- 🎵 Optional extra lyrics sources: when LRCLIB has nothing for a track, Lavender can ask the AMLL TTML database, Apple Music, NetEase Cloud Music and QQ Music, in that order, in local and online mode alike (all off by default, held to the same title, length and artist rules); credit lines are dropped and a duet's singer marks are kept. Publishing and flagging always go to LRCLIB.
- 🍎 Apple Music uses your own subscription: you sign in with Apple in a private window inside Lavender, and Lavender keeps only the sign-in token. The API is unofficial and using it is against Apple Music's terms, as the settings page says.
- 🔤 Word-synced lyrics from the AMLL database, Apple Music and NetEase keep a timestamp per word, so the player highlights each word as it is sung, and
.lrcexport can carry the word timestamps (enhanced LRC) when you turn it on. - 🗃️ A mass download is kept by Lavender itself, not by the page: its queue, counts and log survive a reload of the window and a restart of the app. A run the app was closed on (or crashed on) is shown again as "Download interrupted" with how many tracks are done, and Resume continues with the rest; Discard forgets it.
- ⏸️ The download dialog has Pause and Resume, and the library header shows a paused run; a paused run is kept until it is resumed or discarded, even across a restart.
- 📶 When the lyrics source cannot be reached (the connection dropped, the local database's drive went away), the download waits and tries the same track again, with growing pauses up to a minute, instead of logging every remaining track as not found. The dialog says what it is waiting for.
- 🔁 A finished run with tracks not found offers "Retry not found", which queues those tracks again.
- 💡 With "Automatically export lyrics" off, the download popup says that lyrics stay in Lavender until they are exported, since other music players only see lyrics saved as files next to the music.
- 🌸 A start-up screen shows the Lavender name over falling buds while the library opens.
- 🔄 An in-app update check (off until you turn it on) finds a new Lavender release and installs it only after the release's signed checksum list and the download's hash both match, and only the package that list names for your system.
- 💜 A lavender colour palette, a songbook-and-sprig icon and an app identifier of its own, so Lavender installs side by side with LRCGET with its own settings and library.
- 🔐 Every release ships a
SHA256SUMSfile to verify each download.
🔧 Changed
- ✂️ The settings dialog is titled Settings, like the menu entry that opens it, and says things in few, plain words; what each option sends where is still spelled out.
- 📏 Buttons keep their label on one line, every settings button has the same height, and checkboxes no longer shrink beside a long label.
- ℹ️ The About window shows Lavender's own home page, contact and Buy Me a Coffee button, and credits LRCGET as the app Lavender is built on.
🐛 Fixed
- 🧯 A mass download no longer loses its progress when the window shows the "try again" page of the browser engine and reloads: the run goes on in the background meanwhile and the dialog picks it up again.
- 📋 The download log no longer repeats or mixes up rows when two tracks share the same title and artist.
🔐 Verify
| Asset | SHA-256 |
|---|---|
Lavender-0.1.0-1.x86_64.rpm |
d9f3a8505fa9941ec24e23ec0abb35e201bd4581db196668bead625aaab052e6 |
Lavender-0.1.0-1.x86_64.rpm.sig |
b1569aa4a9fbb9171f817aa2ab9cb870a96c1f37b4543e50781faca42949c2e1 |
Lavender_0.1.0.flatpak |
2159c3149413cfec7bea279f2eeb9f831a8210d80a8bd1fce605d8ab21295299 |
Lavender_0.1.0_aarch64.dmg |
1dad9bb17161812c20fe3c3c31d8abf6b15a05bfed5dd7e68ca4cdcc17967264 |
Lavender_0.1.0_amd64.AppImage |
241c27132c92c3a1da12e9e7e24d401fcb15c4036ecb5b0a4efd0c622fcfa31d |
Lavender_0.1.0_amd64.AppImage.sig |
16ba01bf8939e114ba60a5b447529fbca0cb4133c4228e561424aa85d36321f7 |
Lavender_0.1.0_amd64.deb |
b719da14cf058da177b7632d26d6c658802a63dbdab73396f95d205afc6d1df9 |
Lavender_0.1.0_amd64.deb.sig |
38a6fad4167e9783a159263e824e3721365f6ee2e907b5b57cdca856f5de0198 |
Lavender_0.1.0_x64-setup.exe |
`983f1d8f6b72f28b59fdad2e9e... |