Own YAML Converter and update note won't override user data anymore

This commit is contained in:
mProjectsCode 2022-05-31 22:26:45 +02:00
parent 5916ed66eb
commit 0298270b03
14 changed files with 129 additions and 38 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 = {}) {

View file

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

View file

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

View file

@ -17,7 +17,9 @@ export class MusicReleaseModel extends MediaTypeModel {
artists: string[];
rating: number;
personalRating: number;
userData: {
personalRating: number;
};
constructor(obj: any = {}) {
super();

View file

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

View file

@ -17,6 +17,7 @@ export class WikiModel extends MediaTypeModel {
lastUpdated: string;
length: number;
userData: {};
constructor(obj: any = {}) {
super();

View file

@ -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<MediaType, string>;
@ -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;
}
}

View file

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