Release v1.3.0: Multi-source downloads, audio analyzer resilience, mobile improvements
Major Features: - Multi-source download system (Soulseek/Lidarr with fallback) - Configurable enrichment speed control (1-5x) - Mobile touch drag support for seek sliders - iOS PWA media controls (Control Center, Lock Screen) - Artist name alias resolution via Last.fm - Circuit breaker pattern for audio analysis Critical Fixes: - Audio analyzer stability (non-ASCII, BrokenProcessPool, OOM) - Discovery system race conditions and import failures - Radio decade categorization using originalYear - LastFM API response normalization - Mood bucket infinite loop prevention Security: - Bull Board admin authentication - Lidarr webhook signature verification - JWT token expiration and refresh - Encryption key validation on startup Closes #2, #6, #9, #13, #21, #26, #31, #34, #35, #37, #40, #43
This commit is contained in:
@@ -103,7 +103,7 @@ const AlbumsGrid = memo(function AlbumsGrid({
|
||||
return (
|
||||
<div
|
||||
data-tv-section="library-albums"
|
||||
className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7 gap-4"
|
||||
className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-8 gap-4"
|
||||
>
|
||||
{albums.map((album, index) => (
|
||||
<AlbumCardItem
|
||||
|
||||
@@ -64,7 +64,7 @@ const ArtistCardItem = memo(
|
||||
{/* Delete button - only visible on hover */}
|
||||
<button
|
||||
onClick={handleDelete}
|
||||
className="absolute top-2 right-2 w-7 h-7 rounded-full bg-black/60 flex items-center justify-center opacity-0 group-hover:opacity-100 hover:bg-red-600 transition-all z-10"
|
||||
className="absolute top-2 right-2 w-7 h-7 rounded-full bg-black/60 hidden md:flex items-center justify-center opacity-0 group-hover:opacity-100 hover:bg-red-600 transition-all z-10"
|
||||
title="Delete artist"
|
||||
>
|
||||
<Trash2 className="w-3.5 h-3.5 text-white" />
|
||||
@@ -104,7 +104,7 @@ const ArtistsGrid = memo(function ArtistsGrid({
|
||||
return (
|
||||
<div
|
||||
data-tv-section="library-artists"
|
||||
className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7 gap-4"
|
||||
className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-8 gap-4"
|
||||
>
|
||||
{artists.map((artist, index) => (
|
||||
<ArtistCardItem
|
||||
|
||||
@@ -94,7 +94,7 @@ const TrackRow = memo(function TrackRow({
|
||||
"text-sm font-medium truncate",
|
||||
isCurrentlyPlaying ? "text-[#ecb200]" : "text-white"
|
||||
)}>
|
||||
{track.title}
|
||||
{track.displayTitle ?? track.title}
|
||||
</h3>
|
||||
<p className="text-xs text-gray-400 truncate">
|
||||
{track.album?.artist?.name}
|
||||
|
||||
Reference in New Issue
Block a user