diff --git a/src/api/APIModel.ts b/src/api/APIModel.ts index c424508..6230457 100644 --- a/src/api/APIModel.ts +++ b/src/api/APIModel.ts @@ -1,11 +1,14 @@ import { MediaTypeModel } from '../models/MediaTypeModel'; import { MediaType } from '../utils/MediaType'; +import { MediaDbPluginSettings } from 'src/settings/Settings'; +import MediaDbPlugin from '../main'; export abstract class APIModel { apiName: string; apiUrl: string; apiDescription: string; types: MediaType[]; + plugin: MediaDbPlugin; /** * This function should query the api and return a list of matches. The matches should be caped at 20. @@ -17,7 +20,9 @@ export abstract class APIModel { abstract getById(id: string): Promise; hasType(type: MediaType): boolean { - return this.types.contains(type); + if (this.types.contains(type) && (Boolean((this.plugin.settings.apiToggle as any)?.[this.apiName]?.[type] as MediaDbPluginSettings) === true || (this.plugin.settings.apiToggle as any)?.[this.apiName]?.[type] as MediaDbPluginSettings === undefined)) { + return true; + } } hasTypeOverlap(types: MediaType[]): boolean { diff --git a/src/modals/MediaDbSearchModal.ts b/src/modals/MediaDbSearchModal.ts index b4c89a9..5e3cb99 100644 --- a/src/modals/MediaDbSearchModal.ts +++ b/src/modals/MediaDbSearchModal.ts @@ -76,6 +76,8 @@ export class MediaDbSearchModal extends Modal { const placeholder = 'Search by title'; const searchComponent = new TextComponent(contentEl); + let currentToggle: ToggleComponent = null; + searchComponent.inputEl.style.width = '100%'; searchComponent.setPlaceholder(placeholder); searchComponent.setValue(this.query); @@ -99,8 +101,21 @@ export class MediaDbSearchModal extends Modal { const apiToggleComponent = new ToggleComponent(apiToggleComponentWrapper); apiToggleComponent.setTooltip(unCamelCase(mediaType)); apiToggleComponent.setValue(this.selectedTypes.find(x => x.name === mediaType).selected); + if (apiToggleComponent.getValue()) { + currentToggle = apiToggleComponent; + } apiToggleComponent.onChange(value => { - this.selectedTypes.find(x => x.name === mediaType).selected = value; + if (value) { + if (currentToggle && currentToggle !== apiToggleComponent) { + currentToggle.setValue(false); + this.selectedTypes.find(x => x.name === mediaType).selected = false; + } + currentToggle = apiToggleComponent; + this.selectedTypes.find(x => x.name === mediaType).selected = true; + } else { + currentToggle = null; + this.selectedTypes.find(x => x.name === mediaType).selected = false; + } }); apiToggleComponentWrapper.appendChild(apiToggleComponent.toggleEl); } diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 8466dbe..d5a3578 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -19,7 +19,23 @@ export interface MediaDbPluginSettings { openNoteInNewTab: boolean; useDefaultFrontMatter: boolean; enableTemplaterIntegration: boolean; - + apiToggle: { + OMDbAPI: { + movie: boolean; + series: boolean; + game: boolean; + }, + MALAPI: { + movie: boolean; + series: boolean; + }, + SteamAPI: { + game: boolean; + }, + MobyGamesAPI: { + game: boolean; + } + }, movieTemplate: string; seriesTemplate: string; mangaTemplate: string; @@ -69,7 +85,23 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = { openNoteInNewTab: true, useDefaultFrontMatter: true, enableTemplaterIntegration: false, - + apiToggle: { + OMDbAPI: { + movie: true, + series: true, + game: true, + }, + MALAPI: { + movie: true, + series: true, + }, + SteamAPI: { + game: true, + }, + MobyGamesAPI: { + game: true, + } + }, movieTemplate: '', seriesTemplate: '', mangaTemplate: '', @@ -209,10 +241,10 @@ export class MediaDbSettingTab extends PluginSettingTab { .setDesc( fragWithHTML( "Your custom date format. Use 'YYYY-MM-DD' for example.
" + - "For more syntax, refer to format reference.
" + - "Your current syntax looks like this: " + - this.plugin.dateFormatter.getPreview() + - '', + "For more syntax, refer to format reference.
" + + "Your current syntax looks like this: " + + this.plugin.dateFormatter.getPreview() + + '', ), ) .addText(cb => { @@ -260,6 +292,75 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); + + containerEl.createEl('h3', { text: 'APIs Per Media Type' }); + containerEl.createEl('h5', { text: 'Movies' }); + new Setting(containerEl) + .setName('OMDb API') + .setDesc('Use OMDb API for movies.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.OMDbAPI.movie).onChange(data => { + this.plugin.settings.apiToggle.OMDbAPI.movie = data; + this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) + .setName('MAL API') + .setDesc('Use MAL API for movies.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.MALAPI.movie).onChange(data => { + this.plugin.settings.apiToggle.MALAPI.movie = data; + this.plugin.saveSettings(); + }); + }); + containerEl.createEl('h5', { text: 'Series' }); + new Setting(containerEl) + .setName('OMDb API') + .setDesc('Use OMDb API for series.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.OMDbAPI.series).onChange(data => { + this.plugin.settings.apiToggle.OMDbAPI.series = data; + this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) + .setName('MAL API') + .setDesc('Use MAL API for series.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.MALAPI.series).onChange(data => { + this.plugin.settings.apiToggle.MALAPI.series = data; + this.plugin.saveSettings(); + }); + }); + containerEl.createEl('h5', { text: 'Games' }); + new Setting(containerEl) + .setName('OMDb API') + .setDesc('Use OMDb API for games.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.OMDbAPI.game).onChange(data => { + this.plugin.settings.apiToggle.OMDbAPI.game = data; + this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) + .setName('Steam API') + .setDesc('Use OMDb API for games.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.SteamAPI.game).onChange(data => { + this.plugin.settings.apiToggle.SteamAPI.game = data; + this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) + .setName('MobyGames API') + .setDesc('Use MobyGames API for games.') + .addToggle(cb => { + cb.setValue(this.plugin.settings.apiToggle.MobyGamesAPI.game).onChange(data => { + this.plugin.settings.apiToggle.MobyGamesAPI.game = data; + this.plugin.saveSettings(); + }); + }); + containerEl.createEl('h3', { text: 'New File Location' }); // region new file location new Setting(containerEl) diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index 54679af..50ec761 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -28,7 +28,7 @@ export class MediaTypeManager { mediaTemplateMap: Map; mediaFolderMap: Map; - constructor() {} + constructor() { } updateTemplates(settings: MediaDbPluginSettings): void { this.mediaFileNameTemplateMap = new Map(); diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index ccb21b9..56cb080 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -207,7 +207,7 @@ export function unCamelCase(str: string): string { // space before last upper in a sequence followed by lower .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3') // uppercase the first character - .replace(/^./, function (str) { + .replace(/^./, function(str) { return str.toUpperCase(); }) );