From 413a855e070ae7915dcef0e502145595db81edcc Mon Sep 17 00:00:00 2001 From: mProjectsCode Date: Fri, 6 May 2022 11:36:22 +0200 Subject: [PATCH] added basic MAL api --- src/api/apis/MALAPI.ts | 79 ++++++++++++++++++++++++++++++++++++ src/api/apis/OMDbAPI.ts | 33 +++++++++++++-- src/main.ts | 2 + src/models/MediaTypeModel.ts | 2 +- src/models/MovieModel.ts | 3 +- src/utils/Utils.ts | 2 +- 6 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 src/api/apis/MALAPI.ts diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts new file mode 100644 index 0000000..a58f414 --- /dev/null +++ b/src/api/apis/MALAPI.ts @@ -0,0 +1,79 @@ +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'; + +export class MALAPI extends APIModel { + plugin: MediaDbPlugin; + + constructor(plugin: MediaDbPlugin) { + super(); + + this.plugin = plugin; + this.apiName = 'MALAPI'; + this.apiDescription = 'A free API for Anime.'; + this.apiUrl = 'https://jikan.moe/'; + this.types = ['movie', 'series', 'anime']; + } + + async searchByTitle(title: string): Promise { + console.log(`MDB | api "${this.apiName}" queried`); + + const searchUrl = `https://api.jikan.moe/v4/anime?q=${title}&limit=20`; + + const fetchData = await fetch(searchUrl); + console.log(fetchData); + if (fetchData.status !== 200) { + throw Error(`Received status code ${fetchData.status} from an API.`); + } + const data = await fetchData.json(); + + console.log(data); + + let ret: MediaTypeModel[] = []; + + for (const value of data.data) { + // if (value.Type === 'movie') { + ret.push(new MovieModel({ + type: value.type, + title: value.title, + year: value.year, + dataSource: this.apiName, + id: value.mal_id, + } as MovieModel)); + // } + } + + return ret; + } + + async getById(item: MediaTypeModel): Promise { + + const searchUrl = `https://api.jikan.moe/v4/anime/${item.id}`; + + const fetchData = await fetch(searchUrl); + if (fetchData.status !== 200) { + throw Error(`Received status code ${fetchData.status} from an API.`); + } + + const data = await fetchData.json(); + console.log(data); + const result = data.data; + + // if (data.Type === 'movie') { + const model = new MovieModel({ + type: result.type, + title: result.title, + year: result.year, + dataSource: this.apiName, + id: result.mal_id, + } as MovieModel); + + return model; + // } + + // return; + } +} diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index 90b9f4b..f8b8045 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -37,7 +37,13 @@ export class OMDbAPI extends APIModel { for (const value of data.Search) { if (value.Type === 'movie') { - ret.push(new MovieModel({title: value.Title, id: value.imdbID, dataSource: this.apiName, type: 'movie', premiere: value.Year} as MovieModel)); + ret.push(new MovieModel({ + type: 'movie', + title: value.Title, + year: value.Year, + dataSource: this.apiName, + id: value.imdbID, + } as MovieModel)); } } @@ -54,10 +60,29 @@ export class OMDbAPI extends APIModel { } const data = await fetchData.json(); - if (data.Type === 'movie') { - const model = new MovieModel({title: data.Title, id: data.imdbID, dataSource: this.apiName, type: 'movie', premiere: data.Year} as MovieModel); + console.log(data); - // TODO: mapping + if (data.Type === 'movie') { + const model = new MovieModel({ + type: 'movie', + title: data.Title, + year: data.Year, + dataSource: this.apiName, + id: data.imdbID, + + genres: data.Genre?.split(', ') ?? [], + producer: data.Director ?? 'unknown', + duration: data.Runtime ?? 'unknown', + onlineRating: Number.parseFloat(data.imdbRating ?? 0), + image: data.Poster ?? '', + + released: true, + premiere: data.Released ?? 'unknown', + + watched: false, + lastWatched: '', + personalRating: 0, + } as MovieModel); return model; } diff --git a/src/main.ts b/src/main.ts index 107aa80..31c1563 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,6 +7,7 @@ import {getFileName} from './utils/Utils'; import {OMDbAPI} from './api/apis/OMDbAPI'; import {MediaDbAdvancedSearchModal} from './modals/MediaDbAdvancedSearchModal'; import {MediaDbSearchResultModal} from './modals/MediaDbSearchResultModal'; +import {MALAPI} from './api/apis/MALAPI'; export default class MediaDbPlugin extends Plugin { settings: MediaDbPluginSettings; @@ -36,6 +37,7 @@ export default class MediaDbPlugin extends Plugin { // register APIs this.apiManager.registerAPI(new TestAPI()); this.apiManager.registerAPI(new OMDbAPI(this)); + this.apiManager.registerAPI(new MALAPI(this)); } async createMediaDbNote(): Promise { diff --git a/src/models/MediaTypeModel.ts b/src/models/MediaTypeModel.ts index 58e8e0d..22acdf4 100644 --- a/src/models/MediaTypeModel.ts +++ b/src/models/MediaTypeModel.ts @@ -1,7 +1,7 @@ export abstract class MediaTypeModel { type: string; title: string; - premiere: string; + year: string; dataSource: string; id: string; diff --git a/src/models/MovieModel.ts b/src/models/MovieModel.ts index 3b2e446..ed81140 100644 --- a/src/models/MovieModel.ts +++ b/src/models/MovieModel.ts @@ -5,7 +5,7 @@ import {stringifyYaml} from 'obsidian'; export class MovieModel extends MediaTypeModel { type: string; title: string; - premiere: string; + year: string; dataSource: string; id: string; @@ -16,6 +16,7 @@ export class MovieModel extends MediaTypeModel { image: string; released: boolean; + premiere: string; watched: boolean; lastWatched: string; diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index d6d4ba2..625842a 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -9,7 +9,7 @@ export function sleep(ms: number) { } export function getFileName(item: MediaTypeModel) { - return replaceIllegalFileNameCharactersInString(item.premiere ? `${item.title} (${item.premiere})` : `${item.title}`); + return replaceIllegalFileNameCharactersInString(item.year ? `${item.title} (${item.year})` : `${item.title}`); } export function replaceIllegalFileNameCharactersInString(string: string) {