From a87fee111ccb501121b5aa3c1e48601f4869198a Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 20 Dec 2023 02:20:37 -0800 Subject: feat(schedule): match media to anilist --- src/lib/Media/Anime/airing.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'src/lib/Media/Anime/airing.ts') diff --git a/src/lib/Media/Anime/airing.ts b/src/lib/Media/Anime/airing.ts index 15abbf2a..9c13fb5d 100644 --- a/src/lib/Media/Anime/airing.ts +++ b/src/lib/Media/Anime/airing.ts @@ -6,7 +6,7 @@ import type { SubsPlease } from '$lib/subsPlease'; import levenshtein from 'fast-levenshtein'; import { totalEpisodes } from './episodes'; -interface Time { +export interface Time { title: string; time: string; day: string; @@ -66,6 +66,28 @@ const findClosestMatch = (times: Time[], titles: string[]) => { return closestMatch as Time | null; }; +export const findClosestMedia = (media: Media[], matchFor: string) => { + if (!matchFor) return null; + + let bestFitMedia: Media | null = null; + let smallestDistance = Infinity; + + const normalizedSingleTitle = normalizeTitle(matchFor); + + media.forEach((m) => { + [m.title.romaji, m.title.english, ...m.synonyms].filter(Boolean).forEach((title) => { + const distance = levenshtein.get(normalizedSingleTitle, normalizeTitle(title)); + + if (distance < smallestDistance && distance < normalizedSingleTitle.length / 2) { + smallestDistance = distance; + bestFitMedia = m; + } + }); + }); + + return bestFitMedia as Media | null; +}; + export const injectAiringTime = (anime: Media, subsPlease: SubsPlease | null) => { const airingAt = anime.nextAiringEpisode?.airingAt; // const nativeUntilAiring = airingAt -- cgit v1.2.3