From 72198abd33ae6b596b3f45228a05778f358bfca5 Mon Sep 17 00:00:00 2001 From: ltctceplrm <14954927+ltctceplrm@users.noreply.github.com> Date: Sat, 8 Mar 2025 02:35:09 +0100 Subject: [PATCH] Made several improvements - Replaced interpolated string to a new function getDisabledMediaTypes() - Added override for every API with the plugin settings for disabled media types - Added _disabledMediaTypes for API's even if they are the only provider of a media type - Replaced static apiMediaTypes to a dynamic version --- src/api/APIModel.ts | 4 +- src/api/apis/BoardGameGeekAPI.ts | 3 ++ src/api/apis/ComicVineAPI.ts | 3 ++ src/api/apis/GiantBombAPI.ts | 3 ++ src/api/apis/MALAPI.ts | 3 ++ src/api/apis/MobyGamesAPI.ts | 3 ++ src/api/apis/MusicBrainzAPI.ts | 3 ++ src/api/apis/OMDbAPI.ts | 4 ++ src/api/apis/OpenLibraryAPI.ts | 3 ++ src/api/apis/SteamAPI.ts | 3 ++ src/api/apis/WikipediaAPI.ts | 3 ++ src/settings/Settings.ts | 67 +++++++++++++++++--------------- 12 files changed, 69 insertions(+), 33 deletions(-) diff --git a/src/api/APIModel.ts b/src/api/APIModel.ts index 94adbd3..0919db9 100644 --- a/src/api/APIModel.ts +++ b/src/api/APIModel.ts @@ -18,8 +18,10 @@ export abstract class APIModel { abstract getById(id: string): Promise; + abstract getDisabledMediaTypes(): MediaType[]; + hasType(type: MediaType): boolean { - const disabledMediaTypes = this.plugin.settings[`${this.apiName}_disabledMediaTypes` as keyof typeof this.plugin.settings] as MediaType[]; + const disabledMediaTypes = this.getDisabledMediaTypes(); return this.types.includes(type) && !disabledMediaTypes.includes(type); } diff --git a/src/api/apis/BoardGameGeekAPI.ts b/src/api/apis/BoardGameGeekAPI.ts index 96ef76e..08c574f 100644 --- a/src/api/apis/BoardGameGeekAPI.ts +++ b/src/api/apis/BoardGameGeekAPI.ts @@ -117,4 +117,7 @@ export class BoardGameGeekAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.BoardgameGeekAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/ComicVineAPI.ts b/src/api/apis/ComicVineAPI.ts index 86c9bf8..65fd167 100644 --- a/src/api/apis/ComicVineAPI.ts +++ b/src/api/apis/ComicVineAPI.ts @@ -95,4 +95,7 @@ export class ComicVineAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.ComicVineAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/GiantBombAPI.ts b/src/api/apis/GiantBombAPI.ts index 60bf4e8..a60ccae 100644 --- a/src/api/apis/GiantBombAPI.ts +++ b/src/api/apis/GiantBombAPI.ts @@ -106,4 +106,7 @@ export class GiantBombAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.GiantBombAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index fa0d322..d85746c 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -195,4 +195,7 @@ export class MALAPI extends APIModel { throw new Error(`MDB | Unknown media type for id ${id}`); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MALAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/MobyGamesAPI.ts b/src/api/apis/MobyGamesAPI.ts index 4c2922b..a8f0861 100644 --- a/src/api/apis/MobyGamesAPI.ts +++ b/src/api/apis/MobyGamesAPI.ts @@ -107,4 +107,7 @@ export class MobyGamesAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MobyGamesAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/MusicBrainzAPI.ts b/src/api/apis/MusicBrainzAPI.ts index 87349a1..022d944 100644 --- a/src/api/apis/MusicBrainzAPI.ts +++ b/src/api/apis/MusicBrainzAPI.ts @@ -99,4 +99,7 @@ export class MusicBrainzAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MusicBrainzAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index 0dd54cc..fb6351d 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -223,4 +223,8 @@ export class OMDbAPI extends APIModel { throw new Error(`MDB | Unknown media type for id ${id}`); } + + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.OMDbAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/OpenLibraryAPI.ts b/src/api/apis/OpenLibraryAPI.ts index 4835afe..78eb301 100644 --- a/src/api/apis/OpenLibraryAPI.ts +++ b/src/api/apis/OpenLibraryAPI.ts @@ -89,4 +89,7 @@ export class OpenLibraryAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.OpenLibraryAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/SteamAPI.ts b/src/api/apis/SteamAPI.ts index 1e52979..d3f7c8f 100644 --- a/src/api/apis/SteamAPI.ts +++ b/src/api/apis/SteamAPI.ts @@ -109,4 +109,7 @@ export class SteamAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.SteamAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/api/apis/WikipediaAPI.ts b/src/api/apis/WikipediaAPI.ts index 110cd79..b73382d 100644 --- a/src/api/apis/WikipediaAPI.ts +++ b/src/api/apis/WikipediaAPI.ts @@ -79,4 +79,7 @@ export class WikipediaAPI extends APIModel { userData: {}, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.WikipediaAPI_disabledMediaTypes as MediaType[]; + } } diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index f7d721b..da981d4 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -9,6 +9,7 @@ import { PropertyMapping, PropertyMappingModel, PropertyMappingOption } from './ import PropertyMappingModelsComponent from './PropertyMappingModelsComponent.svelte'; import { FileSuggest } from './suggesters/FileSuggest'; import { FolderSuggest } from './suggesters/FolderSuggest'; +import type { MediaType } from 'src/utils/MediaType'; export interface MediaDbPluginSettings { OMDbKey: string; @@ -28,6 +29,10 @@ export interface MediaDbPluginSettings { SteamAPI_disabledMediaTypes: string[]; MobyGamesAPI_disabledMediaTypes: string[]; GiantBombAPI_disabledMediaTypes: string[]; + WikipediaAPI_disabledMediaTypes: string[]; + BoardgameGeekAPI_disabledMediaTypes: string[]; + MusicBrainzAPI_disabledMediaTypes: string[]; + OpenLibraryAPI_disabledMediaTypes: string[]; movieTemplate: string; seriesTemplate: string; mangaTemplate: string; @@ -85,6 +90,10 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = { SteamAPI_disabledMediaTypes: [], MobyGamesAPI_disabledMediaTypes: [], GiantBombAPI_disabledMediaTypes: [], + WikipediaAPI_disabledMediaTypes: [], + BoardgameGeekAPI_disabledMediaTypes: [], + MusicBrainzAPI_disabledMediaTypes: [], + OpenLibraryAPI_disabledMediaTypes: [], movieTemplate: '', seriesTemplate: '', mangaTemplate: '', @@ -291,23 +300,14 @@ export class MediaDbSettingTab extends PluginSettingTab { // Create a map to store APIs for each media type const mediaTypeApiMap = new Map(); - const apiMediaTypes = { - OMDbAPI: ['movie', 'series', 'game'], - MALAPI: ['movie', 'series'], - MALAPIManga: ['comicManga'], - ComicVineAPI: ['comicManga'], - SteamAPI: ['game'], - MobyGamesAPI: ['game'], - GiantBombAPI: ['game'], - }; - // Populate the map with APIs for each media type - for (const [api, mediaTypes] of Object.entries(apiMediaTypes)) { - for (const mediaType of mediaTypes) { - if (!mediaTypeApiMap.has(mediaType)) { - mediaTypeApiMap.set(mediaType, []); + // Populate the map with APIs for each media type dynamically + for (const api of this.plugin.apiManager.apis) { + for (const MediaType of api.types) { + if (!mediaTypeApiMap.has(MediaType)) { + mediaTypeApiMap.set(MediaType, []); } - mediaTypeApiMap.get(mediaType)!.push(api); + mediaTypeApiMap.get(MediaType)!.push(api.apiName); } } @@ -315,26 +315,29 @@ export class MediaDbSettingTab extends PluginSettingTab { const filteredMediaTypes = Array.from(mediaTypeApiMap.entries()).filter(([_, apis]) => apis.length > 1); // Dynamically create settings based on the filtered media types and their APIs - for (const [mediaType, apis] of filteredMediaTypes) { - new Setting(containerEl).setName(`Select APIs for ${unCamelCase(mediaType)}`).setHeading(); + for (const [MediaType, apis] of filteredMediaTypes) { + new Setting(containerEl).setName(`Select APIs for ${unCamelCase(MediaType)}`).setHeading(); for (const apiName of apis) { - const disabledMediaTypes = this.plugin.settings[`${apiName}_disabledMediaTypes` as keyof typeof this.plugin.settings] as string[]; - new Setting(containerEl) - .setName(apiName) - .setDesc(`Use ${apiName} API for ${unCamelCase(mediaType)}.`) - .addToggle(cb => { - cb.setValue(!disabledMediaTypes.includes(mediaType)).onChange(data => { - if (data) { - const index = disabledMediaTypes.indexOf(mediaType); - if (index > -1) { - disabledMediaTypes.splice(index, 1); + const api = this.plugin.apiManager.apis.find(api => api.apiName === apiName); + if (api) { + const disabledMediaTypes = api.getDisabledMediaTypes(); + new Setting(containerEl) + .setName(apiName) + .setDesc(`Use ${apiName} API for ${unCamelCase(MediaType)}.`) + .addToggle(cb => { + cb.setValue(!disabledMediaTypes.includes(MediaType as MediaType)).onChange(data => { + if (data) { + const index = disabledMediaTypes.indexOf(MediaType as MediaType); + if (index > -1) { + disabledMediaTypes.splice(index, 1); + } + } else { + disabledMediaTypes.push(MediaType as MediaType); } - } else { - disabledMediaTypes.push(mediaType); - } - void this.plugin.saveSettings(); + void this.plugin.saveSettings(); + }); }); - }); + } } }