jellyfin random play filter

This commit is contained in:
Kendall Garner 2024-09-01 12:25:50 -07:00
parent 93377dcc4f
commit 80931d1b19
No known key found for this signature in database
GPG key ID: 18D2767419676C87
4 changed files with 37 additions and 2 deletions

View file

@ -56,6 +56,7 @@ import {
MoveItemArgs,
DownloadArgs,
TranscodingArgs,
Played,
} from '/@/renderer/api/types';
import { jfApiClient } from '/@/renderer/api/jellyfin/jellyfin-api';
import { jfNormalize } from './jellyfin-normalize';
@ -892,6 +893,12 @@ const getRandomSongList = async (args: RandomSongListArgs): Promise<RandomSongLi
Fields: 'Genres, DateCreated, MediaSources, ParentId',
GenreIds: query.genre ? query.genre : undefined,
IncludeItemTypes: 'Audio',
IsPlayed:
query.played === Played.Never
? false
: query.played === Played.Played
? true
: undefined,
Limit: query.limit,
ParentId: query.musicFolderId,
Recursive: true,

View file

@ -561,6 +561,7 @@ const songListParameters = paginationParameters.merge(
GenreIds: z.string().optional(),
Genres: z.string().optional(),
IsFavorite: z.boolean().optional(),
IsPlayed: z.boolean().optional(),
SearchTerm: z.string().optional(),
SortBy: z.nativeEnum(songListSort).optional(),
Tags: z.string().optional(),

View file

@ -1073,12 +1073,19 @@ export type SearchResponse = {
songs: Song[];
};
export enum Played {
All = 'all',
Never = 'never',
Played = 'played',
}
export type RandomSongListQuery = {
genre?: string;
limit?: number;
maxYear?: number;
minYear?: number;
musicFolderId?: string;
played: Played;
};
export type RandomSongListArgs = {

View file

@ -1,5 +1,5 @@
import { useMemo } from 'react';
import { Divider, Group, Stack } from '@mantine/core';
import { Divider, Group, SelectItem, Stack } from '@mantine/core';
import { closeAllModals, openModal } from '@mantine/modals';
import { QueryClient } from '@tanstack/react-query';
import merge from 'lodash/merge';
@ -16,6 +16,7 @@ import {
GenreListSort,
SortOrder,
ServerListItem,
Played,
} from '/@/renderer/api/types';
import { api } from '/@/renderer/api';
import { useAuthStore } from '/@/renderer/store';
@ -45,6 +46,7 @@ const useShuffleAllStore = create<ShuffleAllSlice>()(
maxYear: 2020,
minYear: 2000,
musicFolder: '',
played: Played.All,
songCount: 100,
})),
{
@ -55,6 +57,12 @@ const useShuffleAllStore = create<ShuffleAllSlice>()(
),
);
const PLAYED_DATA: SelectItem[] = [
{ label: 'all tracks', value: Played.All },
{ label: 'only unplayed tracks', value: Played.Never },
{ label: 'only played tracks', value: Played.Played },
];
export const useShuffleAllStoreActions = () => useShuffleAllStore((state) => state.actions);
interface ShuffleAllModalProps {
@ -72,7 +80,7 @@ export const ShuffleAllModal = ({
genres,
musicFolders,
}: ShuffleAllModalProps) => {
const { genre, limit, maxYear, minYear, enableMaxYear, enableMinYear, musicFolderId } =
const { genre, limit, maxYear, minYear, enableMaxYear, enableMinYear, musicFolderId, played } =
useShuffleAllStore();
const { setStore } = useShuffleAllStoreActions();
@ -91,6 +99,7 @@ export const ShuffleAllModal = ({
maxYear: enableMaxYear ? maxYear || undefined : undefined,
minYear: enableMinYear ? minYear || undefined : undefined,
musicFolderId: musicFolderId || undefined,
played,
},
}),
queryKey: queryKeys.songs.randomSongList(server?.id),
@ -185,6 +194,17 @@ export const ShuffleAllModal = ({
setStore({ musicFolderId: e ? String(e) : '' });
}}
/>
{server?.type === ServerType.JELLYFIN && (
<Select
clearable
data={PLAYED_DATA}
label="Play filter"
value={played}
onChange={(e) => {
setStore({ played: e as Played });
}}
/>
)}
<Divider />
<Group grow>
<Button