diff --git a/server/src/index.ts b/server/src/index.ts index a44af00..84c34e3 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -432,6 +432,8 @@ app.get('/api/sounds', (req: Request, res: Response) => { const q = String(req.query.q ?? '').toLowerCase(); const folderFilter = typeof req.query.folder === 'string' ? (req.query.folder as string) : '__all__'; const categoryFilter = typeof (req.query as any).categoryId === 'string' ? String((req.query as any).categoryId) : undefined; + const fuzzyParam = String((req.query as any).fuzzy ?? '0'); + const useFuzzy = fuzzyParam === '1' || fuzzyParam === 'true'; const rootEntries = fs.readdirSync(SOUNDS_DIR, { withFileTypes: true }); const rootFiles = rootEntries @@ -523,11 +525,15 @@ app.get('/api/sounds', (req: Request, res: Response) => { let filteredItems = itemsByFolder; if (q) { - const scored = itemsByFolder - .map((it) => ({ it, score: fuzzyScore(it.name.toLowerCase(), q) })) - .filter((x) => x.score > 0) - .sort((a, b) => (b.score - a.score) || a.it.name.localeCompare(b.it.name)); - filteredItems = scored.map((x) => x.it); + if (useFuzzy) { + const scored = itemsByFolder + .map((it) => ({ it, score: fuzzyScore(it.name.toLowerCase(), q) })) + .filter((x) => x.score > 0) + .sort((a, b) => (b.score - a.score) || a.it.name.localeCompare(b.it.name)); + filteredItems = scored.map((x) => x.it); + } else { + filteredItems = itemsByFolder.filter((s) => s.name.toLowerCase().includes(q)); + } } const total = allItems.length; diff --git a/web/src/App.tsx b/web/src/App.tsx index 699c01d..a10fc5e 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -13,6 +13,7 @@ export default function App() { const [activeCategoryId, setActiveCategoryId] = useState(''); const [channels, setChannels] = useState([]); const [query, setQuery] = useState(''); + const [fuzzy, setFuzzy] = useState(false); const [selected, setSelected] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -113,7 +114,7 @@ export default function App() { (async () => { try { const folderParam = activeFolder === '__favs__' ? '__all__' : activeFolder; - const s = await fetchSounds(query, folderParam, activeCategoryId || undefined); + const s = await fetchSounds(query, folderParam, activeCategoryId || undefined, fuzzy); setSounds(s.items); setTotal(s.total); setFolders(s.folders); @@ -121,7 +122,7 @@ export default function App() { setError(e?.message || 'Fehler beim Laden der Sounds'); } })(); - }, [activeFolder, query, activeCategoryId]); + }, [activeFolder, query, activeCategoryId, fuzzy]); // Favoriten aus Cookie laden useEffect(() => { @@ -324,6 +325,13 @@ export default function App() { +