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,
|
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,
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Reference in a new issue