Album Length changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.3 (2026-06-13)
Section titled “1.0.3 (2026-06-13)”Bug Fixes
Section titled “Bug Fixes”- distinct color-coding palette and stacked duration placement (300e25f)
1.0.2 - 2026-05-16
Section titled “1.0.2 - 2026-05-16”- Duplicate album-length badges (
· 41m · 41m) could still appear during fast scroll despite the 1.0.1 row-position dedup. The exact race wasn’t pinned down — diagnostic logging showed the layered defenses never tripped once added — but the layered approach empirically stopped reproductions. Three layers added:- Proximity row dedup in
injectAll: rows are sorted bygetBoundingClientRect().topand any row within 4px of the previous is skipped, catching sub-pixel sibling overlay rows the strict-equality check in 1.0.1 missed. - Append-time visual-position guard in
appendInlineBadge: before appending, scans every existing badge in the document and bails if one already sits within 8px vertical / 240px horizontal of the target cell. - Post-injection janitor
sweepDuplicateBadges: runs 250ms after eachinjectAlland removes any badge whose visual position overlaps an earlier one — a final safety net if two injections race past the per-append guards.
- Proximity row dedup in
1.0.1 - 2026-05-03
Section titled “1.0.1 - 2026-05-03”- Duplicate album-length badges appearing during fast scrolling. Spotify renders sibling
.main-trackList-trackListRowelements at the same DOM level per visual track (a content row plus an interaction overlay);querySelectorAllfound both and injected a badge into each.injectAllnow deduplicates rows by vertical pixel position (getBoundingClientRect().top), skipping any row whose position was already processed. - Additional defensive layers added: in-flight
alPendingguard prevents concurrent async re-injections into the same link;document.containscheck abandons injections for elements detached by Spotify’s virtualizer mid-fetch; row-scoped badgequerySelectorinappendInlineBadgeas a last resort;window.__albumLengthActiveflag prevents re-execution if Spicetify injects the script more than once per session.
1.0.0 - 2026-04-25
Section titled “1.0.0 - 2026-04-25”- Inline album-length badge appended to the existing Album cell in tracklists (e.g.
Currents · 51m) - Per-surface toggles for Playlists, Liked Songs, and the Queue
- Format options:
Short(1h 23m),Colon(1:23:00),Long(1 hour 23 minutes), andAuto(hybrid) - Tooltip display mode as an alternative to the inline badge
- Auto-suppression of the badge on singles (when the track is the album)
- Indefinite caching of album durations in
Spicetify.LocalStorage(album lengths don’t change) - Settings modal accessible via the Spotify profile menu (“Album Length”)
- Manual cache clear from the settings modal
- GraphQL
getAlbumfallback when the legacy Cosmos endpoint (wg://album/v1/album-app/album/<id>/desktop) is unavailable on newer Spotify builds
Independent project. Not affiliated with or endorsed by Spotify or Spicetify.