Add lyrics: paste, fetch, and read them while reviewing
Lyrics are suggested at submission and never imposed. The conversion worker makes one LRCLIB lookup with whatever metadata exists, and the waiting page has a Hae sanoitukset button that re-queries with whatever title and artist are currently typed — which is the case that matters, since our metadata comes from ID3 tags and YouTube uploaders. Neither path overwrites typed text. - lyrics text on both submissions and songs, copied across at publish. Nothing has launched, so the column goes into 001_init.sql rather than a migration - The lock does not cover lyrics: it freezes what the song claims to be, and nobody reviewed the lyrics. So the submitter can still fix them afterwards, or paste them for an old song a year later - The review strip gained a second pane: lyrics on the left, review on the right, so following the words costs no scrolling. No lyrics means no pane, not an empty one. Below 1024px the panes stack - LRC timestamps are stored but stripped for reading — they belong to the player, not the reader - The lyrics box is capped and scrolls inside itself, so a long song cannot stretch the strip past the screen Fixes a real bug found on the way: saveMetadata cleared any field the request did not carry, so publishing wiped the lyrics the worker had just fetched. Fields absent from a request now keep their stored value. The client identifies itself to LRCLIB as "levyraati" and nothing more. Tests cover cleanLyrics keeping line breaks, and fetchLyrics against a local server: synced beats plain, instrumentals and wrong-length takes are skipped, and a miss is empty with no error.
This commit is contained in:
@@ -191,3 +191,21 @@ says so.
|
||||
starting at 1, for the second attempt at a release. The string lives in a git tag and reaches
|
||||
the binary through `-ldflags`, so no file in the repo has to be bumped and a local build
|
||||
honestly reports `dev`. It surfaces in the footer, the startup log and `/healthz`.
|
||||
45. **Lyrics are suggested at submission, and stay editable forever.** Four decisions in one, taken
|
||||
2026-07-31 while scoping the feature in [later.md](./later.md):
|
||||
- **Suggested, never imposed.** The worker attempts one LRCLIB lookup after conversion, and the
|
||||
waiting page carries a *Hae sanoitukset* button that re-queries with whatever title and artist
|
||||
are currently typed. The button exists because our metadata comes from ID3 tags and YouTube
|
||||
uploaders, so the automatic attempt misses exactly the songs with messy names — and would look
|
||||
broken rather than absent. Neither path overwrites text the submitter has typed.
|
||||
- **Lyrics live on the submission, not just the song**, and are copied across at publish, because
|
||||
they are part of preparing a song rather than something bolted on afterwards.
|
||||
- **No migration 002.** Nothing has launched, so the column goes into `001_init.sql` and the
|
||||
database is recreated. The schema has no legacy to respect until there is data worth keeping.
|
||||
- **The lock does not cover lyrics.** It exists so the thing people reviewed stops changing under
|
||||
them, and nobody reviewed the lyrics — the rule is now *the lock freezes what the song claims
|
||||
to be; lyrics are an attachment to it.* This also allows pasting lyrics for an old song, which
|
||||
is when the feature is worth most.
|
||||
|
||||
The coverage assumption that shaped the earlier sketch was wrong and is corrected in `later.md`:
|
||||
LRCLIB has synced lyrics for a good share of Finnish rock, not almost none.
|
||||
|
||||
Reference in New Issue
Block a user