diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..1ac2386 --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,40 @@ +{ + "lsp": { + "deno": { + "settings": { + "deno": { + "enable": true, + }, + }, + }, + }, + "languages": { + "JavaScript": { + "language_servers": [ + "deno", + "!typescript-language-server", + "!vtsls", + "!eslint", + ], + "formatter": "language_server", + }, + "TypeScript": { + "language_servers": [ + "deno", + "!typescript-language-server", + "!vtsls", + "!eslint", + ], + "formatter": "language_server", + }, + "TSX": { + "language_servers": [ + "deno", + "!typescript-language-server", + "!vtsls", + "!eslint", + ], + "formatter": "language_server", + }, + }, +} diff --git a/api/lotus.ts b/api/lotus.ts index 4a8afb4..7161aae 100644 --- a/api/lotus.ts +++ b/api/lotus.ts @@ -21,10 +21,20 @@ const lotus = { }; export function normaliseArtistMetadata(rawArtist: string) { - const separators = /(&|feat\.?|ft\.?|,)/i; - const base = rawArtist.split(separators).map((x) => x.trim()).filter((y) => y && !y.match(separators)); + const removeUnwantedTokens = (raw: string | string[], regex: RegExp) => + typeof raw === 'string' ? raw.split(regex) : raw.join(" ").split(regex) + .map((s) => s.trim()) + .filter(Boolean) + .filter((s) => !s.match(regex)) + + const featTokens = /\s(&|feat\.?|ft\.?)\s/i; + const commaTokens = /(、|,\s)/i; - let artist: string | undefined = base.join(";"); + const base = [featTokens, commaTokens].reduce((acc, regex) => { + return acc.flatMap((s) => removeUnwantedTokens(s, regex)); + }, [rawArtist]); + + let artist = base.join(";"); for (const [key, transform] of Object.entries(combinedArtists)) { if (artist.toLowerCase().includes(key.toLowerCase())) { const pattern = new RegExp(key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi"); diff --git a/deno.json b/deno.json index eaf5028..f1764df 100644 --- a/deno.json +++ b/deno.json @@ -3,6 +3,7 @@ "dev": "deno run --watch main.ts" }, "imports": { + "@std/assert": "jsr:@std/assert@1.0.19", "@std/cli": "jsr:@std/cli@^1.0.28", "@std/crypto": "jsr:@std/crypto@^1.0.5", "@std/fmt": "jsr:@std/fmt@^1.0.9", diff --git a/deno.lock b/deno.lock index 02271f3..85999f6 100644 --- a/deno.lock +++ b/deno.lock @@ -56,6 +56,7 @@ }, "workspace": { "dependencies": [ + "jsr:@std/assert@1.0.19", "jsr:@std/cli@^1.0.28", "jsr:@std/crypto@^1.0.5", "jsr:@std/fmt@^1.0.9", diff --git a/tests/io/csv.ts b/tests/io/csv.ts index 00fd9a5..a6762a0 100644 --- a/tests/io/csv.ts +++ b/tests/io/csv.ts @@ -1,4 +1,4 @@ -import { assert, assertEquals } from "jsr:@std/assert@1.0.19"; +import { assert, assertEquals } from "@std/assert"; import { join } from "@std/path"; import { loadCsvDocument, markSkipped, saveCsvDocument } from "~/lib/format/csv/io.ts"; import { type DocumentTrack, SKIP_PREFIX } from "~/lib/format/csv/mod.ts";