diff --git a/src/renderer/api/navidrome.types.ts b/src/renderer/api/navidrome.types.ts index 951c0d98..6c409742 100644 --- a/src/renderer/api/navidrome.types.ts +++ b/src/renderer/api/navidrome.types.ts @@ -229,15 +229,15 @@ export type NDAlbumListParams = { NDOrder; export enum NDSongListSort { - ALBUM = 'album, order_album_artist_name, disc_number, track_number, title', - ALBUM_ARTIST = 'order_album_artist_name, album, disc_number, track_number, title', - ALBUM_SONGS = 'album, discNumber, trackNumber', + ALBUM = 'album', + ALBUM_ARTIST = 'order_album_artist_name', + ALBUM_SONGS = 'album', ARTIST = 'artist', BPM = 'bpm', CHANNELS = 'channels', COMMENT = 'comment', DURATION = 'duration', - FAVORITED = 'starred ASC, starredAt ASC', + FAVORITED = 'starred', GENRE = 'genre', ID = 'id', PLAY_COUNT = 'playCount', @@ -247,7 +247,7 @@ export enum NDSongListSort { RECENTLY_ADDED = 'createdAt', TITLE = 'title', TRACK = 'track', - YEAR = 'year, album, discNumber, trackNumber', + YEAR = 'year', } export type NDSongListParams = { @@ -261,7 +261,7 @@ export type NDSongListParams = { export enum NDAlbumArtistListSort { ALBUM_COUNT = 'albumCount', - FAVORITED = 'starred ASC, starredAt ASC', + FAVORITED = 'starred', NAME = 'name', PLAY_COUNT = 'playCount', RATING = 'rating', diff --git a/src/renderer/api/navidrome/navidrome-controller.ts b/src/renderer/api/navidrome/navidrome-controller.ts index ad38468e..25b29682 100644 --- a/src/renderer/api/navidrome/navidrome-controller.ts +++ b/src/renderer/api/navidrome/navidrome-controller.ts @@ -50,6 +50,7 @@ import { SimilarSongsArgs, Song, MoveItemArgs, + SongListSort, } from '../types'; import { VersionInfo, getFeatures, hasFeature } from '/@/renderer/api/utils'; import { ServerFeature, ServerFeatures } from '/@/renderer/api/features-types'; @@ -285,6 +286,34 @@ const getSongList = async (args: SongListArgs): Promise => { throw new Error('Failed to get song list'); } + if ( + (query.sortBy === SongListSort.ALBUM || query.sortBy === SongListSort.ALBUM_ARTIST) && + !query.limit + ) { + const isAlbumArtist = query.sortBy === SongListSort.ALBUM_ARTIST; + + res.body.data.sort((a, b) => { + if (isAlbumArtist) { + const albumDiff = a.album.localeCompare(b.album); + if (albumDiff !== 0) { + return albumDiff; + } + } + + const discDiff = a.discNumber - b.discNumber; + if (discDiff !== 0) { + return discDiff; + } + + const trackDiff = a.trackNumber - b.trackNumber; + if (trackDiff !== 0) { + return trackDiff; + } + + return a.title.localeCompare(b.title); + }); + } + return { items: res.body.data.map((song) => ndNormalize.song(song, apiClientProps.server, '', query.imageSize), diff --git a/src/renderer/features/player/components/shuffle-all-modal.tsx b/src/renderer/features/player/components/shuffle-all-modal.tsx index 7005797c..33e1e6d6 100644 --- a/src/renderer/features/player/components/shuffle-all-modal.tsx +++ b/src/renderer/features/player/components/shuffle-all-modal.tsx @@ -145,7 +145,7 @@ export const ShuffleAllModal = ({ max={500} min={1} value={limit} - onChange={(e) => setStore({ limit: e ? Number(e) : 0 })} + onChange={(e) => setStore({ limit: e ? Number(e) : 500 })} />