From 9d874cbd18ed54f473240962a230db0797bae495 Mon Sep 17 00:00:00 2001 From: mProjectsCode Date: Mon, 9 May 2022 21:46:43 +0200 Subject: [PATCH] Templates --- src/api/apis/MALAPI.ts | 2 +- src/api/apis/OMDbAPI.ts | 59 +++++++++++++++++++----- src/main.ts | 22 +++++++-- src/settings/Settings.ts | 31 +++++++++++++ src/settings/suggesters/FileSuggester.ts | 28 +++++++++++ 5 files changed, 126 insertions(+), 16 deletions(-) create mode 100644 src/settings/suggesters/FileSuggester.ts diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index 1380464..651369e 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -86,7 +86,7 @@ export class MALAPI extends APIModel { image: result.images?.jpg?.image_url ?? '', released: true, - premiere: result.aired?.string ?? 'unknown', + premiere: (new Date(result.aired?.from)).toLocaleDateString() ?? 'unknown', watched: false, lastWatched: '', diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index ad36fcc..173ae37 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -2,6 +2,7 @@ import {APIModel} from '../APIModel'; import {MediaTypeModel} from '../../models/MediaTypeModel'; import {MovieModel} from '../../models/MovieModel'; import MediaDbPlugin from '../../main'; +import {SeriesModel} from '../../models/SeriesModel'; export class OMDbAPI extends APIModel { plugin: MediaDbPlugin; @@ -48,6 +49,14 @@ export class OMDbAPI extends APIModel { dataSource: this.apiName, id: value.imdbID, } as MovieModel)); + } else if (value.Type === 'series') { + ret.push(new SeriesModel({ + type: 'series', + title: value.Title, + year: value.Year, + dataSource: this.apiName, + id: value.imdbID, + } as SeriesModel)); } } @@ -66,31 +75,57 @@ export class OMDbAPI extends APIModel { throw Error(`Received status code ${fetchData.status} from an API.`); } - const data = await fetchData.json(); - console.log(data); + const result = await fetchData.json(); + console.log(result); - if (data.Type === 'movie') { + if (result.Type === 'movie') { const model = new MovieModel({ type: 'movie', - title: data.Title, - year: data.Year, + title: result.Title, + year: result.Year, dataSource: this.apiName, - id: data.imdbID, + id: result.imdbID, - genres: data.Genre?.split(', ') ?? [], - producer: data.Director ?? 'unknown', - duration: data.Runtime ?? 'unknown', - onlineRating: Number.parseFloat(data.imdbRating ?? 0), - image: data.Poster ?? '', + genres: result.Genre?.split(', ') ?? [], + producer: result.Director ?? 'unknown', + duration: result.Runtime ?? 'unknown', + onlineRating: Number.parseFloat(result.imdbRating ?? 0), + image: result.Poster ?? '', released: true, - premiere: data.Released ?? 'unknown', + premiere: (new Date(result.Released)).toLocaleDateString() ?? 'unknown', watched: false, lastWatched: '', personalRating: 0, } as MovieModel); + return model; + } else if (result.Type === 'series') { + const model = new SeriesModel({ + type: 'series', + title: result.Title, + year: result.Year, + dataSource: this.apiName, + id: result.imdbID, + + genres: result.Genre?.split(', ') ?? [], + studios: [result.Director] ?? 'unknown', + episodes: 0, + duration: result.Runtime ?? 'unknown', + onlineRating: Number.parseFloat(result.imdbRating ?? 0), + image: result.Poster ?? '', + + released: true, + airing: false, + airedFrom: (new Date(result.Released)).toLocaleDateString() ?? 'unknown', + airedTo: 'unknown', + + watched: false, + lastWatched: '', + personalRating: 0, + } as SeriesModel); + return model; } diff --git a/src/main.ts b/src/main.ts index 5013bf0..f5cd501 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import {Notice, Plugin} from 'obsidian'; +import {Notice, Plugin, TFile} from 'obsidian'; import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings'; import {APIManager} from './api/APIManager'; import {TestAPI} from './api/apis/TestAPI'; @@ -43,7 +43,7 @@ export default class MediaDbPlugin extends Plugin { async createMediaDbNote(): Promise { try { let data: MediaTypeModel = await this.openMediaDbSearchModal(); - console.log('MDB | Create new note or something...'); + console.log('MDB | Creating new note...'); data = await this.apiManager.queryDetailedInfo(data); @@ -51,7 +51,23 @@ export default class MediaDbPlugin extends Plugin { data.toMetaData(); - const fileContent = `---\n${data.toMetaData()}---\n`; + let fileContent = `---\n${data.toMetaData()}---\n`; + + if (data.type === 'movie' && this.settings.movieTemplate) { + const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.movieTemplate).first(); + if (templateFile) { + let template = await this.app.vault.read(templateFile); + // console.log(template); + fileContent += template; + } + } else if (data.type === 'series' && this.settings.seriesTemplate) { + const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.seriesTemplate).first(); + if (templateFile) { + let template = await this.app.vault.read(templateFile); + // console.log(template); + fileContent += template; + } + } const fileName = replaceIllegalFileNameCharactersInString(data.getFileName()); const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`; diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 4b7701b..58c83c3 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -2,18 +2,23 @@ import {App, PluginSettingTab, Setting} from 'obsidian'; import MediaDbPlugin from '../main'; import {FolderSuggest} from './suggesters/FolderSuggester'; +import {FileSuggest} from './suggesters/FileSuggester'; export interface MediaDbPluginSettings { folder: string, sfwFilter: boolean, OMDbKey: string, + movieTemplate: string, + seriesTemplate: string, } export const DEFAULT_SETTINGS: MediaDbPluginSettings = { folder: '', sfwFilter: true, OMDbKey: '', + movieTemplate: '', + seriesTemplate: '', }; export class MediaDbSettingTab extends PluginSettingTab { @@ -44,6 +49,32 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl) + .setName('Movie template') + .setDesc('Template file to be used when creating a new note for a movie.') + .addSearch(cb => { + new FileSuggest(this.app, cb.inputEl); + cb.setPlaceholder('Example: movieTemplate.md') + .setValue(this.plugin.settings.movieTemplate) + .onChange(data => { + this.plugin.settings.movieTemplate = data; + this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('Series template') + .setDesc('Template file to be used when creating a new note for a series.') + .addSearch(cb => { + new FileSuggest(this.app, cb.inputEl); + cb.setPlaceholder('Example: seriesTemplate.md') + .setValue(this.plugin.settings.seriesTemplate) + .onChange(data => { + this.plugin.settings.seriesTemplate = data; + this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) .setName('OMDb API key') .setDesc('API key for "www.omdbapi.com".') diff --git a/src/settings/suggesters/FileSuggester.ts b/src/settings/suggesters/FileSuggester.ts new file mode 100644 index 0000000..a54595b --- /dev/null +++ b/src/settings/suggesters/FileSuggester.ts @@ -0,0 +1,28 @@ +import {TextInputSuggest} from './Suggest'; +import {TAbstractFile, TFile} from 'obsidian'; + +export class FileSuggest extends TextInputSuggest { + getSuggestions(inputStr: string): TFile[] { + const abstractFiles = this.app.vault.getAllLoadedFiles(); + const files: TFile[] = []; + const lowerCaseInputStr = inputStr.toLowerCase(); + + abstractFiles.forEach((file: TAbstractFile) => { + if (file instanceof TFile && file.name.toLowerCase().contains(lowerCaseInputStr)) { + files.push(file); + } + }); + + return files; + } + + renderSuggestion(file: TFile, el: HTMLElement): void { + el.setText(file.name); + } + + selectSuggestion(file: TFile): void { + this.inputEl.value = file.name; + this.inputEl.trigger('input'); + this.close(); + } +}