Skip to content

Commit 317b430

Browse files
committed
Merge branch 'master' into release
2 parents 9779ad3 + e478875 commit 317b430

File tree

10 files changed

+144
-45
lines changed

10 files changed

+144
-45
lines changed

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"id": "obsidian-media-db-plugin",
33
"name": "Media DB Plugin",
4-
"version": "0.3.0",
4+
"version": "0.3.1",
55
"minAppVersion": "0.14.0",
66
"description": "A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.",
77
"author": "Moritz Jung",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "obsidian-media-db-plugin",
3-
"version": "0.3.0",
3+
"version": "0.3.1",
44
"description": "A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.",
55
"main": "main.js",
66
"scripts": {

src/api/apis/MALAPI.ts

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,20 @@ export class MALAPI extends APIModel {
4141
let ret: MediaTypeModel[] = [];
4242

4343
for (const result of data.data) {
44-
const type = this.typeMappings.get(result.type.toLowerCase());
44+
const type = this.typeMappings.get(result.type?.toLowerCase());
4545
if (type === undefined) {
46-
continue;
46+
ret.push(new MovieModel({
47+
subType: '',
48+
title: result.title,
49+
englishTitle: result.title_english ?? result.title,
50+
year: result.year ?? result.aired?.prop?.from?.year ?? '',
51+
dataSource: this.apiName,
52+
id: result.mal_id,
53+
} as MovieModel));
4754
}
4855
if (type === 'movie' || type === 'special') {
4956
ret.push(new MovieModel({
50-
type: type,
57+
subType: type,
5158
title: result.title,
5259
englishTitle: result.title_english ?? result.title,
5360
year: result.year ?? result.aired?.prop?.from?.year ?? '',
@@ -56,7 +63,7 @@ export class MALAPI extends APIModel {
5663
} as MovieModel));
5764
} else if (type === 'series' || type === 'ova') {
5865
ret.push(new SeriesModel({
59-
type: type,
66+
subType: type,
6067
title: result.title,
6168
englishTitle: result.title_english ?? result.title,
6269
year: result.year ?? result.aired?.prop?.from?.year ?? '',
@@ -83,14 +90,39 @@ export class MALAPI extends APIModel {
8390
debugLog(data);
8491
const result = data.data;
8592

86-
const type = this.typeMappings.get(result.type.toLowerCase());
93+
const type = this.typeMappings.get(result.type?.toLowerCase());
8794
if (type === undefined) {
88-
throw Error(`${result.type.toLowerCase()} is an unsupported type.`);
95+
const model = new MovieModel({
96+
subType: '',
97+
title: result.title,
98+
englishTitle: result.title_english ?? result.title,
99+
year: result.year ?? result.aired?.prop?.from?.year ?? '',
100+
dataSource: this.apiName,
101+
url: result.url,
102+
id: result.mal_id,
103+
104+
genres: result.genres?.map((x: any) => x.name) ?? [],
105+
producer: result.studios?.map((x: any) => x.name).join(', ') ?? 'unknown',
106+
duration: result.duration ?? 'unknown',
107+
onlineRating: result.score ?? 0,
108+
image: result.images?.jpg?.image_url ?? '',
109+
110+
released: true,
111+
premiere: (new Date(result.aired?.from)).toLocaleDateString() ?? 'unknown',
112+
113+
userData: {
114+
watched: false,
115+
lastWatched: '',
116+
personalRating: 0,
117+
},
118+
} as MovieModel);
119+
120+
return model;
89121
}
90122

91123
if (type === 'movie' || type === 'special') {
92124
const model = new MovieModel({
93-
type: type,
125+
subType: type,
94126
title: result.title,
95127
englishTitle: result.title_english ?? result.title,
96128
year: result.year ?? result.aired?.prop?.from?.year ?? '',
@@ -117,7 +149,7 @@ export class MALAPI extends APIModel {
117149
return model;
118150
} else if (type === 'series' || type === 'ova') {
119151
const model = new SeriesModel({
120-
type: type,
152+
subType: type,
121153
title: result.title,
122154
englishTitle: result.title_english ?? result.title,
123155
year: result.year ?? result.aired?.prop?.from?.year ?? '',

src/main.ts

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Notice, Plugin, TFile, TFolder} from 'obsidian';
1+
import {Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian';
22
import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
33
import {APIManager} from './api/APIManager';
44
import {MediaTypeModel} from './models/MediaTypeModel';
@@ -109,33 +109,13 @@ export default class MediaDbPlugin extends Plugin {
109109
console.log('MDB | Creating new note...');
110110
// console.log(mediaTypeModel);
111111

112-
let metadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject());
113-
if (attachFile) {
114-
let attachFileMetadata: any = this.app.metadataCache.getFileCache(attachFile).frontmatter;
115-
if (attachFileMetadata) {
116-
attachFileMetadata = JSON.parse(JSON.stringify(attachFileMetadata)); // deep copy
117-
delete attachFileMetadata.position;
118-
} else {
119-
attachFileMetadata = {};
120-
}
121-
122-
metadata = Object.assign(attachFileMetadata, metadata);
123-
}
124-
125-
debugLog(metadata);
112+
let fileMetadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject());
113+
let fileContent = '';
126114

127-
let fileContent = `---\n${YAMLConverter.toYaml(metadata)}---\n`;
115+
({fileMetadata, fileContent} = await this.attachFile(fileMetadata, fileContent, attachFile));
116+
({fileMetadata, fileContent} = await this.attachTemplate(fileMetadata, fileContent, await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app)));
128117

129-
if (this.settings.templates) {
130-
fileContent += await this.mediaTypeManager.getContent(mediaTypeModel, this.app);
131-
}
132-
133-
if (attachFile) {
134-
let attachFileContent: string = await this.app.vault.read(attachFile);
135-
const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---');
136-
attachFileContent = attachFileContent.replace(regExp, '');
137-
fileContent += '\n\n' + attachFileContent;
138-
}
118+
fileContent = `---\n${this.settings.useCustomYamlStringifier ? YAMLConverter.toYaml(fileMetadata) : stringifyYaml(fileMetadata)}---\n` + fileContent;
139119

140120
await this.createNote(this.mediaTypeManager.getFileName(mediaTypeModel), fileContent);
141121
} catch (e) {
@@ -144,6 +124,67 @@ export default class MediaDbPlugin extends Plugin {
144124
}
145125
}
146126

127+
async attachFile(fileMetadata: any, fileContent: string, fileToAttach?: TFile): Promise<{ fileMetadata: any, fileContent: string }> {
128+
if (!fileToAttach) {
129+
return {fileMetadata: fileMetadata, fileContent: fileContent};
130+
}
131+
132+
let attachFileMetadata: any = this.app.metadataCache.getFileCache(fileToAttach).frontmatter;
133+
if (attachFileMetadata) {
134+
attachFileMetadata = JSON.parse(JSON.stringify(attachFileMetadata)); // deep copy
135+
delete attachFileMetadata.position;
136+
} else {
137+
attachFileMetadata = {};
138+
}
139+
fileMetadata = Object.assign(attachFileMetadata, fileMetadata);
140+
141+
let attachFileContent: string = await this.app.vault.read(fileToAttach);
142+
const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---');
143+
attachFileContent = attachFileContent.replace(regExp, '');
144+
fileContent += '\n' + attachFileContent;
145+
146+
return {fileMetadata: fileMetadata, fileContent: fileContent};
147+
}
148+
149+
async attachTemplate(fileMetadata: any, fileContent: string, template: string): Promise<{ fileMetadata: any, fileContent: string }> {
150+
if (!template) {
151+
return {fileMetadata: fileMetadata, fileContent: fileContent};
152+
}
153+
154+
let templateMetadata: any = this.getMetaDataFromFileContent(template);
155+
fileMetadata = Object.assign(templateMetadata, fileMetadata);
156+
157+
const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---');
158+
const attachFileContent = template.replace(regExp, '');
159+
fileContent += '\n' + attachFileContent;
160+
161+
return {fileMetadata: fileMetadata, fileContent: fileContent};
162+
}
163+
164+
getMetaDataFromFileContent(fileContent: string): any {
165+
let metadata: any;
166+
167+
const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---');
168+
const frontMatterRegExpResult = regExp.exec(fileContent);
169+
if (!frontMatterRegExpResult) {
170+
return {};
171+
}
172+
let frontMatter = frontMatterRegExpResult[0];
173+
if (!frontMatter) {
174+
return {};
175+
}
176+
frontMatter = frontMatter.substring(4);
177+
frontMatter = frontMatter.substring(0, frontMatter.length - 3);
178+
179+
metadata = parseYaml(frontMatter);
180+
181+
if (!metadata) {
182+
metadata = {};
183+
}
184+
185+
return metadata;
186+
}
187+
147188
async createNote(fileName: string, fileContent: string, openFile: boolean = false) {
148189
fileName = replaceIllegalFileNameCharactersInString(fileName);
149190
const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`;

src/modals/MediaDbFolderImportModal.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class MediaDbFolderImportModal extends Modal {
4646
const appendContentToggleElementWrapper = contentEl.createEl('div', {cls: 'media-db-plugin-list-wrapper'});
4747
const appendContentToggleTextWrapper = appendContentToggleElementWrapper.createEl('div', {cls: 'media-db-plugin-list-text-wrapper'});
4848
appendContentToggleTextWrapper.createEl('span', {
49-
text: 'If this is enabled, the plugin will override meta data fields with the same name.',
49+
text: 'If this is enabled, the plugin will override metadata fields with the same name.',
5050
cls: 'media-db-plugin-list-text',
5151
});
5252

@@ -59,7 +59,7 @@ export class MediaDbFolderImportModal extends Modal {
5959

6060

6161
contentEl.createDiv({cls: 'media-db-plugin-spacer'});
62-
contentEl.createEl('h3', {text: 'The name of the mata data field that should be used as the title to query'});
62+
contentEl.createEl('h3', {text: 'The name of the metadata field that should be used as the title to query.'});
6363

6464
const placeholder = 'title';
6565
const titleFieldNameComponent = new TextComponent(contentEl);

src/modals/SelectModal.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,13 @@ export abstract class SelectModal<T> extends Modal {
7272
contentEl.createEl('h2', {text: this.title});
7373
contentEl.createEl('p', {text: this.description});
7474

75+
contentEl.addClass('media-db-plugin-select-modal');
76+
7577
const elementWrapper = contentEl.createDiv({cls: 'media-db-plugin-select-wrapper'});
7678

7779
let i = 0;
7880
for (const element of this.elements) {
79-
const selectModalElement = new SelectModalElement(element, contentEl, i, this, false);
81+
const selectModalElement = new SelectModalElement(element, elementWrapper, i, this, false);
8082

8183
this.selectModalElements.push(selectModalElement);
8284

@@ -85,6 +87,8 @@ export abstract class SelectModal<T> extends Modal {
8587
i += 1;
8688
}
8789

90+
this.selectModalElements.first()?.element.scrollIntoView();
91+
8892
const bottomSetting = new Setting(contentEl);
8993
bottomSetting.addButton(btn => btn.setButtonText('Cancel').onClick(() => this.close()));
9094
if (this.skipButton) {

src/settings/Settings.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ import {FileSuggest} from './suggesters/FileSuggest';
77

88
export interface MediaDbPluginSettings {
99
folder: string,
10-
sfwFilter: boolean,
1110
OMDbKey: string,
11+
sfwFilter: boolean,
12+
useCustomYamlStringifier: boolean;
13+
templates: boolean,
14+
1215

1316
movieTemplate: string,
1417
seriesTemplate: string,
@@ -28,13 +31,14 @@ export interface MediaDbPluginSettings {
2831
wikiPropertyConversionRules: string,
2932
musicReleasePropertyConversionRules: string,
3033

31-
templates: boolean,
3234
}
3335

3436
export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
3537
folder: 'Media DB',
36-
sfwFilter: true,
3738
OMDbKey: '',
39+
sfwFilter: true,
40+
useCustomYamlStringifier: true,
41+
templates: true,
3842

3943
movieTemplate: '',
4044
seriesTemplate: '',
@@ -54,7 +58,7 @@ export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
5458
wikiPropertyConversionRules: '',
5559
musicReleasePropertyConversionRules: '',
5660

57-
templates: true,
61+
5862
};
5963

6064
export class MediaDbSettingTab extends PluginSettingTab {
@@ -108,6 +112,17 @@ export class MediaDbSettingTab extends PluginSettingTab {
108112
});
109113
});
110114

115+
new Setting(containerEl)
116+
.setName('YAML formatter')
117+
.setDesc('Add optional quotation marks around strings in the metadata block.')
118+
.addToggle(cb => {
119+
cb.setValue(this.plugin.settings.useCustomYamlStringifier)
120+
.onChange(data => {
121+
this.plugin.settings.useCustomYamlStringifier = data;
122+
this.plugin.saveSettings();
123+
});
124+
});
125+
111126
new Setting(containerEl)
112127
.setName('Resolve {{ tags }} in templates')
113128
.setDesc('Whether to resolve {{ tags }} in templates. The spaces inside the curly braces are important.')

src/utils/MediaTypeManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export class MediaTypeManager {
3737
return replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType()), mediaTypeModel);
3838
}
3939

40-
async getContent(mediaTypeModel: MediaTypeModel, app: App) {
40+
async getTemplate(mediaTypeModel: MediaTypeModel, app: App) {
4141
const templateFileName = this.mediaTemplateMap.get(mediaTypeModel.getMediaType());
4242

4343
if (!templateFileName) {

src/utils/Utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {MediaTypeModel} from '../models/MediaTypeModel';
44
export const pluginName: string = 'obsidian-media-db-plugin';
55
export const contactEmail: string = '[email protected]';
66
export const mediaDbTag: string = 'mediaDB';
7-
export const mediaDbVersion: string = '0.3.0';
7+
export const mediaDbVersion: string = '0.3.1';
88
export const debug: boolean = false;
99

1010
export function wrapAround(value: number, size: number): number {

styles.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,15 @@ small.media-db-plugin-list-text{
2222
color: var(--text-muted);
2323
}
2424

25+
.media-db-plugin-select-modal {
26+
display: flex;
27+
flex-direction: column;
28+
}
29+
2530
.media-db-plugin-select-wrapper {
2631
margin: 5px;
32+
flex: 1;
33+
overflow-y: auto;
2734
}
2835

2936
.media-db-plugin-select-element {

0 commit comments

Comments
 (0)