From 6eecc3c0fda68c41d86d06f616d82a49d41083ea Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:00:25 -0700 Subject: [PATCH] handle sanitized sort and filter post-fact --- src/renderer/api/navidrome.types.ts | 12 ++++---- .../api/navidrome/navidrome-controller.ts | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) 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),