Skip to content

Changelog

Fahry-a edited this page Aug 3, 2026 · 1 revision

Changelog

Release notes per version. Extracted from the git history (commit messages).

Contributors: Slyfti (owner), DjErok, coolwindX, Fahry-a. Original release notes for versions before 0.0.0.20 are reconstructed from commit subjects/bodies and may not be exhaustive. Merge commits (PRs) are noted where relevant.

0.0.0.20 (unreleased)

The DLX translation provider, contributed by Fahry-a and merged in PR #13.

New: DLX translation provider

  • Third translation provider alongside Google Translate and Custom AI (BYOK).
  • DLX-compatible endpoints (formerly DeepLX): no API key required, self-hostable server proxying DeepL.
  • New provider panel with endpoint URL, translation mode, and Test Connection.
  • Batch mode by default — the whole lyric sheet goes out as one request per song (DLX preserves newlines); a per-line mode is available as an option.
  • Language mapping from the extension's selector codes to DLX codes (uppercase ISO-639-1, regional variants, and aliases like Filipino→TL, Norwegian→NB, Kurdish→KMR).
  • No default endpoint is bundled — the user explicitly chooses the server. See the DLX Provider page for options, including a self-hosting guide.
  • Locale strings for all 11 locales.

Fixes

  • Popup setting changes (target language, etc.) now apply immediately — no more toggling the translate button. Root cause: tabs.query({url}) requires a host permission the extension doesn't have, so popup messages never reached the content script. Fixed via chrome.storage.onChanged + tab queries without URL filter + a translate() queue so requests arriving mid-pass are re-run instead of dropped.
  • Consistent DLX translations on synced lyrics — the observer no longer re-translates lines that Spotify re-renders for dynamic highlighting; cache misses are batched via a 200 ms debounce instead of translating per-line.
  • DLX batch requests serialized — the observer can't fire per-line requests while a batch is in flight; misses accumulate and flush in one follow-up batch.
  • DLX batch failures stop cleanly — an error marker is shown on the translate button instead of fanning out per-line requests that could produce inconsistent results.
  • Custom AI cache namespace — AI results are cached under customAI (not google), and the observer reads ['customAI', 'google'], so re-rendered lines keep the AI translation; the AI render loop no longer reads a raw cache key.
  • DLX & Custom AI endpoints only apply after host permission granted — settings are saved before the permission prompt (which can close the popup), the prompt is requested before await (user-gesture requirement), and settings propagate only on success; a successful Test Connection also pushes settings to open tabs.

Refactors

  • Provider capability registry (scripts/providers.js) — providers are described once and routed through a single TRANSLATE { provider, lines } background message; adding a provider is now registry + background map + panel markup.
  • Single stable-anchor observer for the translate button (#main-view) — the button survives Spotify re-renders (ad-skip case), idempotent re-injection, click delegation, song-change dedupe.
  • Misconfigured providers fall back to Google with a visible error marker (previously silent).
  • DLX popup panel styled to match the Custom AI panel.
  • http://*/* added to optional host permissions for localhost endpoints.
  • 17 commits squashed/reorganized into a clean per-feature history; comments simplified.

Known issues

  • zh-CN and zh-TW both map to ZH in DLX (the DLX API doesn't distinguish simplified/traditional Chinese).

0.0.0.19 — Experimental BYOK AI endpoint

The Custom AI (BYOK) provider was contributed by coolwindX, then hardened by Slyfti.

  • Custom AI (BYOK) translation provider — an OpenAI-compatible endpoint with your own API key and model, for higher-quality whole-song translations. (Docs)
  • AI settings panel in the popup: endpoint URL, API key, model name, Thinking Mode toggle (default on; disabling makes it faster).
  • Instant preview (AI failover) toggle — Google-translates the lyrics instantly while the AI batch loads, then swaps in the AI result (default on).
  • Red "!" error indicator on the translate button when the AI endpoint errors.
  • Cache controls in the popup: clear current song / all cache / extension storage, each with two-step click confirmation.
  • Default target language set to the browser language (Chromium + Firefox), with English as fallback.
  • Loading indicator (3 dots) on the translate button + AI gradient styling.
  • Dedup of concurrent identical translation requests (repeated lines).
  • Hardening fixes (by Slyfti): think-mode compare bug, line-count mismatch error (instead of misaligned rendering), synchronous re-entrancy guard for overlapping calls, song identity anchored on resolved title, and host permission scoped to optional, requested at runtime.

0.0.0.18 — Firefox compatibility restored

  • Manifest changes to restore Firefox compatibility.
  • Attempted fix for the Chinese locale default (zh_CN variant).

0.0.0.16 — Translation fixed on current Spotify UI

Contributed by DjErok via PR #9, plus a small Slyfti fix.

  • Fix translation on the current Spotify UI (works on Opera GX).
    • Fixed the lyrics-button gating in translate() — it checked aria-pressed (which doesn't exist) instead of data-active; this was the main reason translation never ran.
    • Normalized the destination language: navigator.language returns e.g. en-US, which Google Translate rejects; strip to a short code on first install and normalize again in background.js for already-stored bad values.
    • Surfaced the real failure reason in background.js instead of a generic "All endpoints failed".
    • Fixed a popup race: settings handlers now await storage writes before broadcasting, so re-translates pick up the new value.
    • Scoped popup messaging to https://open.spotify.com/* and swallowed rejections (no more "Receiving end does not exist" on other tabs).
    • Skip untranslatable lines (pure punctuation, music symbols, blanks).
    • Added an isExtensionAlive() guard so orphaned content scripts bail silently after an extension reload instead of throwing "Extension context invalidated".
    • Consolidated duplicated replaceLyricSync/replaceLyricAsync into one replaceLyric; removed dead code.
    • Fixed the lyricsMode popup handler that was assigning a Promise to the slider value.

0.0.0.15 — CORS fix

  • Translations now go through the background script instead of the content script, which skips CORS issues (merged via PR #8).

0.0.0.14 — Locale expansion & load rework

  • UI translations added for Japanese, Korean, and Chinese (zh-CN).
  • Fixed the zh_CN vs zh-CN locale naming.
  • Rework: the extension now loads fully after Spotify's UI initializes (no more race conditions with Spotify's re-renders).
  • The focused-lyric class no longer depends on the Spotify class name (future-proofing).
  • Merged via PR #6 ("2026 january fix").

0.0.0.13 — Lyric stutter fix

  • Fixed lyric stutter caused by Spotify's UI override (mutation observer re-applies translated lyrics).

0.0.0.12 — Mutation observer

  • Added a mutation observer to mitigate Spotify's UI override.

0.0.0.11 — Spotify UI hotfix

  • Partial fixes for Spotify changing its lyricsWrapper attribute name and the focusLyrics class (2025-11-12).

0.0.0.10 — QoL batch

  • UI localization toggled: Indonesian, Portuguese, Turkish added (en/es/fr earlier).
  • Focus active lyric when toggling translation.
  • Fixed a typo in the Portuguese (BR & PT) translation.

0.0.0.9 — Localization

  • Extension localization for English, Spanish, French (togglable).
  • Translation button synced into the popup (toggle there matches the page).
  • Merged via PR #1.

0.0.0.8 — Small fixes

  • Fixed translate-button styling (background color).
  • Added a GitHub link to the popup.

0.0.0.7 — Language search

  • Better language search via Select2 (searchable dropdown, ~120 languages).

0.0.0.6 — Language selector default

  • Default value for the language selector.
  • !important fix for CSS variables.
  • Translate-button appearance fix.

0.0.0.5 — Icons & defaults

  • Added default settings for the translation button and language.
  • Moved images to a separate branch; re-added icons.

0.0.0.4 — Polish

  • Smaller popup/option page.
  • Translated lyric brighter when focused.
  • Appear animation for translated lyrics (tweaked).
  • Fixed: now checks the lyrics button state after loading.

0.0.0.3 — Options page

  • Popup HTML/JS refactor for readability.
  • Language selector default + CSS variable !important fixes.

0.0.0.2 — Firefox support

  • Added browser-specific settings for Firefox in the manifest.
  • Firefox strict minimum version set to 109.0.
  • First draft of replace/restore lyrics + translate button.
  • Resizable translated lyrics + lyrics-mode toggle + settings persisted between sessions.

0.0.0.1 — Initial release

  • Draft of the main functions.
  • First version of replace/restore lyrics and the translate button.
  • Code split, new logo, target-language selector in the popup, popup→content message passing, line-by-line async translation, resizable lyrics, replace mode, settings persistence.