-
Notifications
You must be signed in to change notification settings - Fork 7
Changelog
Fahry-a edited this page Aug 3, 2026
·
1 revision
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.
The DLX translation provider, contributed by Fahry-a and merged in PR #13.
- 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.
-
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 viachrome.storage.onChanged+ tab queries without URL filter + atranslate()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(notgoogle), 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.
-
Provider capability registry (
scripts/providers.js) — providers are described once and routed through a singleTRANSLATE { 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.
-
zh-CNandzh-TWboth map toZHin DLX (the DLX API doesn't distinguish simplified/traditional Chinese).
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.
- Manifest changes to restore Firefox compatibility.
- Attempted fix for the Chinese locale default (
zh_CNvariant).
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 checkedaria-pressed(which doesn't exist) instead ofdata-active; this was the main reason translation never ran. - Normalized the destination language:
navigator.languagereturns e.g.en-US, which Google Translate rejects; strip to a short code on first install and normalize again inbackground.jsfor already-stored bad values. - Surfaced the real failure reason in
background.jsinstead of a generic "All endpoints failed". - Fixed a popup race: settings handlers now
awaitstorage 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/replaceLyricAsyncinto onereplaceLyric; removed dead code. - Fixed the
lyricsModepopup handler that was assigning a Promise to the slider value.
- Fixed the lyrics-button gating in
- Translations now go through the background script instead of the content script, which skips CORS issues (merged via PR #8).
- UI translations added for Japanese, Korean, and Chinese (zh-CN).
- Fixed the
zh_CNvszh-CNlocale 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").
- Fixed lyric stutter caused by Spotify's UI override (mutation observer re-applies translated lyrics).
- Added a mutation observer to mitigate Spotify's UI override.
- Partial fixes for Spotify changing its
lyricsWrapperattribute name and thefocusLyricsclass (2025-11-12).
- 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.
- Extension localization for English, Spanish, French (togglable).
- Translation button synced into the popup (toggle there matches the page).
- Merged via PR #1.
- Fixed translate-button styling (background color).
- Added a GitHub link to the popup.
- Better language search via Select2 (searchable dropdown, ~120 languages).
- Default value for the language selector.
-
!importantfix for CSS variables. - Translate-button appearance fix.
- Added default settings for the translation button and language.
- Moved images to a separate branch; re-added icons.
- Smaller popup/option page.
- Translated lyric brighter when focused.
- Appear animation for translated lyrics (tweaked).
- Fixed: now checks the lyrics button state after loading.
- Popup HTML/JS refactor for readability.
- Language selector default + CSS variable
!importantfixes.
- Added browser-specific settings for Firefox in the manifest.
- Firefox strict minimum version set to 109.0.
- First draft of
replace/restorelyrics + translate button. - Resizable translated lyrics + lyrics-mode toggle + settings persisted between sessions.
- 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.