diff --git a/src/api/APIManager.ts b/src/api/APIManager.ts index 3634c90..d25494d 100644 --- a/src/api/APIManager.ts +++ b/src/api/APIManager.ts @@ -15,7 +15,7 @@ export class APIManager { for (const api of this.apis) { if (types.length === 0 || api.hasTypeOverlap(types)) { - const apiRes = await api.getByTitle(query); + const apiRes = await api.searchByTitle(query); // console.log(apiRes); res = res.concat(apiRes); } @@ -24,6 +24,14 @@ export class APIManager { return res; } + async queryDetailedInfo(item: MediaTypeModel): Promise { + for (const api of this.apis) { + if (api.apiName === item.dataSource) { + return api.getById(item); + } + } + } + registerAPI(api: APIModel): void { this.apis.push(api); } diff --git a/src/api/APIModel.ts b/src/api/APIModel.ts index f492810..7aaf03c 100644 --- a/src/api/APIModel.ts +++ b/src/api/APIModel.ts @@ -10,7 +10,9 @@ export abstract class APIModel { * * @param title the title to query for */ - abstract getByTitle(title: string): Promise; + abstract searchByTitle(title: string): Promise; + + abstract getById(item: MediaTypeModel): Promise; hasType(type: string): boolean { return this.types.contains(type); diff --git a/src/api/apis/TestAPI.ts b/src/api/apis/TestAPI.ts index 30471c0..d9b995c 100644 --- a/src/api/apis/TestAPI.ts +++ b/src/api/apis/TestAPI.ts @@ -1,5 +1,6 @@ import {APIModel} from '../APIModel'; import {MediaTypeModel} from '../../models/MediaTypeModel'; +import {MovieModel} from '../../models/MovieModel'; export class TestAPI extends APIModel { constructor() { @@ -9,20 +10,16 @@ export class TestAPI extends APIModel { this.types = ['test']; } - async getByTitle(title: string): Promise { + async searchByTitle(title: string): Promise { console.log(`MDB | api "${this.apiName}" queried`); return [ - {title: 'test1', type: this.types[0], dataSource: this.apiName} as MediaTypeModel, - {title: 'test2', type: this.types[0], dataSource: this.apiName} as MediaTypeModel, + new MovieModel ({title: 'test_1', type: this.types[0], dataSource: this.apiName}) , + new MovieModel ({title: 'test_2', type: this.types[0], dataSource: this.apiName, producer: 'Max Musterman'}), ]; } - getMataDataFromResult(item: MediaTypeModel): string { - if (item.dataSource !== this.apiUrl) { - return ''; - } - - return ''; + async getById(item: MediaTypeModel): Promise { + return item; } } diff --git a/src/main.ts b/src/main.ts index ea5da16..f9c33cc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,8 @@ import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './sett import {MediaDbSearchModal} from './modals/MediaDbSearchModal'; import {APIManager} from './api/APIManager'; import {TestAPI} from './api/apis/TestAPI'; +import {MediaTypeModel} from './models/MediaTypeModel'; +import {getFileName} from './utils/Utils'; export default class MediaDbPlugin extends Plugin { settings: MediaDbPluginSettings; @@ -34,9 +36,28 @@ export default class MediaDbPlugin extends Plugin { } async createMediaDbNote(): Promise { - const data = await this.openMediaDbSearchModal(); + let data: MediaTypeModel = await this.openMediaDbSearchModal(); console.log('MDB | Create new note or something...'); + + data = await this.apiManager.queryDetailedInfo(data); + console.log(data); + + data.toMetaData() + + const fileContent = `---\n${data.toMetaData()}\n---\n`; + + const fileName = getFileName(data); + const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`; + const targetFile = await this.app.vault.create(filePath, fileContent); + + // open file + const activeLeaf = this.app.workspace.getLeaf(); + if (!activeLeaf) { + console.warn('No active leaf'); + return; + } + await activeLeaf.openFile(targetFile, { state: { mode: 'source' } }); } async openMediaDbSearchModal(): Promise { diff --git a/src/models/MediaTypeModel.ts b/src/models/MediaTypeModel.ts index bb1c046..a57ba4b 100644 --- a/src/models/MediaTypeModel.ts +++ b/src/models/MediaTypeModel.ts @@ -2,6 +2,7 @@ export abstract class MediaTypeModel { type: string; title: string; dataSource: string; + id: string; abstract toMetaData(): string; } diff --git a/src/models/MovieModel.ts b/src/models/MovieModel.ts index 21a6c05..877a9d3 100644 --- a/src/models/MovieModel.ts +++ b/src/models/MovieModel.ts @@ -4,6 +4,7 @@ export class MovieModel extends MediaTypeModel { type: string; title: string; dataSource: string; + id: string; genres: string[]; producer: string; @@ -19,14 +20,16 @@ export class MovieModel extends MediaTypeModel { personalRating: number; - constructor() { + constructor(obj: any = {}) { super(); + Object.assign(this, obj); + this.type = 'movie'; } toMetaData(): string { - return ''; + return JSON.stringify(this); } } diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index cbe18cd..270ae73 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,7 +1,17 @@ -export const wrapAround = (value: number, size: number): number => { - return ((value % size) + size) % size; -}; +import {MediaTypeModel} from '../models/MediaTypeModel'; -export const sleep = (ms: number) => { +export function wrapAround(value: number, size: number): number { + return ((value % size) + size) % size; +} + +export function sleep (ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); -}; +} + +export function getFileName(item: MediaTypeModel) { + return replaceIllegalFileNameCharactersInString(item.title); +} + +export function replaceIllegalFileNameCharactersInString(string: string) { + return string.replace(/[\\,#%&{}/*<>$":@.]*/g, ''); +}