From 0298270b031d259865bd5b7b92d48de69d55d357 Mon Sep 17 00:00:00 2001 From: mProjectsCode Date: Tue, 31 May 2022 22:26:45 +0200 Subject: [PATCH] Own YAML Converter and update note won't override user data anymore --- src/api/apis/MALAPI.ts | 16 +++++++++------ src/api/apis/MusicBrainzAPI.ts | 4 ++++ src/api/apis/OMDbAPI.ts | 22 +++++++++++++-------- src/api/apis/SteamAPI.ts | 10 +++++----- src/api/apis/WikipediaAPI.ts | 2 ++ src/main.ts | 16 +++++++++------ src/models/GameModel.ts | 6 ++++-- src/models/MediaTypeModel.ts | 12 +++++++++-- src/models/MovieModel.ts | 9 +++++---- src/models/MusicReleaseModel.ts | 4 +++- src/models/SeriesModel.ts | 9 +++++---- src/models/WikiModel.ts | 1 + src/utils/MediaTypeManager.ts | 21 ++++++++++++++++++++ src/utils/YAMLConverter.ts | 35 +++++++++++++++++++++++++++++++++ 14 files changed, 129 insertions(+), 38 deletions(-) create mode 100644 src/utils/YAMLConverter.ts diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index 67c5790..a60e349 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -107,9 +107,11 @@ export class MALAPI extends APIModel { released: true, premiere: (new Date(result.aired?.from)).toLocaleDateString() ?? 'unknown', - watched: false, - lastWatched: '', - personalRating: 0, + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, } as MovieModel); return model; @@ -135,9 +137,11 @@ export class MALAPI extends APIModel { airedTo: (new Date(result.aired?.to)).toLocaleDateString() ?? 'unknown', airing: result.airing, - watched: false, - lastWatched: '', - personalRating: 0, + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, } as SeriesModel); return model; diff --git a/src/api/apis/MusicBrainzAPI.ts b/src/api/apis/MusicBrainzAPI.ts index 87ea855..53936cc 100644 --- a/src/api/apis/MusicBrainzAPI.ts +++ b/src/api/apis/MusicBrainzAPI.ts @@ -90,6 +90,10 @@ export class MusicBrainzAPI extends APIModel { genres: result.genres.map((g: any) => g.name), subType: result['primary-type'], rating: result.rating.value * 2, + + userData: { + personalRating: 0, + }, } as MusicReleaseModel); return model; diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index 4ae38f4..e4c2bee 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -132,9 +132,11 @@ export class OMDbAPI extends APIModel { released: true, premiere: (new Date(result.Released)).toLocaleDateString() ?? 'unknown', - watched: false, - lastWatched: '', - personalRating: 0, + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, } as MovieModel); return model; @@ -160,9 +162,11 @@ export class OMDbAPI extends APIModel { airedFrom: (new Date(result.Released)).toLocaleDateString() ?? 'unknown', airedTo: 'unknown', - watched: false, - lastWatched: '', - personalRating: 0, + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, } as SeriesModel); return model; @@ -183,8 +187,10 @@ export class OMDbAPI extends APIModel { released: true, releaseDate: (new Date(result.Released)).toLocaleDateString() ?? 'unknown', - played: false, - personalRating: 0, + userData: { + played: false, + personalRating: 0, + }, } as GameModel); return model; diff --git a/src/api/apis/SteamAPI.ts b/src/api/apis/SteamAPI.ts index 5e27fb9..92cb1dd 100644 --- a/src/api/apis/SteamAPI.ts +++ b/src/api/apis/SteamAPI.ts @@ -1,10 +1,8 @@ import {APIModel} from '../APIModel'; import {MediaTypeModel} from '../../models/MediaTypeModel'; -import {MovieModel} from '../../models/MovieModel'; import MediaDbPlugin from '../../main'; -import {SeriesModel} from '../../models/SeriesModel'; import {GameModel} from '../../models/GameModel'; -import {contactEmail, debugLog, pluginName} from '../../utils/Utils'; +import {debugLog} from '../../utils/Utils'; import {requestUrl} from 'obsidian'; import {MediaType} from '../../utils/MediaType'; @@ -99,8 +97,10 @@ export class SteamAPI extends APIModel { released: !result.release_date?.comming_soon, releaseDate: (new Date(result.release_date?.date)).toLocaleDateString() ?? 'unknown', - played: false, - personalRating: 0, + userData: { + played: false, + personalRating: 0, + }, } as GameModel); return model; diff --git a/src/api/apis/WikipediaAPI.ts b/src/api/apis/WikipediaAPI.ts index 1387b65..096d1d4 100644 --- a/src/api/apis/WikipediaAPI.ts +++ b/src/api/apis/WikipediaAPI.ts @@ -71,6 +71,8 @@ export class WikipediaAPI extends APIModel { wikiUrl: result.fullurl, lastUpdated: (new Date(result.touched)).toLocaleDateString() ?? 'unknown', length: result.length, + + userData: {}, } as WikiModel); return model; diff --git a/src/main.ts b/src/main.ts index aa747dd..a93a63c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import {Notice, Plugin, TFile} from 'obsidian'; +import {FrontMatterCache, Notice, Plugin, TFile} from 'obsidian'; import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings'; import {APIManager} from './api/APIManager'; import {MediaTypeModel} from './models/MediaTypeModel'; @@ -130,21 +130,25 @@ export default class MediaDbPlugin extends Plugin { const activeLeaf: TFile = this.app.workspace.getActiveFile(); if (!activeLeaf.name) return; - let metadata = this.app.metadataCache.getFileCache(activeLeaf).frontmatter; + let metadata: FrontMatterCache = this.app.metadataCache.getFileCache(activeLeaf).frontmatter; - if (!metadata.type || !metadata.dataSource || !metadata.id) { + if (!metadata?.type || !metadata?.dataSource || !metadata?.id) { throw new Error('MDB | active note is not a Media DB entry or is missing metadata'); } - const newMetadata = await this.apiManager.queryDetailedInfo({dataSource: metadata.dataSource, id: metadata.id} as MediaTypeModel); + delete metadata.position; // remove unnecessary data from the FrontMatterCache + let oldMediaTypeModel = this.mediaTypeManager.createMediaTypeModelFromMediaType(metadata, metadata.type); - if (!newMetadata) { + let newMediaTypeModel = await this.apiManager.queryDetailedInfo({dataSource: metadata.dataSource, id: metadata.id} as MediaTypeModel); + if (!newMediaTypeModel) { return; } + newMediaTypeModel = Object.assign(oldMediaTypeModel, newMediaTypeModel.getWithOutUserData()); + console.log('MDB | deleting old entry'); await this.app.vault.delete(activeLeaf); - await this.createMediaDbNoteFromModel(newMetadata); + await this.createMediaDbNoteFromModel(newMediaTypeModel); } async loadSettings() { diff --git a/src/models/GameModel.ts b/src/models/GameModel.ts index 96bca40..d19dc2e 100644 --- a/src/models/GameModel.ts +++ b/src/models/GameModel.ts @@ -20,8 +20,10 @@ export class GameModel extends MediaTypeModel { released: boolean; releaseDate: string; - played: boolean; - personalRating: number; + userData: { + played: boolean; + personalRating: number; + }; constructor(obj: any = {}) { diff --git a/src/models/MediaTypeModel.ts b/src/models/MediaTypeModel.ts index c73a588..9c52813 100644 --- a/src/models/MediaTypeModel.ts +++ b/src/models/MediaTypeModel.ts @@ -1,5 +1,5 @@ import {MediaType} from '../utils/MediaType'; -import {stringifyYaml} from 'obsidian'; +import {YAMLConverter} from '../utils/YAMLConverter'; export abstract class MediaTypeModel { type: string; @@ -11,12 +11,20 @@ export abstract class MediaTypeModel { url: string; id: string; + userData: object; + abstract getMediaType(): MediaType; abstract getTags(): string[]; toMetaData(): string { - return stringifyYaml({...this, tags: '#' + this.getTags().join('/')}); + return YAMLConverter.toYaml({...this.getWithOutUserData(), ...this.userData, tags: '#' + this.getTags().join('/')}); + } + + getWithOutUserData(): object { + const copy = JSON.parse(JSON.stringify(this)); + delete copy.userData; + return copy; } } diff --git a/src/models/MovieModel.ts b/src/models/MovieModel.ts index c4fe66b..a761908 100644 --- a/src/models/MovieModel.ts +++ b/src/models/MovieModel.ts @@ -22,10 +22,11 @@ export class MovieModel extends MediaTypeModel { released: boolean; premiere: string; - watched: boolean; - lastWatched: string; - personalRating: number; - + userData: { + watched: boolean; + lastWatched: string; + personalRating: number; + }; constructor(obj: any = {}) { super(); diff --git a/src/models/MusicReleaseModel.ts b/src/models/MusicReleaseModel.ts index 10153cc..4094927 100644 --- a/src/models/MusicReleaseModel.ts +++ b/src/models/MusicReleaseModel.ts @@ -17,7 +17,9 @@ export class MusicReleaseModel extends MediaTypeModel { artists: string[]; rating: number; - personalRating: number; + userData: { + personalRating: number; + }; constructor(obj: any = {}) { super(); diff --git a/src/models/SeriesModel.ts b/src/models/SeriesModel.ts index 54afc78..5e49a59 100644 --- a/src/models/SeriesModel.ts +++ b/src/models/SeriesModel.ts @@ -25,10 +25,11 @@ export class SeriesModel extends MediaTypeModel { airedFrom: string; airedTo: string; - watched: boolean; - lastWatched: string; - personalRating: number; - + userData: { + watched: boolean; + lastWatched: string; + personalRating: number; + }; constructor(obj: any = {}) { super(); diff --git a/src/models/WikiModel.ts b/src/models/WikiModel.ts index a5dd1b7..6c067e9 100644 --- a/src/models/WikiModel.ts +++ b/src/models/WikiModel.ts @@ -17,6 +17,7 @@ export class WikiModel extends MediaTypeModel { lastUpdated: string; length: number; + userData: {}; constructor(obj: any = {}) { super(); diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index d85f14d..bd47d84 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -3,6 +3,11 @@ import {MediaType} from './MediaType'; import {MediaTypeModel} from '../models/MediaTypeModel'; import {replaceTags} from './Utils'; import {App, TFile} from 'obsidian'; +import {MovieModel} from '../models/MovieModel'; +import {SeriesModel} from '../models/SeriesModel'; +import {GameModel} from '../models/GameModel'; +import {WikiModel} from '../models/WikiModel'; +import {MusicReleaseModel} from '../models/MusicReleaseModel'; export class MediaTypeManager { mediaFileNameTemplateMap: Map; @@ -49,4 +54,20 @@ export class MediaTypeManager { // console.log(template); return replaceTags(template, mediaTypeModel); } + + createMediaTypeModelFromMediaType(obj: any, mediaType: MediaType): MediaTypeModel { + if (mediaType === MediaType.Movie) { + return new MovieModel(obj); + } else if (mediaType === MediaType.Series) { + return new SeriesModel(obj); + } else if (mediaType === MediaType.Game) { + return new GameModel(obj); + } else if (mediaType === MediaType.Wiki) { + return new WikiModel(obj); + } else if (mediaType === MediaType.MusicRelease) { + return new MusicReleaseModel(obj); + } + + return undefined; + } } diff --git a/src/utils/YAMLConverter.ts b/src/utils/YAMLConverter.ts new file mode 100644 index 0000000..a59d411 --- /dev/null +++ b/src/utils/YAMLConverter.ts @@ -0,0 +1,35 @@ +export class YAMLConverter { + static toYaml(obj: any): string { + let output = ''; + + for (const [key, value] of Object.entries(obj)) { + output += `${key}: ${YAMLConverter.toYamlString(value)}\n`; + } + + return output; + } + + private static toYamlString(value: any): string { + if (typeof value === 'boolean') { + return value ? 'true' : 'false'; + } else if (typeof value === 'number') { + return value.toString(); + } else if (typeof value === 'string') { + return '"' + value + '"'; + } else if (typeof value === 'object') { + let output = ''; + + if (Array.isArray(value)) { + for (const valueElement of value) { + output += `\n - ${YAMLConverter.toYamlString(valueElement)}`; + } + } else { + for (const [objKey, objValue] of Object.entries(value)) { + output += `\n ${objKey}: ${YAMLConverter.toYamlString(objValue)}`; + } + } + + return output; + } + } +}