games, english anime titles, specials and OVAs

This commit is contained in:
mProjectsCode 2022-05-12 17:18:12 +02:00
parent c400b7abf5
commit d2afe3bcc2
10 changed files with 141 additions and 42 deletions

View file

@ -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<MediaTypeModel[]>;
/**
* 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<MediaTypeModel[]>;
abstract getById(item: MediaTypeModel): Promise<MediaTypeModel>;
abstract getById(item: MediaTypeModel): Promise<MediaTypeModel>;
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;
}
}

View file

@ -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,

View file

@ -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;
}

View file

@ -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());

View file

@ -21,6 +21,7 @@ export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
// 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}`});
}

39
src/models/GameModel.ts Normal file
View file

@ -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})` : '');
}
}

View file

@ -1,6 +1,7 @@
export abstract class MediaTypeModel {
type: string;
title: string;
englishTitle: string;
year: string;
dataSource: string;
url: string;

View file

@ -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 {

View file

@ -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 {

View file

@ -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".')