remove _custom query usage for playlists

This commit is contained in:
jeffvli
2025-12-03 18:31:42 -08:00
parent a47f94ebb2
commit cb2581252b
10 changed files with 37 additions and 83 deletions
@@ -143,8 +143,10 @@ export const NavidromeController: InternalControllerEndpoint = {
body: { body: {
comment: body.comment, comment: body.comment,
name: body.name, name: body.name,
ownerId: body.ownerId,
public: body.public, public: body.public,
...body._custom, rules: body.queryBuilderRules,
sync: body.sync,
}, },
}); });
@@ -326,9 +328,9 @@ export const NavidromeController: InternalControllerEndpoint = {
library_id: getLibraryId(query.musicFolderId), library_id: getLibraryId(query.musicFolderId),
name: query.searchTerm, name: query.searchTerm,
recently_played: query.isRecentlyPlayed, recently_played: query.isRecentlyPlayed,
starred: query.favorite,
year: query.maxYear || query.minYear, year: query.maxYear || query.minYear,
...query._custom, ...query._custom,
starred: query.favorite,
...excludeMissing(apiClientProps.server), ...excludeMissing(apiClientProps.server),
}, },
}); });
@@ -359,9 +361,9 @@ export const NavidromeController: InternalControllerEndpoint = {
_start: query.startIndex, _start: query.startIndex,
library_id: getLibraryId(query.musicFolderId), library_id: getLibraryId(query.musicFolderId),
name: query.searchTerm, name: query.searchTerm,
role: query.role || undefined,
starred: query.favorite, starred: query.favorite,
...query._custom, ...query._custom,
role: query.role || undefined,
...excludeMissing(apiClientProps.server), ...excludeMissing(apiClientProps.server),
}, },
}); });
@@ -471,16 +473,6 @@ export const NavidromeController: InternalControllerEndpoint = {
}, },
getPlaylistList: async (args) => { getPlaylistList: async (args) => {
const { apiClientProps, query } = args; const { apiClientProps, query } = args;
const customQuery = query._custom;
// Smart playlists only became available in 0.48.0. Do not filter for previous versions
if (
customQuery &&
customQuery.smart !== undefined &&
!hasFeature(apiClientProps.server, ServerFeature.PLAYLISTS_SMART)
) {
customQuery.smart = undefined;
}
const res = await ndApiClient(apiClientProps).getPlaylistList({ const res = await ndApiClient(apiClientProps).getPlaylistList({
query: { query: {
@@ -489,7 +481,7 @@ export const NavidromeController: InternalControllerEndpoint = {
_sort: query.sortBy ? playlistListSortMap.navidrome[query.sortBy] : undefined, _sort: query.sortBy ? playlistListSortMap.navidrome[query.sortBy] : undefined,
_start: query.startIndex, _start: query.startIndex,
q: query.searchTerm, q: query.searchTerm,
...customQuery, smart: query.excludeSmartPlaylists ? false : undefined,
}, },
}); });
@@ -821,7 +813,10 @@ export const NavidromeController: InternalControllerEndpoint = {
body: { body: {
comment: body.comment || '', comment: body.comment || '',
name: body.name, name: body.name,
ownerId: body.ownerId,
public: body?.public || false, public: body?.public || false,
rules: body.queryBuilderRules,
sync: body.sync,
...body._custom, ...body._custom,
}, },
params: { params: {
@@ -327,11 +327,6 @@ export const AlbumDetailContent = () => {
excludeIds: detailQuery?.data?.id ? [detailQuery.data.id] : undefined, excludeIds: detailQuery?.data?.id ? [detailQuery.data.id] : undefined,
isHidden: !detailQuery?.data?.albumArtists?.[0]?.id, isHidden: !detailQuery?.data?.albumArtists?.[0]?.id,
query: { query: {
_custom: {
jellyfin: {
ExcludeItemIds: detailQuery?.data?.id,
},
},
artistIds: detailQuery?.data?.albumArtists.length artistIds: detailQuery?.data?.albumArtists.length
? [detailQuery?.data?.albumArtists[0].id] ? [detailQuery?.data?.albumArtists[0].id]
: undefined, : undefined,
@@ -346,11 +341,11 @@ export const AlbumDetailContent = () => {
excludeIds: detailQuery?.data?.id ? [detailQuery.data.id] : undefined, excludeIds: detailQuery?.data?.id ? [detailQuery.data.id] : undefined,
isHidden: !detailQuery?.data?.genres?.[0], isHidden: !detailQuery?.data?.genres?.[0],
query: { query: {
genres: detailQuery?.data?.genres.length genreIds: detailQuery?.data?.genres.length
? [detailQuery?.data?.genres[0].id] ? [detailQuery?.data?.genres[0].id]
: undefined, : undefined,
}, },
rowCount: 2, rowCount: 1,
sortBy: AlbumListSort.RANDOM, sortBy: AlbumListSort.RANDOM,
sortOrder: SortOrder.ASC, sortOrder: SortOrder.ASC,
title: `${t('page.albumDetail.moreFromGeneric', { title: `${t('page.albumDetail.moreFromGeneric', {
@@ -38,11 +38,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
const playlistsQuery = useQuery( const playlistsQuery = useQuery(
playlistsQueries.list({ playlistsQueries.list({
query: { query: {
_custom: { excludeSmartPlaylists: true,
navidrome: {
smart: false,
},
},
sortBy: PlaylistListSort.NAME, sortBy: PlaylistListSort.NAME,
sortOrder: SortOrder.ASC, sortOrder: SortOrder.ASC,
startIndex: 0, startIndex: 0,
@@ -74,11 +74,7 @@ export const AddToPlaylistContextModal = ({
const playlistList = useQuery( const playlistList = useQuery(
playlistsQueries.list({ playlistsQueries.list({
query: { query: {
_custom: { excludeSmartPlaylists: true,
navidrome: {
smart: false,
},
},
sortBy: PlaylistListSort.NAME, sortBy: PlaylistListSort.NAME,
sortOrder: SortOrder.ASC, sortOrder: SortOrder.ASC,
startIndex: 0, startIndex: 0,
@@ -33,13 +33,9 @@ export const CreatePlaylistForm = ({ onCancel }: CreatePlaylistFormProps) => {
const form = useForm<CreatePlaylistBody>({ const form = useForm<CreatePlaylistBody>({
initialValues: { initialValues: {
_custom: {
navidrome: {
rules: undefined,
},
},
comment: '', comment: '',
name: '', name: '',
queryBuilderRules: undefined,
}, },
}); });
const [isSmartPlaylist, setIsSmartPlaylist] = useState(false); const [isSmartPlaylist, setIsSmartPlaylist] = useState(false);
@@ -79,14 +75,7 @@ export const CreatePlaylistForm = ({ onCancel }: CreatePlaylistFormProps) => {
apiClientProps: { serverId: server.id }, apiClientProps: { serverId: server.id },
body: { body: {
...values, ...values,
_custom: { ...(rules ? { queryBuilderRules: rules } : {}),
navidrome: {
...values._custom?.navidrome,
rules,
},
// Top-level rules field is what Navidrome expects for smart playlists.
...(rules ? { rules } : {}),
},
}, },
}, },
{ {
@@ -36,15 +36,10 @@ export const SaveAsPlaylistForm = ({
const form = useForm<CreatePlaylistBody>({ const form = useForm<CreatePlaylistBody>({
initialValues: { initialValues: {
_custom: {
navidrome: {
rules: undefined,
...body?._custom?.navidrome,
},
},
comment: body.comment || '', comment: body.comment || '',
name: body.name || '', name: body.name || '',
public: body.public, public: body.public,
queryBuilderRules: body.queryBuilderRules,
}, },
}); });
@@ -48,17 +48,12 @@ export const UpdatePlaylistForm = ({ body, onCancel, query, users }: UpdatePlayl
const form = useForm<UpdatePlaylistBody>({ const form = useForm<UpdatePlaylistBody>({
initialValues: { initialValues: {
_custom: {
navidrome: {
owner: body?._custom?.navidrome?.owner || '',
ownerId: body?._custom?.navidrome?.ownerId || '',
rules: undefined,
sync: body?._custom?.navidrome?.sync || false,
},
},
comment: body?.comment || '', comment: body?.comment || '',
name: body?.name || '', name: body?.name || '',
ownerId: body.ownerId,
public: body.public, public: body.public,
queryBuilderRules: body.queryBuilderRules,
sync: body.sync,
}, },
}); });
@@ -114,7 +109,7 @@ export const UpdatePlaylistForm = ({ body, onCancel, query, users }: UpdatePlayl
{isOwnerDisplayed && ( {isOwnerDisplayed && (
<Select <Select
data={userList || []} data={userList || []}
{...form.getInputProps('_custom.navidrome.ownerId')} {...form.getInputProps('ownerId')}
label={t('form.createPlaylist.input', { label={t('form.createPlaylist.input', {
context: 'owner', context: 'owner',
postProcess: 'titleCase', postProcess: 'titleCase',
@@ -191,18 +186,13 @@ export const openUpdatePlaylistModal = async (args: {
children: ( children: (
<UpdatePlaylistForm <UpdatePlaylistForm
body={{ body={{
_custom: {
navidrome: {
owner: playlist?.owner || undefined,
ownerId: playlist?.ownerId || undefined,
rules: playlist?.rules || undefined,
sync: playlist?.sync || undefined,
},
},
comment: playlist?.description || undefined, comment: playlist?.description || undefined,
genres: playlist?.genres, genres: playlist?.genres,
name: playlist?.name, name: playlist?.name,
ownerId: playlist?.ownerId || undefined,
public: playlist?.public || false, public: playlist?.public || false,
queryBuilderRules: playlist?.rules || undefined,
sync: playlist?.sync || undefined,
}} }}
onCancel={closeAllModals} onCancel={closeAllModals}
query={{ id: playlist?.id }} query={{ id: playlist?.id }}
@@ -280,15 +280,12 @@ const PlaylistDetailSongListRoute = () => {
{ {
apiClientProps: { serverId: detailQuery?.data?._serverId }, apiClientProps: { serverId: detailQuery?.data?._serverId },
body: { body: {
_custom: {
owner: detailQuery?.data?.owner || '',
ownerId: detailQuery?.data?.ownerId || '',
rules,
sync: detailQuery?.data?.sync || false,
},
comment: detailQuery?.data?.description || '', comment: detailQuery?.data?.description || '',
name: detailQuery?.data?.name, name: detailQuery?.data?.name,
ownerId: detailQuery?.data?.ownerId || '',
public: detailQuery?.data?.public || false, public: detailQuery?.data?.public || false,
queryBuilderRules: rules,
sync: detailQuery?.data?.sync || false,
}, },
}, },
{ {
@@ -332,19 +329,12 @@ const PlaylistDetailSongListRoute = () => {
children: ( children: (
<SaveAsPlaylistForm <SaveAsPlaylistForm
body={{ body={{
_custom: {
navidrome: {
owner: detailQuery?.data?.owner || '',
ownerId: detailQuery?.data?.ownerId || '',
rules,
sync: detailQuery?.data?.sync || false,
},
rules,
sync: detailQuery?.data?.sync || false,
},
comment: detailQuery?.data?.description || '', comment: detailQuery?.data?.description || '',
name: detailQuery?.data?.name, name: detailQuery?.data?.name,
ownerId: detailQuery?.data?.ownerId || '',
public: detailQuery?.data?.public || false, public: detailQuery?.data?.public || false,
queryBuilderRules: rules,
sync: detailQuery?.data?.sync || false,
}} }}
onCancel={closeAllModals} onCancel={closeAllModals}
onSuccess={(data) => onSuccess={(data) =>
@@ -527,6 +527,7 @@ const createPlaylist = playlist.pick({
const createPlaylistParameters = z.object({ const createPlaylistParameters = z.object({
comment: z.string().optional(), comment: z.string().optional(),
name: z.string(), name: z.string(),
ownerId: z.string().optional(),
public: z.boolean().optional(), public: z.boolean().optional(),
rules: z.record(z.any()).optional(), rules: z.record(z.any()).optional(),
sync: z.boolean().optional(), sync: z.boolean().optional(),
+7
View File
@@ -893,7 +893,10 @@ export type CreatePlaylistBody = {
_custom?: Record<string, any>; _custom?: Record<string, any>;
comment?: string; comment?: string;
name: string; name: string;
ownerId?: string;
public?: boolean; public?: boolean;
queryBuilderRules?: Record<string, any>;
sync?: boolean;
}; };
// Create Playlist // Create Playlist
@@ -924,6 +927,7 @@ export type PlaylistListCountArgs = BaseEndpointArgs & { query: ListCountQuery<P
export interface PlaylistListQuery extends BaseQuery<PlaylistListSort> { export interface PlaylistListQuery extends BaseQuery<PlaylistListSort> {
_custom?: Record<string, any>; _custom?: Record<string, any>;
excludeSmartPlaylists?: boolean;
limit?: number; limit?: number;
searchTerm?: string; searchTerm?: string;
startIndex: number; startIndex: number;
@@ -978,7 +982,10 @@ export type UpdatePlaylistBody = {
comment?: string; comment?: string;
genres?: Genre[]; genres?: Genre[];
name: string; name: string;
ownerId?: string;
public?: boolean; public?: boolean;
queryBuilderRules?: Record<string, any>;
sync?: boolean;
}; };
export type UpdatePlaylistQuery = { export type UpdatePlaylistQuery = {