diff --git a/src/api/APIModel.ts b/src/api/APIModel.ts index 60f223d..4d042c8 100644 --- a/src/api/APIModel.ts +++ b/src/api/APIModel.ts @@ -1,30 +1,30 @@ import {MediaTypeModel} from '../models/MediaTypeModel'; export abstract class APIModel { - apiName: string; - apiUrl: string; - apiDescription: string; - types: string[]; + apiName: string; + apiUrl: string; + apiDescription: string; + types: string[]; - /** - * This function should query the api and return a list of matches. The matches should be caped at 20. - * - * @param title the title to query for - */ - abstract searchByTitle(title: string): Promise; + /** + * This function should query the api and return a list of matches. The matches should be caped at 20. + * + * @param title the title to query for + */ + abstract searchByTitle(title: string): Promise; - abstract getById(item: MediaTypeModel): Promise; + abstract getById(item: MediaTypeModel): Promise; - hasType(type: string): boolean { - return this.types.contains(type); - } + hasType(type: string): boolean { + return this.types.contains(type); + } - hasTypeOverlap(types: string[]): boolean { - for (const type of types) { - if (this.hasType(type)) { - return true; - } - } - return false; - } + hasTypeOverlap(types: string[]): boolean { + for (const type of types) { + if (this.hasType(type)) { + return true; + } + } + return false; + } } diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index 13dbc8f..2e105bd 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -2,8 +2,6 @@ import {APIModel} from '../APIModel'; import {MediaTypeModel} from '../../models/MediaTypeModel'; import {MovieModel} from '../../models/MovieModel'; import MediaDbPlugin from '../../main'; -// @ts-ignore -import Jikanjs from '@mateoaranda/jikanjs'; import {SeriesModel} from '../../models/SeriesModel'; export class MALAPI extends APIModel { @@ -36,18 +34,20 @@ export class MALAPI extends APIModel { let ret: MediaTypeModel[] = []; for (const result of data.data) { - if (result.type.toLowerCase() === 'movie') { + if (result.type.toLowerCase() === 'movie' || result.type.toLowerCase() === 'special') { ret.push(new MovieModel({ type: result.type, title: result.title, + englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', dataSource: this.apiName, id: result.mal_id, } as MovieModel)); - } else if (result.type.toLowerCase() === 'tv') { + } else if (result.type.toLowerCase() === 'tv' || result.type.toLowerCase() === 'ova') { ret.push(new SeriesModel({ type: result.type, title: result.title, + englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', dataSource: this.apiName, id: result.mal_id, @@ -71,10 +71,11 @@ export class MALAPI extends APIModel { console.log(data); const result = data.data; - if (result.type.toLowerCase() === 'movie') { + if (result.type.toLowerCase() === 'movie' || result.type.toLowerCase() === 'special') { const model = new MovieModel({ type: result.type, title: result.title, + englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', dataSource: this.apiName, url: result.url, @@ -95,10 +96,11 @@ export class MALAPI extends APIModel { } as MovieModel); return model; - } else if (result.type.toLowerCase() === 'tv') { + } else if (result.type.toLowerCase() === 'tv' || result.type.toLowerCase() === 'ova') { const model = new SeriesModel({ type: result.type, title: result.title, + englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', dataSource: this.apiName, url: result.url, diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index d3df2f1..af22a5a 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -3,6 +3,7 @@ import {MediaTypeModel} from '../../models/MediaTypeModel'; import {MovieModel} from '../../models/MovieModel'; import MediaDbPlugin from '../../main'; import {SeriesModel} from '../../models/SeriesModel'; +import {GameModel} from '../../models/GameModel'; export class OMDbAPI extends APIModel { plugin: MediaDbPlugin; @@ -12,7 +13,7 @@ export class OMDbAPI extends APIModel { this.plugin = plugin; this.apiName = 'OMDbAPI'; - this.apiDescription = 'A free API for Movies and Series.'; + this.apiDescription = 'A free API for Movies, Series and Games.'; this.apiUrl = 'http://www.omdbapi.com/'; this.types = ['movie', 'series']; } @@ -44,23 +45,34 @@ export class OMDbAPI extends APIModel { let ret: MediaTypeModel[] = []; - for (const value of data.Search) { - if (value.Type === 'movie') { + for (const result of data.Search) { + if (result.Type === 'movie') { ret.push(new MovieModel({ type: 'movie', - title: value.Title, - year: value.Year, + title: result.Title, + englishTitle: result.Title, + year: result.Year, dataSource: this.apiName, - id: value.imdbID, + id: result.imdbID, } as MovieModel)); - } else if (value.Type === 'series') { + } else if (result.Type === 'series') { ret.push(new SeriesModel({ type: 'series', - title: value.Title, - year: value.Year, + title: result.Title, + englishTitle: result.Title, + year: result.Year, dataSource: this.apiName, - id: value.imdbID, + id: result.imdbID, } as SeriesModel)); + } else if (result.Type === 'game') { + ret.push(new GameModel({ + type: 'game', + title: result.Title, + englishTitle: result.Title, + year: result.Year, + dataSource: this.apiName, + id: result.imdbID, + } as GameModel)); } } @@ -91,6 +103,7 @@ export class OMDbAPI extends APIModel { const model = new MovieModel({ type: 'movie', title: result.Title, + englishTitle: result.Title, year: result.Year, dataSource: this.apiName, url: `https://www.imdb.com/title/${result.imdbID}/`, @@ -115,6 +128,7 @@ export class OMDbAPI extends APIModel { const model = new SeriesModel({ type: 'series', title: result.Title, + englishTitle: result.Title, year: result.Year, dataSource: this.apiName, url: `https://www.imdb.com/title/${result.imdbID}/`, @@ -137,6 +151,28 @@ export class OMDbAPI extends APIModel { personalRating: 0, } as SeriesModel); + return model; + } else if (result.Type === 'game') { + const model = new GameModel({ + type: 'game', + title: result.Title, + englishTitle: result.Title, + year: result.Year, + dataSource: this.apiName, + url: `https://www.imdb.com/title/${result.imdbID}/`, + id: result.imdbID, + + genres: result.Genre?.split(', ') ?? [], + onlineRating: Number.parseFloat(result.imdbRating ?? 0), + image: result.Poster ?? '', + + released: true, + releaseDate: (new Date(result.Released)).toLocaleDateString() ?? 'unknown', + + played: false, + personalRating: 0, + } as GameModel); + return model; } diff --git a/src/main.ts b/src/main.ts index 9ff174d..a2e82a6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -74,6 +74,13 @@ export default class MediaDbPlugin extends Plugin { // console.log(template); fileContent += template; } + } else if (data.type === 'game' && this.settings.seriesTemplate) { + const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first(); + if (templateFile) { + let template = await this.app.vault.read(templateFile); + // console.log(template); + fileContent += template; + } } const fileName = replaceIllegalFileNameCharactersInString(data.getFileName()); diff --git a/src/modals/MediaDbSearchResultModal.ts b/src/modals/MediaDbSearchResultModal.ts index c8d362b..40f5dca 100644 --- a/src/modals/MediaDbSearchResultModal.ts +++ b/src/modals/MediaDbSearchResultModal.ts @@ -21,6 +21,7 @@ export class MediaDbSearchResultModal extends SuggestModal { // Renders each suggestion item. renderSuggestion(item: MediaTypeModel, el: HTMLElement) { el.createEl('div', {text: item.getFileName()}); + el.createEl('small', {text: `${item.englishTitle}\n`}); el.createEl('small', {text: `${item.type.toUpperCase()} from ${item.dataSource}`}); } diff --git a/src/models/GameModel.ts b/src/models/GameModel.ts new file mode 100644 index 0000000..7740bae --- /dev/null +++ b/src/models/GameModel.ts @@ -0,0 +1,39 @@ +import {MediaTypeModel} from './MediaTypeModel'; +import {stringifyYaml} from 'obsidian'; + + +export class GameModel extends MediaTypeModel { + type: string; + title: string; + englishTitle: string; + year: string; + dataSource: string; + url: string; + id: string; + + genres: string[]; + onlineRating: number; + image: string; + + released: boolean; + releaseDate: string; + + played: boolean; + personalRating: number; + + + constructor(obj: any = {}) { + super(); + + Object.assign(this, obj); + } + + toMetaData(): string { + return stringifyYaml(this); + } + + getFileName(): string { + return this.title + (this.year ? ` (${this.year})` : ''); + } + +} diff --git a/src/models/MediaTypeModel.ts b/src/models/MediaTypeModel.ts index c54829c..9f6c9f1 100644 --- a/src/models/MediaTypeModel.ts +++ b/src/models/MediaTypeModel.ts @@ -1,6 +1,7 @@ export abstract class MediaTypeModel { type: string; title: string; + englishTitle: string; year: string; dataSource: string; url: string; diff --git a/src/models/MovieModel.ts b/src/models/MovieModel.ts index 8d5987a..6b54613 100644 --- a/src/models/MovieModel.ts +++ b/src/models/MovieModel.ts @@ -5,6 +5,7 @@ import {stringifyYaml} from 'obsidian'; export class MovieModel extends MediaTypeModel { type: string; title: string; + englishTitle: string; year: string; dataSource: string; url: string; @@ -28,8 +29,6 @@ export class MovieModel extends MediaTypeModel { super(); Object.assign(this, obj); - - this.type = 'movie'; } toMetaData(): string { diff --git a/src/models/SeriesModel.ts b/src/models/SeriesModel.ts index 1112548..d6ab109 100644 --- a/src/models/SeriesModel.ts +++ b/src/models/SeriesModel.ts @@ -5,6 +5,7 @@ import {stringifyYaml} from 'obsidian'; export class SeriesModel extends MediaTypeModel { type: string; title: string; + englishTitle: string; year: string; dataSource: string; url: string; @@ -31,8 +32,6 @@ export class SeriesModel extends MediaTypeModel { super(); Object.assign(this, obj); - - this.type = 'series'; } toMetaData(): string { diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 4fb0c12..8f27dac 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -11,6 +11,7 @@ export interface MediaDbPluginSettings { OMDbKey: string, movieTemplate: string, seriesTemplate: string, + gameTemplate: string, } export const DEFAULT_SETTINGS: MediaDbPluginSettings = { @@ -19,6 +20,7 @@ export const DEFAULT_SETTINGS: MediaDbPluginSettings = { OMDbKey: '', movieTemplate: '', seriesTemplate: '', + gameTemplate: '', }; export class MediaDbSettingTab extends PluginSettingTab { @@ -75,6 +77,19 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl) + .setName('Game template') + .setDesc('Template file to be used when creating a new note for a game.') + .addSearch(cb => { + new FileSuggest(this.app, cb.inputEl); + cb.setPlaceholder('Example: gameTemplate.md') + .setValue(this.plugin.settings.gameTemplate) + .onChange(data => { + this.plugin.settings.gameTemplate = data; + this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) .setName('OMDb API key') .setDesc('API key for "www.omdbapi.com".')