jellyfin random play filter
This commit is contained in:
parent
93377dcc4f
commit
80931d1b19
4 changed files with 37 additions and 2 deletions
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
Reference in a new issue