aboutsummaryrefslogtreecommitdiffstats
path: root/src/helpers/fetchSongs.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers/fetchSongs.ts')
-rw-r--r--src/helpers/fetchSongs.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/helpers/fetchSongs.ts b/src/helpers/fetchSongs.ts
new file mode 100644
index 0000000..5ae0d83
--- /dev/null
+++ b/src/helpers/fetchSongs.ts
@@ -0,0 +1,51 @@
+import { Song } from "../types/song";
+let cachedSongs: Song[] | null = null;
+function fuzzyMatch(input: string): string {
+ return input.toLowerCase().replace(/[^0-9a-z ]/gi, '');
+}
+
+
+export async function fetchSongs(useCache=true): Promise<Song[]> {
+ if (useCache && cachedSongs) {
+ return cachedSongs;
+ }
+
+ try {
+ const response = await fetch('/songs');
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ const songsData: Song[] = await response.json();
+ cachedSongs = songsData;
+ return songsData;
+ } catch (error) {
+ console.error("Failed to fetch songs:", error);
+ throw error;
+ }
+}
+
+export async function searchSongs(searchTerm: string): Promise<Song[]> {
+ const songsToSearch = await fetchSongs();
+
+ const processedSearchTerm = fuzzyMatch(searchTerm);
+
+ const matchingSongs = songsToSearch
+ .filter((song: Song) => {
+ const songName = fuzzyMatch(song.name);
+ const songArtist = fuzzyMatch(song.artist);
+
+ if (songArtist.includes(processedSearchTerm) || songName.includes(processedSearchTerm)) {
+ return true;
+ }
+ return false;
+ })
+ .sort((a, b) =>
+ a.artist.toLowerCase().localeCompare(b.artist.toLocaleLowerCase())
+ || a.name.toLowerCase().localeCompare(b.name.toLocaleLowerCase())
+ );
+
+ return matchingSongs;
+}
+export function getCachedSongs(): Song[] | null {
+ return cachedSongs;
+}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage