diff --git a/src/components/BecauseYouLikeRail.tsx b/src/components/BecauseYouLikeRail.tsx index c4ab94ca..93031729 100644 --- a/src/components/BecauseYouLikeRail.tsx +++ b/src/components/BecauseYouLikeRail.tsx @@ -3,7 +3,7 @@ import { filterAlbumsToActiveLibrary } from '@/lib/api/subsonicLibrary'; import { resolveAlbum, resolveMediaServerId } from '@/features/offline'; import type { SubsonicAlbum } from '@/lib/api/subsonicTypes'; import { songToTrack } from '@/features/playback/utils/playback/songToTrack'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import React, { memo, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; diff --git a/src/features/album/hooks/useAlbumBrowseData.ts b/src/features/album/hooks/useAlbumBrowseData.ts index 1f05b34e..1b137b54 100644 --- a/src/features/album/hooks/useAlbumBrowseData.ts +++ b/src/features/album/hooks/useAlbumBrowseData.ts @@ -35,7 +35,7 @@ import { useOfflineBrowseReloadToken } from '@/features/offline'; import { fetchAlbumBrowseCatalogChunk, mergeAlbumCatalogChunk, -} from '@/utils/library/albumBrowseCatalogChunk'; +} from '@/features/album/utils/albumBrowseCatalogChunk'; import { useOfflineBrowseContext } from '@/features/offline'; import { useClientSliceInfiniteScroll } from '@/hooks/useClientSliceInfiniteScroll'; import { useDebouncedValue } from '@/lib/hooks/useDebouncedValue'; diff --git a/src/features/album/pages/AlbumDetail.tsx b/src/features/album/pages/AlbumDetail.tsx index f5bffb8e..4c73a115 100644 --- a/src/features/album/pages/AlbumDetail.tsx +++ b/src/features/album/pages/AlbumDetail.tsx @@ -5,7 +5,7 @@ import { getAlbumForServer } from '@/lib/api/subsonicLibrary'; import { getArtistInfo } from '@/lib/api/subsonicArtists'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import { songToTrack } from '@/features/playback/utils/playback/songToTrack'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import React, { useEffect, useState, useCallback, useMemo } from 'react'; import { useParams, useSearchParams } from 'react-router-dom'; import { invoke } from '@tauri-apps/api/core'; diff --git a/src/features/album/pages/RandomAlbums.tsx b/src/features/album/pages/RandomAlbums.tsx index 7b14c430..98940a3a 100644 --- a/src/features/album/pages/RandomAlbums.tsx +++ b/src/features/album/pages/RandomAlbums.tsx @@ -4,7 +4,7 @@ import { getAlbumList } from '@/lib/api/subsonicLibrary'; import { resolveAlbum } from '@/features/offline'; import type { SubsonicAlbum } from '@/lib/api/subsonicTypes'; import { dedupeById } from '@/lib/util/dedupeById'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import React, { useEffect, useLayoutEffect, useState, useCallback, useRef } from 'react'; import { RefreshCw, Download, HardDriveDownload } from 'lucide-react'; import SelectionToggleButton from '@/components/SelectionToggleButton'; diff --git a/src/utils/library/albumBrowseCatalogChunk.ts b/src/features/album/utils/albumBrowseCatalogChunk.ts similarity index 89% rename from src/utils/library/albumBrowseCatalogChunk.ts rename to src/features/album/utils/albumBrowseCatalogChunk.ts index 1f2a1b95..acc1fef6 100644 --- a/src/utils/library/albumBrowseCatalogChunk.ts +++ b/src/features/album/utils/albumBrowseCatalogChunk.ts @@ -2,8 +2,8 @@ import type { SubsonicAlbum } from '@/lib/api/subsonicTypes'; import { dedupeById } from '@/lib/util/dedupeById'; import { isOfflineBrowseActive } from '@/features/offline'; import { loadOfflineAlbumCatalogChunk } from '@/features/offline'; -import type { AlbumBrowseQuery } from './albumBrowseTypes'; -import { fetchLocalAlbumCatalogChunk } from './albumBrowseLoad'; +import type { AlbumBrowseQuery } from '@/utils/library/albumBrowseTypes'; +import { fetchLocalAlbumCatalogChunk } from '@/utils/library/albumBrowseLoad'; export type AlbumCatalogChunk = { albums: SubsonicAlbum[]; diff --git a/src/features/offline/pages/OfflineLibrary.tsx b/src/features/offline/pages/OfflineLibrary.tsx index 3858c638..1514a275 100644 --- a/src/features/offline/pages/OfflineLibrary.tsx +++ b/src/features/offline/pages/OfflineLibrary.tsx @@ -33,7 +33,7 @@ import { type OfflineLibraryCard, } from '@/features/offline/utils/offlineLibraryHelpers'; import { showToast } from '@/utils/ui/toast'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import { getMediaDir } from '@/utils/media/mediaDir'; import { canonicalQueueServerKey, resolveIndexKey } from '@/utils/server/serverIndexKey'; import { reconcileAllLibraryTiersFromDisk } from '@/features/offline/utils/libraryTierReconcile'; diff --git a/src/features/playback/utils/playback/buildInfiniteQueueCandidates.ts b/src/features/playback/utils/playback/buildInfiniteQueueCandidates.ts index 632f4442..44e92b20 100644 --- a/src/features/playback/utils/playback/buildInfiniteQueueCandidates.ts +++ b/src/features/playback/utils/playback/buildInfiniteQueueCandidates.ts @@ -6,7 +6,7 @@ import { getMixMinRatingsConfigFromAuth, passesMixMinRatings, } from '@/utils/mix/mixRatingFilter'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import { songToTrack } from '@/features/playback/utils/playback/songToTrack'; /** * Infinite queue source strategy (Instant Mix-like): diff --git a/src/features/playback/utils/playback/playAlbum.test.ts b/src/features/playback/utils/playback/playAlbum.test.ts index 49121cfe..13f79d08 100644 --- a/src/features/playback/utils/playback/playAlbum.test.ts +++ b/src/features/playback/utils/playback/playAlbum.test.ts @@ -19,7 +19,7 @@ import { resolveAlbumForActiveServer } from '@/store/mediaResolver'; import { useOrbitStore } from '@/features/orbit'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { playAlbum, playAlbumShuffled } from '@/features/playback/utils/playback/playAlbum'; -import * as shuffleModule from '@/features/playback/utils/playback/shuffleArray'; +import * as shuffleModule from '@/lib/util/shuffleArray'; const albumPayload = { album: { diff --git a/src/features/playback/utils/playback/playAlbum.ts b/src/features/playback/utils/playback/playAlbum.ts index e91c03c0..665527ce 100644 --- a/src/features/playback/utils/playback/playAlbum.ts +++ b/src/features/playback/utils/playback/playAlbum.ts @@ -5,7 +5,7 @@ import { orbitSnapshot } from '@/store/orbitRuntime'; import { fadeOut } from '@/features/playback/utils/playback/fadeOut'; import { shouldAutodjInterruptBlend } from '@/features/playback/utils/playback/autodjManualBlend'; import type { Track } from '@/features/playback/store/playerStoreTypes'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; export async function fetchAlbumTracks(albumId: string, serverId?: string): Promise { const albumData = await resolveAlbumForActiveServer(albumId, serverId); diff --git a/src/features/playback/utils/playback/playArtistShuffled.ts b/src/features/playback/utils/playback/playArtistShuffled.ts index e3e24246..f74dee83 100644 --- a/src/features/playback/utils/playback/playArtistShuffled.ts +++ b/src/features/playback/utils/playback/playArtistShuffled.ts @@ -1,6 +1,6 @@ import { resolveAlbum, resolveArtist, resolveMediaServerId } from '@/store/mediaResolver'; import { songToTrack } from '@/features/playback/utils/playback/songToTrack'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import { usePlayerStore } from '@/features/playback/store/playerStore'; /** * All tracks from the artist’s albums, shuffled — same idea as Artist page “shuffle play”. diff --git a/src/features/playback/utils/playback/runBulkPlay.ts b/src/features/playback/utils/playback/runBulkPlay.ts index c1130ffc..05d6fabe 100644 --- a/src/features/playback/utils/playback/runBulkPlay.ts +++ b/src/features/playback/utils/playback/runBulkPlay.ts @@ -1,5 +1,5 @@ import type { Track } from '@/features/playback/store/playerStoreTypes'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; /** * Shared "play / shuffle / enqueue a fetched track list" core for detail pages whose diff --git a/src/hooks/tauriBridge/useCliBridge.ts b/src/hooks/tauriBridge/useCliBridge.ts index 4e8b8043..12824a02 100644 --- a/src/hooks/tauriBridge/useCliBridge.ts +++ b/src/hooks/tauriBridge/useCliBridge.ts @@ -6,7 +6,7 @@ import { getSimilarSongs } from '@/lib/api/subsonicArtists'; import { getMusicFolders } from '@/lib/api/subsonicLibrary'; import { search as subsonicSearch } from '@/lib/api/subsonicSearch'; import { filterSongsForLuckyMixRatings, getMixMinRatingsConfigFromAuth } from '../../utils/mix/mixRatingFilter'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import { songToTrack } from '@/features/playback/utils/playback/songToTrack'; import { showToast } from '../../utils/ui/toast'; import { switchActiveServer } from '../../utils/server/switchActiveServer'; diff --git a/src/features/playback/utils/playback/shuffleArray.test.ts b/src/lib/util/shuffleArray.test.ts similarity index 95% rename from src/features/playback/utils/playback/shuffleArray.test.ts rename to src/lib/util/shuffleArray.test.ts index a064637c..34e9986c 100644 --- a/src/features/playback/utils/playback/shuffleArray.test.ts +++ b/src/lib/util/shuffleArray.test.ts @@ -5,7 +5,7 @@ * refactor (2026-05-12). */ import { afterEach, describe, expect, it, vi } from 'vitest'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; describe('shuffleArray', () => { afterEach(() => { diff --git a/src/features/playback/utils/playback/shuffleArray.ts b/src/lib/util/shuffleArray.ts similarity index 100% rename from src/features/playback/utils/playback/shuffleArray.ts rename to src/lib/util/shuffleArray.ts diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 038cc8eb..94459b51 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -17,7 +17,7 @@ import { filterAlbumsByMixRatings, getMixMinRatingsConfigFromAuth } from '../uti import { usePerfProbeFlags } from '../utils/perf/perfFlags'; import { bumpPerfCounter } from '../utils/perf/perfTelemetry'; import { dedupeById } from '@/lib/util/dedupeById'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import { useLibraryCoverPrefetch } from '../cover/useLibraryCoverPrefetch'; import { primeAlbumCoversForDisplay, warmHomeMainstageCovers } from '../cover/warmDiskPeek'; import { readBecauseYouLikeCache } from '../store/becauseYouLikeCache'; diff --git a/src/utils/library/genreBrowsePlayback.ts b/src/utils/library/genreBrowsePlayback.ts index c41e14e1..4950e89e 100644 --- a/src/utils/library/genreBrowsePlayback.ts +++ b/src/utils/library/genreBrowsePlayback.ts @@ -7,7 +7,7 @@ import type { SubsonicGenre } from '@/lib/api/subsonicTypes'; import { libraryScopeForServer } from '@/lib/api/subsonicClient'; import type { Track } from '@/features/playback/store/playerStoreTypes'; import { songToTrack } from '@/features/playback/utils/playback/songToTrack'; -import { shuffleArray } from '@/features/playback/utils/playback/shuffleArray'; +import { shuffleArray } from '@/lib/util/shuffleArray'; import { trackToSong } from './advancedSearchLocal'; import { type AlbumBrowseSort } from './albumBrowseSort'; import {