You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+46Lines changed: 46 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,52 @@ All notable changes to Lidify will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
+
## [1.4.1] - 2026-02-06
9
+
10
+
### Fixed
11
+
12
+
-**Doubled audio stream on next-track:** Fixed race condition where clicking next/previous played two streams simultaneously by making track-change cleanup synchronous and guarding the play/pause effect during loading
13
+
-**Soulseek download returns 400 (#101):** Frontend now sends parsed title to the download endpoint; backend derives artist/title from filename when not provided instead of rejecting the request
14
+
-**Admin password reset (#97):** Added `ADMIN_RESET_PASSWORD` environment variable support -- set it and restart to reset the admin password, then remove the variable
15
+
-**Retry failed audio analysis UI (#79):** Added "Retry Failed Analysis" button in Settings that resets permanently failed tracks back to pending for re-processing
16
+
-**Podcast auto-refresh (#81):** Podcasts now automatically refresh during the enrichment cycle (hourly), checking RSS feeds for new episodes without manual intervention
17
+
-**Compilation track matching (#70):** Added title-only fallback matching strategy for playlist reconciliation -- when album artist doesn't match (e.g. "Various Artists" compilations), tracks are matched by title with artist similarity scoring
18
+
-**Soulseek documentation (#27):** Expanded README with detailed Soulseek integration documentation covering setup, search, download workflow, and limitations
19
+
-**Admin route hardening:** Added `requireAdmin` middleware to onboarding config routes and stale job cleanup endpoint
-**Queue bugs:** Fixed cancelJob/refreshJobMatches not persisting state, clear button was no-op, reorder not restarting track, shuffle indices not updating on removeFromQueue
-**Discovery polling leak:** Fixed polling never stopping on batch failure
26
+
-**Timer leak:** Fixed withTimeout not clearing timer in enrichment worker
27
+
-**Audio play rejection:** Fixed unhandled promise rejection on audio.play()
28
+
-**Library tab validation:** Added tab parameter validation in library page
29
+
-**Onboarding state:** Separated success/error state in onboarding page
30
+
-**Audio analysis race condition (#79):** CLAP analyzer was clobbering Essentia's `analysisStatus` field, causing completed tracks to be reset and permanently failed after 3 cycles; both Python analyzers now check for existing embeddings before resetting
31
+
-**Enrichment completion check:**`isFullyComplete` now includes CLAP vibe embeddings, not just audio analysis
32
+
-**Enrichment UI resilience:** Added `keepPreviousData` and loading/error states to enrichment progress query so the settings block doesn't vanish on failed refetch
33
+
34
+
### Performance
35
+
36
+
-**Recommendation N+1 queries:** Eliminated N+1 queries in all 3 recommendation endpoints (60+ queries down to 3-5)
37
+
-**Idle worker pool shutdown:** Essentia analyzer shuts down its 8-worker process pool (~5.6 GB) after idle period, lazily restarts when work arrives
38
+
39
+
### Changed
40
+
41
+
-**Shared utility consolidation:** Replaced 10 inline `formatDuration` copies with shared `formatTime`/`formatDuration`, extracted `formatNumber` to shared utility, consolidated inline Fisher-Yates shuffle with shared `shuffleArray`
42
+
-**Player hook extraction:** Extracted shared `useMediaInfo` hook, eliminating ~120 lines of duplicated media info logic across MiniPlayer, FullPlayer, and OverlayPlayer
43
+
-**Preview hook consolidation:** Consolidated artist/album preview hooks into shared `useTrackPreview`
44
+
-**Redundant logging cleanup:** Removed console.error calls redundant with toast notifications or re-thrown errors
45
+
46
+
### Removed
47
+
48
+
- Dead player files: VibeOverlay, VibeGraph, VibeOverlayContainer, enhanced-vibe-test page
49
+
- Dead code: trackEnrichment.ts, discover/types/index.ts, unused artist barrel file
50
+
- Unused exports: `playTrack` from useLibraryActions, `useTrackDisplayData`/`TrackDisplayData` from useMetadataDisplay
51
+
- Unused `streamLimiter` middleware
52
+
- Deprecated `radiosByGenre` from browse API (Deezer radio requires account; internal library radio used instead)
Copy file name to clipboardExpand all lines: README.md
+26-3Lines changed: 26 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -515,16 +515,39 @@ Connect to your Audiobookshelf instance to browse and listen to audiobooks withi
515
515
516
516
### Soulseek
517
517
518
-
For finding rare tracks and one-offs that aren't available through traditional sources, Lidify has built-in Soulseek support.
518
+
Lidify includes built-in Soulseek support for finding rare tracks and one-offs that aren't available through traditional download sources like Lidarr.
519
+
520
+
[Soulseek](https://www.slsknet.org/) is a peer-to-peer file sharing network focused on music. Users share their music libraries and can browse/download from each other. Lidify connects directly to the Soulseek network -- no additional software (like slskd) is required.
519
521
520
522
**Setup:**
521
523
522
524
1. Go to Settings in Lidify
523
525
2. Navigate to the Soulseek section
524
-
3. Enter your Soulseek username and password
526
+
3. Enter your Soulseek username and password (create an account at [slsknet.org](https://www.slsknet.org/) if you don't have one)
525
527
4. Save your settings
526
528
527
-
Lidify connects directly to the Soulseek network - no additional software required.
529
+
**How Search Works:**
530
+
531
+
When you search for music in Lidify's Discovery tab, Soulseek results appear alongside Last.fm and Deezer results. Each result shows the filename, file size, bitrate, and format (FLAC/MP3). Metadata like artist and album is parsed from the file path structure (typically `Artist/Album/01 - Track.flac`).
532
+
533
+
**How Download Works:**
534
+
535
+
1. Click the download button on a Soulseek search result
536
+
2. Lidify searches the Soulseek network for the best match (preferring FLAC, high bitrate)
537
+
3. The file is downloaded directly to your music library path
538
+
4. A library scan is triggered to import the new file
You can also configure Soulseek as a download source for playlist imports. In Settings > Downloads, set Soulseek as primary or fallback source. When importing a Spotify/Deezer playlist, tracks not found in your library will be searched and downloaded from Soulseek automatically.
542
+
543
+
**Download progress** is visible in the Activity Panel (bell icon in the top bar).
544
+
545
+
**Limitations:**
546
+
547
+
- Download speed depends on the sharing user's connection and availability
548
+
- Not all tracks will have results -- Soulseek coverage varies by genre and popularity
549
+
- Some users may have slow connections or go offline during transfers
550
+
- Lidify retries with alternative users if a download fails or times out
0 commit comments