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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
import { useMemo } from 'react'; 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 { closeAllModals, openModal } from '@mantine/modals';
import { QueryClient } from '@tanstack/react-query'; import { QueryClient } from '@tanstack/react-query';
import merge from 'lodash/merge'; import merge from 'lodash/merge';
@ -16,6 +16,7 @@ import {
GenreListSort, GenreListSort,
SortOrder, SortOrder,
ServerListItem, ServerListItem,
Played,
} from '/@/renderer/api/types'; } from '/@/renderer/api/types';
import { api } from '/@/renderer/api'; import { api } from '/@/renderer/api';
import { useAuthStore } from '/@/renderer/store'; import { useAuthStore } from '/@/renderer/store';
@ -45,6 +46,7 @@ const useShuffleAllStore = create<ShuffleAllSlice>()(
maxYear: 2020, maxYear: 2020,
minYear: 2000, minYear: 2000,
musicFolder: '', musicFolder: '',
played: Played.All,
songCount: 100, 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); export const useShuffleAllStoreActions = () => useShuffleAllStore((state) => state.actions);
interface ShuffleAllModalProps { interface ShuffleAllModalProps {
@ -72,7 +80,7 @@ export const ShuffleAllModal = ({
genres, genres,
musicFolders, musicFolders,
}: ShuffleAllModalProps) => { }: ShuffleAllModalProps) => {
const { genre, limit, maxYear, minYear, enableMaxYear, enableMinYear, musicFolderId } = const { genre, limit, maxYear, minYear, enableMaxYear, enableMinYear, musicFolderId, played } =
useShuffleAllStore(); useShuffleAllStore();
const { setStore } = useShuffleAllStoreActions(); const { setStore } = useShuffleAllStoreActions();
@ -91,6 +99,7 @@ export const ShuffleAllModal = ({
maxYear: enableMaxYear ? maxYear || undefined : undefined, maxYear: enableMaxYear ? maxYear || undefined : undefined,
minYear: enableMinYear ? minYear || undefined : undefined, minYear: enableMinYear ? minYear || undefined : undefined,
musicFolderId: musicFolderId || undefined, musicFolderId: musicFolderId || undefined,
played,
}, },
}), }),
queryKey: queryKeys.songs.randomSongList(server?.id), queryKey: queryKeys.songs.randomSongList(server?.id),
@ -185,6 +194,17 @@ export const ShuffleAllModal = ({
setStore({ musicFolderId: e ? String(e) : '' }); 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 /> <Divider />
<Group grow> <Group grow>
<Button <Button