Own YAML Converter and update note won't override user data anymore
This commit is contained in:
parent
5916ed66eb
commit
0298270b03
14 changed files with 129 additions and 38 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
16
src/main.ts
16
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() {
|
||||
|
|
|
|||
|
|
@ -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 = {}) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -17,7 +17,9 @@ export class MusicReleaseModel extends MediaTypeModel {
|
|||
artists: string[];
|
||||
rating: number;
|
||||
|
||||
personalRating: number;
|
||||
userData: {
|
||||
personalRating: number;
|
||||
};
|
||||
|
||||
constructor(obj: any = {}) {
|
||||
super();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ export class WikiModel extends MediaTypeModel {
|
|||
lastUpdated: string;
|
||||
length: number;
|
||||
|
||||
userData: {};
|
||||
|
||||
constructor(obj: any = {}) {
|
||||
super();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
35
src/utils/YAMLConverter.ts
Normal file
35
src/utils/YAMLConverter.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue