Files
jarri-spooty/CHANGELOG.md
T

212 lines
5.7 KiB
Markdown

# Changelog
All notable changes to Jarri Spooty are documented here.
This project follows a practical chronological changelog rather than autogenerated dependency noise.
---
# Unreleased
## Added
- Added Workspace tabs for Intake, Archive, and Diagnostics.
- Added per-tab frontend layout persistence with migration from the old single workspace layout into Intake.
- Added reset current tab and reset all tabs controls.
- Added Candidate Inspector Back/Clear selection action.
- Added Candidate Inspector selected candidate and honest alternative-state messaging.
- Added Archive Browser file-browser view with file icons, root summary, file count, total size, search, sort, and top-level folder grouping.
## Changed
- Kept Archive Browser read-only; no arbitrary browsing, delete, move, rename, or open-file operations were added.
---
# 3.0.0
## Added
- Added ChronoGit-style draggable/resizable Workspace UI panels.
- Added Workspace localStorage persistence and reset layout control.
- Added Source Intake Archive destination field persisted in frontend localStorage.
- Added truthful Source Intake runtime messaging for `DOWNLOADS_PATH` and pending per-run destination routing.
- Added Archive Browser MVP with a refreshable file list.
- Added scoped read-only `GET /api/archive` listing for files inside the configured downloads root.
- Added Candidate Inspector MVP for selected track details.
- Added selected-track behavior in track rows.
- Added rejected YouTube candidate display when rejected URLs are available.
## Changed
- Bumped visible, root, backend, frontend, and lockfile package versions to 3.0.0.
- Kept existing playlist, track, retry, delete, Spotify OAuth, queue, download, and yt-dlp behavior intact.
## Pending
- Per-run archive destination routing is still pending backend support.
- Candidate scoring history is not exposed yet; the inspector shows current stored track state and rejected URLs.
---
# 2.4.2 Hardened Workspace Foundation
## Added
### Spotify
- Added Spotify OAuth login flow
- Added `/api/spotify/login`
- Added `/api/spotify/callback`
- Added `/api/spotify/status`
- Added persistent Spotify user token storage
- Added authenticated Spotify playlist retrieval
- Added OAuth frontend bootstrap flow
- Added support for playlists exceeding 300 tracks
- Added deterministic playlist pagination handling
### YouTube
- Added deterministic YouTube candidate scoring
- Added duration-aware YouTube matching
- Added failed-candidate rejection memory
- Added automatic retry/fallback handling
- Added explicit YouTube candidate exclusion support
- Added detailed YouTube candidate debug logging
- Added explicit yt-dlp CLI execution
- Added deterministic yt-dlp stderr capture
- Added age-gated video detection
- Added invalid-format detection
- Added Docker-compatible cookie handling
- Added temporary cookie-copy isolation
- Added retry-aware queue coordination
### Queue Hardening
- Added configurable YouTube search pacing
- Added configurable YouTube download pacing
- Added sequential queue coordination
- Added retry collision prevention
- Added deterministic queue replacement handling
- Added explicit retry-state transitions
- Reduced aggressive request bursts toward YouTube
### Docker
- Added persistent SQLite bind-mount recommendations
- Added persistent runtime config recommendations
- Added yt-dlp installation to runtime container
- Improved Docker runtime observability
- Improved hardened Docker startup flow
- Improved deployment documentation
### Security
- Added token-based frontend access mode
- Added external secret handling recommendations
- Added isolated Spotify credential storage
- Added safer cookie handling flow
- Improved Docker secret isolation documentation
- Removed unused downloader dependencies to reduce transitive attack surface
- Hardened download filename sanitization
- Hardened remote cover-art fetching with protocol, MIME, timeout, and size checks
- Added yt-dlp subprocess timeout and single-settlement handling
- Shaped track websocket payloads to avoid leaking internal entity fields
- Normalized visible project naming to Jarri Spooty
### Frontend
- Added Spotify login integration
- Added auth token bootstrap from URL
- Improved playlist rendering behavior
- Improved large playlist progress tracking
## Improved
- Improved YouTube throttling resistance
- Improved age-gated video recovery behavior
- Improved operational observability
- Improved cover-art embedding resilience
- Improved queue stability during large playlist imports
- Improved deterministic runtime behavior
- Improved Docker persistence handling
## Fixed
- Fixed Spotify playlist truncation at 100 tracks
- Fixed incomplete playlist retrieval behavior
- Fixed repeated retry loops against failed YouTube videos
- Fixed queue deadlocks during retries
- Fixed retry-button queue collisions
- Fixed container database loss on restart
- Fixed yt-dlp wrapper opacity issues
- Fixed hidden yt-dlp stderr failures
- Fixed multiple age-gated fallback failure paths
- Fixed invalid YouTube candidate reuse
- Fixed several Docker persistence edge cases
---
# 2.4.2 (Original Spooty Endpoint)
## Fixed
- Fixed Spotify playlist pagination using `data.next`
- Fixed incomplete playlist retrieval behavior
---
# 2.4.1
## Fixed
- Fixed Docker Node.js version compatibility
---
# 2.4.0
## Added
- Added configurable audio quality selection
## Fixed
- Fixed special character download issues
- Fixed EJS runtime issue
---
# 2.3.0
## Added
- Added individual track downloads
- Added cover art support
---
# 2.2.0
## Added
- Added Spotify API integration
- Added YouTube cookie support
- Added download timeout handling
---
# 2.0.0
## Added
- Introduced queue-based backend architecture
---
# 1.0.0
## Added
- Initial release