From 8faaf6bed13b0b7f54090d42498bca48b3da8baf Mon Sep 17 00:00:00 2001 From: maciejpedzich Date: Tue, 19 Jul 2022 22:21:13 +0200 Subject: [PATCH] Implement playlist search typeahead --- models/search-result.ts | 4 ++ pages/index.vue | 106 +++++++++++++++++++++++---------- server/api/playlists/search.ts | 24 ++++++++ 3 files changed, 103 insertions(+), 31 deletions(-) create mode 100644 models/search-result.ts create mode 100644 server/api/playlists/search.ts diff --git a/models/search-result.ts b/models/search-result.ts new file mode 100644 index 0000000..df5199e --- /dev/null +++ b/models/search-result.ts @@ -0,0 +1,4 @@ +export interface SearchResult { + id: string; + title: string; +} diff --git a/pages/index.vue b/pages/index.vue index 03fd8c7..407c7be 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -1,25 +1,63 @@ + + diff --git a/server/api/playlists/search.ts b/server/api/playlists/search.ts new file mode 100644 index 0000000..02cab8b --- /dev/null +++ b/server/api/playlists/search.ts @@ -0,0 +1,24 @@ +import { $fetch } from 'ohmyfetch'; + +export default defineEventHandler(async (event) => { + const query = useQuery(event); + + const readmeFileContent = await $fetch( + 'https://raw.githubusercontent.com/mackorone/spotify-playlist-archive/main/README.md' + ); + const [, playlistLinksMdList] = readmeFileContent.split('## Playlists\n\n'); + const archiveEntries = playlistLinksMdList + .replaceAll('- [', '') + .replaceAll('\\', '') + .replaceAll('](', ' ') + .replaceAll('.md)', '') + .split('\n') + .map((textEntry) => { + const [title, id] = textEntry.split(' /playlists/pretty/'); + + return { title, id }; + }) + .filter((entry) => entry.title.includes(query.title as string)); + + return archiveEntries; +});