Adding the crudest search functionality

This commit is contained in:
Violet Caulfield
2025-01-24 06:12:50 -06:00
parent 9201deb24b
commit d9bdd05a28
6 changed files with 179 additions and 5 deletions
+39
View File
@@ -0,0 +1,39 @@
import Client from "../../../api/client";
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
import { getItemsApi } from "@jellyfin/sdk/lib/utils/api";
import { isEmpty, trim } from "lodash";
/**
* Performs a search for items against the Jellyfin server, trimming whitespace
* around the search term for the best possible results.
* @param searchString The search term to look up against
* @returns A promise of a BaseItemDto array, be it empty or not
*/
export async function search(searchString: string | undefined) : Promise<BaseItemDto[]> {
return new Promise((resolve, reject) => {
if (isEmpty(searchString))
resolve([]);
getItemsApi(Client.api!)
.getItems({
searchTerm: trim(searchString),
recursive: true,
includeItemTypes: [
'Audio',
'MusicAlbum',
'MusicArtist',
'Playlist'
]
})
.then((response) => {
if (response.data.Items)
resolve(response.data.Items)
else
resolve([]);
})
.catch((error) => {
reject(error)
});
})
}
+90
View File
@@ -0,0 +1,90 @@
import Client from "../../../api/client";
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
import { getSuggestionsApi } from "@jellyfin/sdk/lib/utils/api";
export async function fetchSearchSuggestions() : Promise<BaseItemDto[]> {
return new Promise((resolve, reject) => {
getSuggestionsApi(Client.api!)
.getSuggestions({
userId: Client.user!.id,
type: [
'MusicArtist',
'MusicAlbum',
'Audio',
'Playlist'
]
})
.then((response) => {
if (response.data.Items)
resolve(response.data.Items)
else
resolve([]);
})
.catch((error) => {
reject(error);
})
})
}
export async function fetchSuggestedArtists() : Promise<BaseItemDto[]> {
return new Promise((resolve, reject) => {
getSuggestionsApi(Client.api!)
.getSuggestions({
userId: Client.user!.id,
type: [
'MusicArtist'
]
})
.then((response) => {
if (response.data.Items)
resolve(response.data.Items)
else
resolve([]);
})
.catch((error) => {
reject(error);
})
})
}
export async function fetchSuggestedAlbums() : Promise<BaseItemDto[]> {
return new Promise((resolve, reject) => {
getSuggestionsApi(Client.api!)
.getSuggestions({
userId: Client.user!.id,
type: [
'MusicAlbum'
]
})
.then((response) => {
if (response.data.Items)
resolve(response.data.Items)
else
resolve([]);
})
.catch((error) => {
reject(error);
})
})
}
export async function fetchSuggestedTracks() : Promise<BaseItemDto[]> {
return new Promise((resolve, reject) => {
getSuggestionsApi(Client.api!)
.getSuggestions({
userId: Client.user!.id,
type: [
'Audio'
]
})
.then((response) => {
if (response.data.Items)
resolve(response.data.Items)
else
resolve([]);
})
.catch((error) => {
reject(error);
})
})
}
+8
View File
@@ -0,0 +1,8 @@
import { QueryKeys } from "../../enums/query-keys";
import { useQuery } from "@tanstack/react-query";
import { search } from "./functions/search";
export const useSearch = (searchString: string | undefined) => useQuery({
queryKey: [QueryKeys.Search, searchString],
queryFn: () => search(searchString)
})
+8
View File
@@ -0,0 +1,8 @@
import { QueryKeys } from "../../enums/query-keys";
import { useQuery } from "@tanstack/react-query";
import { fetchSearchSuggestions } from "./functions/suggestions";
export const useSearchSuggestions = () => useQuery({
queryKey: [QueryKeys.SearchSuggestions],
queryFn: () => fetchSearchSuggestions()
})