diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index 5507a10..66e1935 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -41,13 +41,20 @@ export class MALAPI extends APIModel { let ret: MediaTypeModel[] = []; for (const result of data.data) { - const type = this.typeMappings.get(result.type.toLowerCase()); + const type = this.typeMappings.get(result.type?.toLowerCase()); if (type === undefined) { - continue; + ret.push(new MovieModel({ + subType: '', + 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)); } if (type === 'movie' || type === 'special') { ret.push(new MovieModel({ - type: type, + subType: type, title: result.title, englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', @@ -56,7 +63,7 @@ export class MALAPI extends APIModel { } as MovieModel)); } else if (type === 'series' || type === 'ova') { ret.push(new SeriesModel({ - type: type, + subType: type, title: result.title, englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', @@ -83,14 +90,39 @@ export class MALAPI extends APIModel { debugLog(data); const result = data.data; - const type = this.typeMappings.get(result.type.toLowerCase()); + const type = this.typeMappings.get(result.type?.toLowerCase()); if (type === undefined) { - throw Error(`${result.type.toLowerCase()} is an unsupported type.`); + const model = new MovieModel({ + subType: '', + title: result.title, + englishTitle: result.title_english ?? result.title, + year: result.year ?? result.aired?.prop?.from?.year ?? '', + dataSource: this.apiName, + url: result.url, + id: result.mal_id, + + genres: result.genres?.map((x: any) => x.name) ?? [], + producer: result.studios?.map((x: any) => x.name).join(', ') ?? 'unknown', + duration: result.duration ?? 'unknown', + onlineRating: result.score ?? 0, + image: result.images?.jpg?.image_url ?? '', + + released: true, + premiere: (new Date(result.aired?.from)).toLocaleDateString() ?? 'unknown', + + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, + } as MovieModel); + + return model; } if (type === 'movie' || type === 'special') { const model = new MovieModel({ - type: type, + subType: type, title: result.title, englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', @@ -117,7 +149,7 @@ export class MALAPI extends APIModel { return model; } else if (type === 'series' || type === 'ova') { const model = new SeriesModel({ - type: type, + subType: type, title: result.title, englishTitle: result.title_english ?? result.title, year: result.year ?? result.aired?.prop?.from?.year ?? '', diff --git a/src/main.ts b/src/main.ts index 2f0bd2f..c43124d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import {Notice, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian'; +import {Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian'; import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings'; import {APIManager} from './api/APIManager'; import {MediaTypeModel} from './models/MediaTypeModel'; @@ -109,33 +109,13 @@ export default class MediaDbPlugin extends Plugin { console.log('MDB | Creating new note...'); // console.log(mediaTypeModel); - let metadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject()); - if (attachFile) { - let attachFileMetadata: any = this.app.metadataCache.getFileCache(attachFile).frontmatter; - if (attachFileMetadata) { - attachFileMetadata = JSON.parse(JSON.stringify(attachFileMetadata)); // deep copy - delete attachFileMetadata.position; - } else { - attachFileMetadata = {}; - } + let fileMetadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject()); + let fileContent = ''; - metadata = Object.assign(attachFileMetadata, metadata); - } + ({fileMetadata, fileContent} = await this.attachFile(fileMetadata, fileContent, attachFile)); + ({fileMetadata, fileContent} = await this.attachTemplate(fileMetadata, fileContent, await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app))); - debugLog(metadata); - - let fileContent = `---\n${this.settings.useCustomYamlStringifier ? YAMLConverter.toYaml(metadata) : stringifyYaml(metadata)}---\n`; - - if (this.settings.templates) { - fileContent += await this.mediaTypeManager.getContent(mediaTypeModel, this.app); - } - - if (attachFile) { - let attachFileContent: string = await this.app.vault.read(attachFile); - const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---'); - attachFileContent = attachFileContent.replace(regExp, ''); - fileContent += '\n\n' + attachFileContent; - } + fileContent = `---\n${this.settings.useCustomYamlStringifier ? YAMLConverter.toYaml(fileMetadata) : stringifyYaml(fileMetadata)}---\n` + fileContent; await this.createNote(this.mediaTypeManager.getFileName(mediaTypeModel), fileContent); } catch (e) { @@ -144,6 +124,67 @@ export default class MediaDbPlugin extends Plugin { } } + async attachFile(fileMetadata: any, fileContent: string, fileToAttach?: TFile): Promise<{ fileMetadata: any, fileContent: string }> { + if (!fileToAttach) { + return {fileMetadata: fileMetadata, fileContent: fileContent}; + } + + let attachFileMetadata: any = this.app.metadataCache.getFileCache(fileToAttach).frontmatter; + if (attachFileMetadata) { + attachFileMetadata = JSON.parse(JSON.stringify(attachFileMetadata)); // deep copy + delete attachFileMetadata.position; + } else { + attachFileMetadata = {}; + } + fileMetadata = Object.assign(attachFileMetadata, fileMetadata); + + let attachFileContent: string = await this.app.vault.read(fileToAttach); + const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---'); + attachFileContent = attachFileContent.replace(regExp, ''); + fileContent += '\n' + attachFileContent; + + return {fileMetadata: fileMetadata, fileContent: fileContent}; + } + + async attachTemplate(fileMetadata: any, fileContent: string, template: string): Promise<{ fileMetadata: any, fileContent: string }> { + if (!template) { + return {fileMetadata: fileMetadata, fileContent: fileContent}; + } + + let templateMetadata: any = this.getMetaDataFromFileContent(template); + fileMetadata = Object.assign(templateMetadata, fileMetadata); + + const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---'); + const attachFileContent = template.replace(regExp, ''); + fileContent += '\n' + attachFileContent; + + return {fileMetadata: fileMetadata, fileContent: fileContent}; + } + + getMetaDataFromFileContent(fileContent: string): any { + let metadata: any; + + const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---'); + const frontMatterRegExpResult = regExp.exec(fileContent); + if (!frontMatterRegExpResult) { + return {}; + } + let frontMatter = frontMatterRegExpResult[0]; + if (!frontMatter) { + return {}; + } + frontMatter = frontMatter.substring(4); + frontMatter = frontMatter.substring(0, frontMatter.length - 3); + + metadata = parseYaml(frontMatter); + + if (!metadata) { + metadata = {}; + } + + return metadata; + } + async createNote(fileName: string, fileContent: string, openFile: boolean = false) { fileName = replaceIllegalFileNameCharactersInString(fileName); const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`; diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index bd47d84..ba0bd90 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -37,7 +37,7 @@ export class MediaTypeManager { return replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType()), mediaTypeModel); } - async getContent(mediaTypeModel: MediaTypeModel, app: App) { + async getTemplate(mediaTypeModel: MediaTypeModel, app: App) { const templateFileName = this.mediaTemplateMap.get(mediaTypeModel.getMediaType()); if (!templateFileName) {