Skip to content

v2.3.0

Choose a tag to compare

@github-actions github-actions released this 21 Sep 23:11
· 75 commits to main since this release

Where lyrics come from now actually decides where lyrics come from.

Reported against Boompala by LE SSERAFIM: Musixmatch was answering even though it sat at the bottom of the list and three other sources had the song. The list was not reversed. It was barely being consulted — and for a lot of tracks, the thing it was being asked to compare was a claim that was not true.

The order was almost never reached

Quality was one number: the timing tier plus completeness plus a few bonus points. Your order only broke an exact tie between two totals, and the fourteen points underneath the tier almost always broke it first. A source at the bottom of the list won any time it happened to have a couple more lines than the others.

Worse, completeness was circular. The fullest answer set the yardstick every other answer was measured against — so a source returning padded or duplicated lines inflated the line count and then won the completeness it had just defined. Ranking it last did nothing at all.

Now the comparison is, in order: real word timings, then most of the song rather than a scrap of it, then your order, then completeness. Drag a source up in Settings → Where lyrics come from and it wins every song where two sources answer equally well.

"Word-timed" is now checked rather than believed

A source can claim word timings and not mean it, and the tier is the one thing your order is not allowed to overrule — so a false claim used to be unbeatable. Two ways it happens, both found by measuring 384 word-timed documents across four sources, most of them the same tracks answered by two or three of them:

A whole line arriving in one block. For Chinese and Japanese, Musixmatch routinely sends one fragment holding an entire line. It is line timing wearing a word-timed hat, and it looked like the best answer available:

Track Musixmatch NetEase Apple AMLL
咏春 45 "syllables" of ten characters each 467 — —
Lemon 47 — 273 520
你所到之處(就下雨) 33 228 208 —

18 of 135 Musixmatch documents were more than half made of such lines — against 0 of 80 from NetEase, 0 of 12 from AMLL and 1 of 157 from Apple. Those songs now go to the source that really does time the words: Apple Music takes Lemon, 紅 and Kaiju, AMLL takes 最炫民族风 where Apple was the coarse one.

Timings from a different recording. NetEase's Irony ran to 5:48 against a 2:24 track, with 74% of its syllables starting after the song had ended. A document whose timings mostly fall outside the song is no longer treated as the timed answer.

Either way the source drops one rank for that song only — so when it is the only source with the lyrics, you still get them.

Lyrics with no timings no longer pretend to have them

Apple serves unsynced lyrics as the same file format as synced ones, so every line came through stamped at 0:00 while the document still called itself line-synced. 14 of 339 Apple documents in the sample were this. The effect was the one that reads as broken rather than missing: a full transcription that outranked sources honestly admitting they had no timings, and then never advanced off the first line. These are now shown as what they are — unsynced lyrics, with the notice that says so.

Reordering reaches tracks you have already played

A source you enable and move to the top gets asked about tracks already in the cache. Its answer used to be judged by a score with no notion of your order, lose by a hair of completeness, and be recorded as asked — so it was never offered again. It is judged by your order now. An exactly equal answer still loses, deliberately: swapping the words on screen for no visible gain is worse than leaving them.

Smaller things

  • Look this track up again now says which source answered — "Lyrics from AMLL TTML DB" — instead of appearing to do nothing.
  • A few syllables running backwards is not treated as a broken document. Where it happens at all it is a handful out of hundreds, in documents that are otherwise the best answer available; the timings are clamped and the sweep carries on.

Download the APK below and open it; Android will ask you to allow installing from this source. Grant notification access on first run — that is how it sees what is playing.

Signed with the project release key; arm64-v8a, minSdk 29.