diff --git a/requirements.txt b/requirements.txt index db9629c..d3c468d 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ fastapi==0.116.1 uvicorn[standard]==0.35.0 celery==5.5.3 -deezspot-spotizerr==3.1.4 +deezspot-spotizerr==3.1.5 httpx==0.28.1 bcrypt==4.2.1 PyJWT==2.10.1 diff --git a/spotizerr-ui/src/routes/album.tsx b/spotizerr-ui/src/routes/album.tsx index c7de14f..a72d7dc 100644 --- a/spotizerr-ui/src/routes/album.tsx +++ b/spotizerr-ui/src/routes/album.tsx @@ -135,6 +135,16 @@ export const Album = () => { }; }, [loadMore]); + // Auto progressive loading regardless of scroll + useEffect(() => { + if (!album) return; + if (!hasMore || isLoadingMore) return; + const t = setTimeout(() => { + loadMore(); + }, 300); + return () => clearTimeout(t); + }, [album, hasMore, isLoadingMore, loadMore]); + const handleDownloadTrack = (track: LibrespotTrackType) => { if (!track.id) return; toast.info(`Adding ${track.name} to queue...`); diff --git a/spotizerr-ui/src/routes/artist.tsx b/spotizerr-ui/src/routes/artist.tsx index 0a4845e..0c5d496 100644 --- a/spotizerr-ui/src/routes/artist.tsx +++ b/spotizerr-ui/src/routes/artist.tsx @@ -303,6 +303,16 @@ export const Artist = () => { return () => observer.disconnect(); }, [fetchMoreAlbums, hasMore]); + // Auto progressive loading regardless of scroll + useEffect(() => { + if (!artist) return; + if (!hasMore || loading || loadingMore) return; + const t = setTimeout(() => { + fetchMoreAlbums(); + }, 350); + return () => clearTimeout(t); + }, [artist, hasMore, loading, loadingMore, fetchMoreAlbums]); + // --- existing handlers (unchanged) --- const handleDownloadTrack = (track: LibrespotTrackType) => { if (!track.id) return; diff --git a/spotizerr-ui/src/routes/playlist.tsx b/spotizerr-ui/src/routes/playlist.tsx index a8e850b..38f5f85 100644 --- a/spotizerr-ui/src/routes/playlist.tsx +++ b/spotizerr-ui/src/routes/playlist.tsx @@ -153,6 +153,16 @@ export const Playlist = () => { } }, [playlistMetadata, items.length, totalTracks, loadMoreTracks]); + // Auto progressive loading regardless of scroll + useEffect(() => { + if (!playlistMetadata) return; + if (!hasMoreTracks || loadingTracks) return; + const t = setTimeout(() => { + loadMoreTracks(); + }, 300); + return () => clearTimeout(t); + }, [playlistMetadata, hasMoreTracks, loadingTracks, loadMoreTracks]); + const handleDownloadTrack = (track: LibrespotTrackType) => { if (!track?.id) return; addItem({ spotifyId: track.id, type: "track", name: track.name }); @@ -227,11 +237,40 @@ export const Playlist = () => { {/* Playlist Header - Mobile Optimized */}
+ )}
+