{"version":3,"file":"SongSearchStore-Zvev1BXT.js","sources":["../../Vue/src/stores/SongSearchStore.ts"],"sourcesContent":["import { SongSearchResponse } from \"@/models/SongSearchResponse\";\r\nimport { SongsByLanguageCategory } from \"@/models/SongsByLanguageCategory\";\r\nimport { FESearchResult } from \"@/models/frontend-only/FESearchResult\";\r\nimport { LoadStatus } from \"@/models/frontend-only/LoadStatus\";\r\n\r\nexport const useSongSearchStore = defineStore(\"songsearch\", () => {\r\n let loading = false;\r\n const lyricVideoMVPStore = useLyricVideoMVPStore();\r\n const lv = useLyricVideoMVPStore();\r\n const defaultQueryData: { [key: string]: any } = {\r\n numPerPage: 10,\r\n search: \"\",\r\n sortBy: null as null | string,\r\n page: 1,\r\n list: null as null | string,\r\n language: null as null | string[],\r\n expandToAllSongs: false,\r\n songcontent: null as null | string[],\r\n themes: null as null | string[],\r\n primarylanguage: null as null | string[],\r\n keys: null as null | string[],\r\n seo: null as null | string,\r\n seotitle: null as null | string,\r\n };\r\n\r\n const busy = useBusyStore();\r\n const betaStore = useBetaStore();\r\n const router = useRouter();\r\n const route = useRoute();\r\n const api = useApiStore();\r\n const { t } = useI18n();\r\n const debug = useDebug();\r\n const translations = useTranslationStore();\r\n\r\n const appStore = useAppStore();\r\n const path = ref();\r\n const status = ref(LoadStatus.Loading);\r\n // watch(status, () => {\r\n // const statusLUT = {\r\n // [LoadStatus.Loading]: \"Loading\",\r\n // [LoadStatus.Ready]: \"Ready\",\r\n // [LoadStatus.Error]: \"Error\",\r\n // };\r\n // console.log(\"status-check\", statusLUT[status.value]);\r\n // });\r\n const queryData = ref<{ [key: string]: any }>(cloneDeep(defaultQueryData));\r\n const responseData = ref(null);\r\n const items = ref([]);\r\n\r\n function resetSearch() {\r\n const routeListId = (route.query.list as string) || \"\";\r\n const routeLanguage = (route.query.language as string) || \"\";\r\n\r\n const queryData = ref(cloneDeep(defaultQueryData));\r\n queryData.value.list = routeListId || null;\r\n queryData.value.language = routeLanguage || null;\r\n responseData.value = null;\r\n loading = false;\r\n status.value = LoadStatus.Loading;\r\n return loadSongs();\r\n }\r\n\r\n let abortController: AbortController | null = null;\r\n\r\n function abort() {\r\n abortController?.abort();\r\n }\r\n\r\n async function loadSongs(overrideQuery?: { [key: string]: string }) {\r\n lv.getAllVideos();\r\n if (!overrideQuery) {\r\n loadQuery();\r\n }\r\n busy.showBusy();\r\n loading = true;\r\n status.value = LoadStatus.Loading;\r\n try {\r\n path.value = router.currentRoute.value;\r\n\r\n abort();\r\n abortController = new AbortController();\r\n\r\n const response = await api.post(\r\n \"/GetSongSearchResults\",\r\n overrideQuery || toRaw(queryData.value),\r\n {\r\n abort: abortController,\r\n },\r\n );\r\n debug.log(\"responseData.value\", response);\r\n responseData.value = response;\r\n\r\n items.value = await Promise.all(\r\n responseData.value?.items.map(async (i) => {\r\n const songVersion = await getSongVersions(i.songNumber);\r\n if (songVersion) {\r\n return {\r\n ...i,\r\n title: songVersion.SongTitle,\r\n artist: songVersion.Artist,\r\n album: songVersion.Album,\r\n soundSample: {\r\n audioUrl: songVersion?.SoundSampleURL,\r\n imageUrl: songVersion?.AlbumArtURL,\r\n },\r\n enableSongVersion: !!songVersion || false,\r\n };\r\n }\r\n return i;\r\n }) || [],\r\n );\r\n\r\n // todo\r\n if (\r\n betaStore.features.ccliTop100New &&\r\n responseData.value &&\r\n responseData.value.list?.startsWith(\"topterritory\")\r\n ) {\r\n const lut = [\r\n {\r\n name: \"United States\",\r\n listId: \"topterritory_1\",\r\n regionToUse: t(\"S.LIT_PageDescriptionSEO_TopSongsRegion_US\"),\r\n },\r\n {\r\n name: \"United Kingdom\",\r\n listId: \"topterritory_3\",\r\n regionToUse: t(\"S.LIT_PageDescriptionSEO_TopSongsRegion_UK\"),\r\n },\r\n {\r\n name: \"Australia\",\r\n listId: \"topterritory_4\",\r\n regionToUse: t(\"S.LIT_PageDescriptionSEO_TopSongsRegion_AU\"),\r\n },\r\n {\r\n name: \"Canada\",\r\n listId: \"topterritory_2\",\r\n regionToUse: t(\"S.LIT_PageDescriptionSEO_TopSongsRegion_CA\"),\r\n },\r\n ];\r\n\r\n const country = lut.find((c) => c.listId === queryData.value.list);\r\n if (country) {\r\n responseData.value.title = t(\r\n \"S.LIT_PageTitleSEO_MostReportedSongsCountry\",\r\n [country.regionToUse],\r\n );\r\n responseData.value.description = t(\r\n \"S.LIT_PageDescriptionSEO_MostReportedSongsCountry\",\r\n [country.regionToUse],\r\n );\r\n responseData.value.img = null;\r\n responseData.value.imgAlt = null;\r\n }\r\n }\r\n\r\n if (responseData.value?.list === \"topthemed_Christmas\") {\r\n responseData.value.img = null;\r\n responseData.value.imgAlt = null;\r\n }\r\n\r\n if (\r\n responseData.value?.numResults === 1 &&\r\n responseData.value?.items[0].songNumber\r\n ) {\r\n router.replace({\r\n path: `/songs/${responseData.value?.items[0].songNumber}/${responseData.value?.items[0].slug}`,\r\n query: {},\r\n });\r\n status.value = LoadStatus.Ready;\r\n loading = false;\r\n return;\r\n }\r\n\r\n status.value = LoadStatus.Ready;\r\n if (!overrideQuery) {\r\n await updateQuery();\r\n }\r\n } catch (err) {\r\n if (\r\n ((err as any).code && (err as any).code === \"ERR_CANCELED\") ||\r\n ((err as any).message &&\r\n (err as any).message.includes(\"without reason\"))\r\n ) {\r\n return;\r\n } else {\r\n if (!(err as Error).message.includes(\"aborted\")) {\r\n status.value = LoadStatus.Error;\r\n }\r\n }\r\n }\r\n busy.hideBusy();\r\n loading = false;\r\n }\r\n\r\n async function updateQuery() {\r\n const queryObj: { [key: string]: string } = {};\r\n const data = queryData.value;\r\n Object.keys(data).forEach((k) => {\r\n if (data[k] !== defaultQueryData[k]) {\r\n if (k === \"numPerPage\") {\r\n queryObj[\"numPerPage\"] = data[k].toString();\r\n } else if (k === \"sortBy\") {\r\n queryObj[\"sortBy\"] = data[k];\r\n } else if (k === \"page\") {\r\n queryObj[\"page\"] = data[k].toString();\r\n } else if (k === \"search\") {\r\n queryObj[\"search\"] = data[k];\r\n } else if (k === \"list\") {\r\n queryObj[\"list\"] = data[k];\r\n } else if (k === \"language\") {\r\n queryObj[\"language\"] = data[k];\r\n } else if (k === \"expandToAllSongs\") {\r\n queryObj[\"expandToAllSongs\"] = data[k] ? \"1\" : \"0\";\r\n } else if (k === \"songcontent\") {\r\n queryObj[\"songcontent\"] = data[k];\r\n } else if (k === \"themes\") {\r\n queryObj[\"themes\"] = data[k];\r\n } else if (k === \"primarylanguage\") {\r\n queryObj[\"primarylanguage\"] = data[k];\r\n } else if (k === \"keys\") {\r\n queryObj[\"keys\"] = data[k];\r\n } else if (k === \"seo\") {\r\n queryObj[\"seo\"] = data[k];\r\n } else if (k === \"seotitle\") {\r\n queryObj[\"seotitle\"] = data[k];\r\n } else if (k === \"cat\") {\r\n queryObj[\"cat\"] = data[k];\r\n }\r\n }\r\n });\r\n\r\n if (path.value.fullPath.includes(\"search=\") && queryObj.list) {\r\n delete queryObj.list;\r\n }\r\n if (queryObj.list) {\r\n delete queryObj.search;\r\n }\r\n await router.replace({ query: queryObj });\r\n }\r\n\r\n function loadQuery() {\r\n queryData.value = cloneDeep(defaultQueryData);\r\n Object.keys(route.query).forEach((k) => {\r\n if (k === \"numPerPage\") {\r\n queryData.value.numPerPage = parseInt(route.query[k] as string);\r\n } else if (k === \"sortBy\") {\r\n queryData.value.sortBy = route.query[k] as string;\r\n } else if (k === \"page\") {\r\n queryData.value.page = parseInt(route.query[k] as string);\r\n } else if (k === \"search\") {\r\n queryData.value.search = route.query[k] as string;\r\n } else if (k === \"seo\") {\r\n queryData.value.seo = route.query[k] as string;\r\n } else if (k === \"seotitle\") {\r\n queryData.value.seotitle = route.query[k] as string;\r\n } else if (k === \"list\") {\r\n queryData.value.list = route.query[k] as string;\r\n } else if (k === \"language\") {\r\n if (Array.isArray(route.query[k])) {\r\n queryData.value.language = route.query[k];\r\n } else {\r\n queryData.value.language = [route.query[k]];\r\n }\r\n } else if (k === \"expandToAllSongs\") {\r\n queryData.value.expandToAllSongs = (route.query[k] as string) !== \"0\";\r\n } else if (k === \"songcontent\") {\r\n if (Array.isArray(route.query[k])) {\r\n queryData.value.songcontent = route.query[k];\r\n } else {\r\n queryData.value.songcontent = [route.query[k]];\r\n }\r\n } else if (k === \"themes\") {\r\n if (Array.isArray(route.query[k])) {\r\n queryData.value.themes = route.query[k];\r\n } else {\r\n queryData.value.themes = [route.query[k]];\r\n }\r\n } else if (k === \"primarylanguage\") {\r\n if (Array.isArray(route.query[k])) {\r\n queryData.value.primarylanguage = route.query[k];\r\n } else {\r\n queryData.value.primarylanguage = [route.query[k]];\r\n }\r\n } else if (k === \"keys\") {\r\n if (Array.isArray(route.query[k])) {\r\n queryData.value.keys = route.query[k];\r\n } else {\r\n queryData.value.keys = [route.query[k]];\r\n }\r\n } else if (k === \"cat\") {\r\n queryData.value.cat = route.query[k] as string;\r\n }\r\n });\r\n }\r\n\r\n async function updateNumPerPage(numPerPage: number) {\r\n queryData.value.numPerPage = numPerPage;\r\n await updateQuery();\r\n }\r\n\r\n async function updatePage(page: number) {\r\n queryData.value.page = page;\r\n await updateQuery();\r\n }\r\n\r\n async function onSortByUpdate(sortBy: string | null) {\r\n queryData.value.sortBy = sortBy;\r\n await updateQuery();\r\n }\r\n\r\n async function toggleExpandOnNoResults() {\r\n queryData.value.expandToAllSongs = !queryData.value.expandToAllSongs;\r\n await updateQuery();\r\n }\r\n\r\n async function updateFilters(\r\n selectedFilters: { id: string; catId: string }[],\r\n expandToAllSongs: boolean,\r\n ) {\r\n queryData.value.songcontent = selectedFilters\r\n .filter((f) => f.catId.toLowerCase() === \"songcontent\")\r\n .map((f) => f.id);\r\n queryData.value.themes = selectedFilters\r\n .filter((f) => f.catId.toLowerCase() === \"themes\")\r\n .map((f) => f.id);\r\n queryData.value.primarylanguage = selectedFilters\r\n .filter((f) => f.catId.toLowerCase() === \"primarylanguage\")\r\n .map((f) => f.id);\r\n queryData.value.keys = selectedFilters\r\n .filter((f) => f.catId.toLowerCase() === \"keys\")\r\n .map((f) => f.id);\r\n\r\n queryData.value.expandToAllSongs = expandToAllSongs;\r\n queryData.value.page = 1;\r\n\r\n await updateQuery();\r\n }\r\n\r\n const noResults = computed(\r\n () => !responseData.value?.numResults && !filteredVideos.value.length,\r\n );\r\n\r\n const profile = useProfileStore();\r\n const title = computed(() => {\r\n const formatted = Intl.NumberFormat(profile.profile?.language ?? \"en-US\");\r\n const numResults =\r\n filteredVideos.value.length +\r\n ((responseData.value && responseData.value.numResults) || 0);\r\n\r\n if (showCategoryAll.value) {\r\n return `${formatted.format(numResults)} Results for '${queryData.value.search}'`;\r\n }\r\n if (queryData.value.seo === \"MassSettings\" && queryData.value.seotitle) {\r\n return t(\"R.LIT_SongResultsFor\", {\r\n numResults: responseData.value?.numResults || 0,\r\n searchText:\r\n queryData.value.seotitle +\r\n \" - \" +\r\n t(\"S.LIT_LiturgySectionMassSettings\"),\r\n });\r\n } else if (queryData.value.seo === \"MassSettings\") {\r\n return t(\"R.LIT_SongResultsFor\", {\r\n numResults: responseData.value?.numResults || 0,\r\n searchText: t(\"S.LIT_LiturgySectionMassSettings\"),\r\n });\r\n } else if (queryData.value.seo === \"LiturgyMass\") {\r\n return t(\"R.LIT_SongResultsFor\", {\r\n numResults: responseData.value?.numResults || 0,\r\n searchText: t(\"S.LIT_LiturgySectionTheme\"),\r\n });\r\n } else if (queryData.value.seo === \"ResponsorialPsalmsYearA\") {\r\n return t(\"R.LIT_SongResultsFor\", {\r\n numResults: responseData.value?.numResults || 0,\r\n searchText:\r\n t(\"S.LIT_LiturgySectionResponsorialPsalms\") +\r\n \" - \" +\r\n t(\"S.LIT_LiturgyLinkResponsorialPsalmsSeeYearA\"),\r\n });\r\n } else if (queryData.value.seo === \"ResponsorialPsalmsYearB\") {\r\n return t(\"R.LIT_SongResultsFor\", {\r\n numResults: responseData.value?.numResults || 0,\r\n searchText:\r\n t(\"S.LIT_LiturgySectionResponsorialPsalms\") +\r\n \" - \" +\r\n t(\"S.LIT_LiturgyLinkResponsorialPsalmsSeeYearB\"),\r\n });\r\n } else if (queryData.value.seo === \"ResponsorialPsalmsYearC\") {\r\n return t(\"R.LIT_SongResultsFor\", {\r\n numResults: responseData.value?.numResults || 0,\r\n searchText:\r\n t(\"S.LIT_LiturgySectionResponsorialPsalms\") +\r\n \" - \" +\r\n t(\"S.LIT_LiturgyLinkResponsorialPsalmsSeeYearC\"),\r\n });\r\n }\r\n\r\n if (responseData.value?.title?.includes(\"®\")) {\r\n return updateTrademark(responseData.value.title);\r\n }\r\n return responseData.value?.title;\r\n });\r\n\r\n function updateTitleAndDescription() {\r\n const title = [\r\n !noResults.value\r\n ? responseData.value?.title\r\n : status.value !== LoadStatus.Loading\r\n ? t(\"S.SearchResultsNoResultsTitle1\")\r\n : t(\"S.HomePageTabTitle\"),\r\n ]\r\n .filter((i) => !!i)\r\n .join(\" | \");\r\n\r\n const description = [\r\n responseData.value?.description\r\n ? responseData.value?.description\r\n : t(\"S.MetaTagDescription\"),\r\n ]\r\n .filter((i) => !!i)\r\n .join(\"\");\r\n\r\n const queryList = route.query.list;\r\n\r\n if (route.query.language) {\r\n appStore.updateTitleAndDescription({\r\n title: title + \" | \" + t(\"S.PageTabTitle\"),\r\n description: description,\r\n });\r\n } else if (queryList === \"top100\" || queryList === \"popular\") {\r\n appStore.updateTitleAndDescription({\r\n title: title + \" | \" + t(\"S.PageTabTitle\"),\r\n description: description,\r\n });\r\n } else if (\r\n queryList?.includes(\"topterritory\") ||\r\n queryList?.includes(\"topdecade\") ||\r\n queryList?.includes(\"topthemed\") ||\r\n queryList?.includes(\"theme_\")\r\n ) {\r\n appStore.updateTitleAndDescription({\r\n title: title + \" | \" + t(\"S.PageTabTitle\"),\r\n description: description,\r\n });\r\n } else if (queryData.value?.seo === \"ResponsorialPsalms\") {\r\n appStore.updateTitleAndDescription({\r\n title:\r\n t(\"S.LIT_PageTitleSEO_ResponsorialPsalms\") +\r\n \" | \" +\r\n t(\"S.PageTabTitle\"),\r\n description: t(\"SV.MES_ResponsorialPsalmsDescription\"),\r\n });\r\n } else if (queryData.value?.seo === \"ResponsorialPsalmsYearA\") {\r\n appStore.updateTitleAndDescription({\r\n title:\r\n t(\"S.LIT_PageTitleSEO_ResponsorialPsalms\") +\r\n \" | \" +\r\n t(\"S.LIT_LiturgyLinkResponsorialPsalmsSeeYearA\") +\r\n \" | \" +\r\n t(\"S.PageTabTitle\"),\r\n description: t(\"SV.MES_ResponsorialPsalmsDescription\"),\r\n });\r\n } else if (queryData.value?.seo === \"ResponsorialPsalmsYearB\") {\r\n appStore.updateTitleAndDescription({\r\n title:\r\n t(\"S.LIT_PageTitleSEO_ResponsorialPsalms\") +\r\n \" | \" +\r\n t(\"S.LIT_LiturgyLinkResponsorialPsalmsSeeYearB\") +\r\n \" | \" +\r\n t(\"S.PageTabTitle\"),\r\n description: t(\"SV.MES_ResponsorialPsalmsDescription\"),\r\n });\r\n } else if (queryData.value?.seo === \"ResponsorialPsalmsYearC\") {\r\n appStore.updateTitleAndDescription({\r\n title:\r\n t(\"S.LIT_PageTitleSEO_ResponsorialPsalms\") +\r\n \" | \" +\r\n t(\"S.LIT_LiturgyLinkResponsorialPsalmsSeeYearC\") +\r\n \" | \" +\r\n t(\"S.PageTabTitle\"),\r\n\r\n description: t(\"SV.MES_ResponsorialPsalmsDescription\"),\r\n });\r\n } else if (queryData.value?.seo === \"MassSettings\") {\r\n appStore.updateTitleAndDescription({\r\n title:\r\n (route.query.seotitle ? route.query.seotitle + \" | \" : \"\") +\r\n t(\"S.LIT_PageTitleSEO_MassSettings\") +\r\n \" | \" +\r\n t(\"S.PageTabTitle\"),\r\n description: t(\"SV.MES_MassSettingsDescription\"),\r\n });\r\n } else if (queryData.value?.seo === \"LiturgyMass\") {\r\n appStore.updateTitleAndDescription({\r\n title: t(\"SV.LIT_LiturgicalMusic\") + \" | \" + t(\"S.PageTabTitle\"),\r\n description: t(\"SV.MES_LiturgicalMusicDescription\"),\r\n });\r\n } else {\r\n appStore.updateTitleAndDescription({\r\n title: title,\r\n description: description,\r\n });\r\n }\r\n }\r\n\r\n let songsByLanguageData: SongsByLanguageCategory[] = [];\r\n let songsByLanguageDataLastCodeUsed: string = \"\";\r\n\r\n async function getSongsByLanguageData() {\r\n if (\r\n !songsByLanguageData.length ||\r\n songsByLanguageDataLastCodeUsed != translations.currentLanguageCode\r\n ) {\r\n songsByLanguageData = await api.get(\"/GetSongsByLanguageData\");\r\n songsByLanguageDataLastCodeUsed = translations.currentLanguageCode;\r\n }\r\n return songsByLanguageData;\r\n }\r\n\r\n const showCategoryAll = computed(\r\n () => queryData.value.cat === \"all\" && lyricVideoMVPStore.enable,\r\n );\r\n\r\n /**\r\n * Allows me to search for any words in the title, authors, or lyrics, and can be of any order\r\n * if any of the words doesn't match anything at all, then the search result has a 0 score.\r\n */\r\n const filteredVideos = computed(() => {\r\n const s = ((route.query.search as string) || \"\").toLowerCase();\r\n if (!s || s === \"*\") {\r\n return lv.allVideos;\r\n }\r\n\r\n const results = lv.allVideos\r\n .map((f) => {\r\n const searchWeights: {\r\n key: string;\r\n values: string[];\r\n weight: number;\r\n }[] = [\r\n {\r\n key: \"title\",\r\n values: [f.title.toLowerCase()],\r\n weight: 1,\r\n },\r\n {\r\n key: 'songnumber', \r\n values: [f.ccliSongNumber.toLowerCase()],\r\n weight: 1,\r\n },\r\n {\r\n key: \"title_any_order\",\r\n values: f.title.split(\" \").map((s) => s.toLowerCase()),\r\n weight: 0.5,\r\n },\r\n {\r\n key: \"authors\",\r\n values: f.authors.map((a) => a.toLowerCase()),\r\n weight: 0.75,\r\n },\r\n {\r\n key: \"authors_any_order\",\r\n values: f.authors.flatMap((a) =>\r\n a.split(\" \").map((s) => s.toLowerCase()),\r\n ),\r\n weight: 0.5,\r\n },\r\n {\r\n key: \"lyrics_any_order\",\r\n values: f.keyLyricSearchTerms,\r\n weight: 0.5,\r\n },\r\n ];\r\n\r\n const searchTerms: string[] = s.split(\" \");\r\n let hasZeroMatch = false;\r\n\r\n const score = searchTerms.reduce((acc, term) => {\r\n const termScore = searchWeights.reduce((innerAcc, weight) => {\r\n const values = weight.values;\r\n const match = values.some((value) => value.includes(term));\r\n const exactMatch = values.some((value) => value === term);\r\n return (\r\n innerAcc +\r\n (match ? weight.weight : 0) +\r\n (exactMatch ? weight.weight + 0.25 : 0)\r\n );\r\n }, 0);\r\n\r\n // Check if this term has no matches across any weights\r\n if (termScore === 0) {\r\n hasZeroMatch = true;\r\n }\r\n\r\n return acc + termScore;\r\n }, 0);\r\n\r\n // If any term had zero matches, return null\r\n if (hasZeroMatch) {\r\n return { ...f, score: 0 };\r\n }\r\n\r\n return {\r\n ...f,\r\n score,\r\n };\r\n })\r\n .filter((f) => f.score > 0)\r\n .sort((a, b) => b.score - a.score);\r\n\r\n return results;\r\n });\r\n return {\r\n showCategoryAll,\r\n filteredVideos,\r\n resetSearch,\r\n getSongsByLanguageData,\r\n status,\r\n responseData,\r\n queryData,\r\n noResults,\r\n title,\r\n onSortByUpdate,\r\n toggleExpandOnNoResults,\r\n updateFilters,\r\n updateNumPerPage,\r\n updatePage,\r\n loadSongs,\r\n updateTitleAndDescription,\r\n updateQuery,\r\n abort,\r\n items,\r\n };\r\n});\r\n"],"names":["useSongSearchStore","defineStore","loading","lyricVideoMVPStore","useLyricVideoMVPStore","lv","defaultQueryData","busy","useBusyStore","betaStore","useBetaStore","router","useRouter","route","useRoute","api","useApiStore","t","useI18n","debug","useDebug","translations","useTranslationStore","appStore","useAppStore","path","ref","status","LoadStatus","queryData","cloneDeep","responseData","items","resetSearch","routeListId","routeLanguage","loadSongs","abortController","abort","overrideQuery","loadQuery","response","toRaw","_a","i","songVersion","getSongVersions","_b","country","c","_c","_d","_e","_f","_g","updateQuery","err","queryObj","data","k","updateNumPerPage","numPerPage","updatePage","page","onSortByUpdate","sortBy","toggleExpandOnNoResults","updateFilters","selectedFilters","expandToAllSongs","f","noResults","computed","filteredVideos","profile","useProfileStore","title","formatted","numResults","showCategoryAll","_h","_j","_i","updateTrademark","_k","updateTitleAndDescription","description","queryList","songsByLanguageData","songsByLanguageDataLastCodeUsed","getSongsByLanguageData","s","searchWeights","a","searchTerms","hasZeroMatch","score","acc","term","termScore","innerAcc","weight","values","match","value","exactMatch","b"],"mappings":"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"}