Skip to content

Commit 2c57094

Browse files
committed
Templates for file names #8
1 parent 16299fe commit 2c57094

14 files changed

+232
-116
lines changed

src/main.ts

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ import {Notice, Plugin, TFile} from 'obsidian';
22
import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
33
import {APIManager} from './api/APIManager';
44
import {MediaTypeModel} from './models/MediaTypeModel';
5-
import {replaceIllegalFileNameCharactersInString, replaceTags} from './utils/Utils';
5+
import {replaceIllegalFileNameCharactersInString} from './utils/Utils';
66
import {OMDbAPI} from './api/apis/OMDbAPI';
77
import {MediaDbAdvancedSearchModal} from './modals/MediaDbAdvancedSearchModal';
88
import {MediaDbSearchResultModal} from './modals/MediaDbSearchResultModal';
99
import {MALAPI} from './api/apis/MALAPI';
1010
import {MediaDbIdSearchModal} from './modals/MediaDbIdSearchModal';
1111
import {WikipediaAPI} from './api/apis/WikipediaAPI';
1212
import {MusicBrainzAPI} from './api/apis/MusicBrainzAPI';
13+
import {MediaTypeManager} from './utils/MediaTypeManager';
1314

1415
export default class MediaDbPlugin extends Plugin {
1516
settings: MediaDbPluginSettings;
1617
apiManager: APIManager;
18+
mediaTypeManager: MediaTypeManager;
1719

1820
async onload() {
1921
await this.loadSettings();
@@ -54,6 +56,8 @@ export default class MediaDbPlugin extends Plugin {
5456
this.apiManager.registerAPI(new WikipediaAPI(this));
5557
this.apiManager.registerAPI(new MusicBrainzAPI(this));
5658
// this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data
59+
60+
this.mediaTypeManager = new MediaTypeManager(this.settings);
5761
}
5862

5963
async createMediaDbNote(modal: () => Promise<MediaTypeModel>): Promise<void> {
@@ -68,37 +72,18 @@ export default class MediaDbPlugin extends Plugin {
6872
}
6973
}
7074

71-
async createMediaDbNoteFromModel(data: MediaTypeModel): Promise<void> {
75+
async createMediaDbNoteFromModel(mediaTypeModel: MediaTypeModel): Promise<void> {
7276
try {
7377
console.log('MDB | Creating new note...');
74-
// console.log(data);
75-
76-
let fileContent = `---\n${data.toMetaData()}---\n`;
77-
78-
let templateFile: TFile = null;
79-
80-
if (data.type === 'movie' && this.settings.movieTemplate) {
81-
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.movieTemplate).first();
82-
} else if (data.type === 'series' && this.settings.seriesTemplate) {
83-
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.seriesTemplate).first();
84-
} else if (data.type === 'game' && this.settings.gameTemplate) {
85-
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first();
86-
} else if (data.type === 'wiki' && this.settings.wikiTemplate) {
87-
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.wikiTemplate).first();
88-
} else if (data.type === 'musicRelease' && this.settings.musicReleaseTemplate) {
89-
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.musicReleaseTemplate).first();
90-
}
78+
// console.log(mediaTypeModel);
79+
80+
let fileContent = `---\n${mediaTypeModel.toMetaData()}---\n`;
9181

92-
if (templateFile) {
93-
let template = await this.app.vault.cachedRead(templateFile);
94-
// console.log(template);
95-
if (this.settings.templates) {
96-
template = replaceTags(template, data);
97-
}
98-
fileContent += template;
82+
if (this.settings.templates) {
83+
fileContent += await this.mediaTypeManager.getContent(mediaTypeModel, this.app);
9984
}
10085

101-
const fileName = replaceIllegalFileNameCharactersInString(data.getFileName());
86+
const fileName = replaceIllegalFileNameCharactersInString(this.mediaTypeManager.getFileName(mediaTypeModel));
10287
const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`;
10388

10489
await this.app.vault.delete(this.app.vault.getAbstractFileByPath(filePath));
@@ -120,9 +105,9 @@ export default class MediaDbPlugin extends Plugin {
120105

121106
async openMediaDbSearchModal(): Promise<MediaTypeModel> {
122107
return new Promise(((resolve, reject) => {
123-
new MediaDbAdvancedSearchModal(this.app, this.apiManager, (err, results) => {
108+
new MediaDbAdvancedSearchModal(this.app, this, (err, results) => {
124109
if (err) return reject(err);
125-
new MediaDbSearchResultModal(this.app, results, (err2, res) => {
110+
new MediaDbSearchResultModal(this.app, this, results, (err2, res) => {
126111
if (err2) return reject(err2);
127112
resolve(res);
128113
}).open();
@@ -132,7 +117,7 @@ export default class MediaDbPlugin extends Plugin {
132117

133118
async openMediaDbIdSearchModal(): Promise<MediaTypeModel> {
134119
return new Promise(((resolve, reject) => {
135-
new MediaDbIdSearchModal(this.app, this.apiManager, (err, res) => {
120+
new MediaDbIdSearchModal(this.app, this, (err, res) => {
136121
if (err) return reject(err);
137122
resolve(res);
138123
}).open();
@@ -165,6 +150,7 @@ export default class MediaDbPlugin extends Plugin {
165150
}
166151

167152
async saveSettings() {
153+
this.mediaTypeManager.updateTemplates(this.settings);
168154
await this.saveData(this.settings);
169155
}
170156
}

src/modals/MediaDbAdvancedSearchModal.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import {App, ButtonComponent, Component, Modal, Notice, Setting, TextComponent, ToggleComponent} from 'obsidian';
22
import {MediaTypeModel} from '../models/MediaTypeModel';
3-
import {APIManager} from '../api/APIManager';
43
import {debugLog} from '../utils/Utils';
4+
import MediaDbPlugin from '../main';
55

66
export class MediaDbAdvancedSearchModal extends Modal {
77
query: string;
88
isBusy: boolean;
9-
apiManager: APIManager;
9+
plugin: MediaDbPlugin;
1010
searchBtn: ButtonComponent;
1111
selectedApis: any;
1212
onSubmit: (err: Error, result?: MediaTypeModel[]) => void;
1313

14-
constructor(app: App, apiManager: APIManager, onSubmit?: (err: Error, result?: MediaTypeModel[]) => void) {
14+
constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (err: Error, result?: MediaTypeModel[]) => void) {
1515
super(app);
16-
this.apiManager = apiManager;
16+
this.plugin = plugin;
1717
this.onSubmit = onSubmit;
1818
this.selectedApis = [];
19-
for (const api of this.apiManager.apis) {
19+
for (const api of this.plugin.apiManager.apis) {
2020
this.selectedApis[api.apiName] = false;
2121
}
2222
}
@@ -56,7 +56,7 @@ export class MediaDbAdvancedSearchModal extends Modal {
5656

5757
console.log(`MDB | query started with title ${this.query}`);
5858

59-
const res = await this.apiManager.query(this.query, this.selectedApis);
59+
const res = await this.plugin.apiManager.query(this.query, this.selectedApis);
6060
this.onSubmit(null, res);
6161
} catch (e) {
6262
this.onSubmit(e);
@@ -84,7 +84,7 @@ export class MediaDbAdvancedSearchModal extends Modal {
8484
contentEl.createEl('h3', {text: 'APIs to search'});
8585

8686
const apiToggleComponents: Component[] = [];
87-
for (const api of this.apiManager.apis) {
87+
for (const api of this.plugin.apiManager.apis) {
8888
const apiToggleListElementWrapper = contentEl.createEl('div', {cls: 'media-db-plugin-list-wrapper'});
8989

9090
const apiToggleTextWrapper = apiToggleListElementWrapper.createEl('div', {cls: 'media-db-plugin-list-text-wrapper'});

src/modals/MediaDbIdSearchModal.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import {App, ButtonComponent, DropdownComponent, Modal, Notice, Setting, TextComponent} from 'obsidian';
22
import {MediaTypeModel} from '../models/MediaTypeModel';
3-
import {APIManager} from '../api/APIManager';
43
import {debugLog} from '../utils/Utils';
4+
import MediaDbPlugin from '../main';
55

66
export class MediaDbIdSearchModal extends Modal {
77
query: string;
88
isBusy: boolean;
9-
apiManager: APIManager;
9+
plugin: MediaDbPlugin;
1010
searchBtn: ButtonComponent;
1111
selectedApi: string;
1212
onSubmit: (err: Error, result?: MediaTypeModel) => void;
1313

14-
constructor(app: App, apiManager: APIManager, onSubmit?: (err: Error, result?: MediaTypeModel) => void) {
14+
constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (err: Error, result?: MediaTypeModel) => void) {
1515
super(app);
16-
this.apiManager = apiManager;
16+
this.plugin = plugin;
1717
this.onSubmit = onSubmit;
1818
this.selectedApi = '';
1919
}
@@ -46,7 +46,7 @@ export class MediaDbIdSearchModal extends Modal {
4646

4747
console.log(`MDB | query started with id ${this.query}`);
4848

49-
const api = this.apiManager.getApiByName(this.selectedApi);
49+
const api = this.plugin.apiManager.getApiByName(this.selectedApi);
5050
if (!api) {
5151
this.onSubmit(new Error('the selected api does not exist'));
5252
}
@@ -83,7 +83,7 @@ export class MediaDbIdSearchModal extends Modal {
8383
apiSelectorComponent.onChange((value: string) => {
8484
this.selectedApi = value;
8585
});
86-
for (const api of this.apiManager.apis) {
86+
for (const api of this.plugin.apiManager.apis) {
8787
apiSelectorComponent.addOption(api.apiName, api.apiName);
8888
}
8989
apiSelectorWrapper.appendChild(apiSelectorComponent.selectEl);

src/modals/MediaDbSearchResultModal.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import {App, SuggestModal} from 'obsidian';
22
import {MediaTypeModel} from '../models/MediaTypeModel';
3+
import MediaDbPlugin from '../main';
34

45
export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
56
suggestion: MediaTypeModel[];
7+
plugin: MediaDbPlugin;
68
onChoose: (error: Error, result?: MediaTypeModel) => void;
79

8-
constructor(app: App, suggestion: MediaTypeModel[], onChoose: (error: Error, result?: MediaTypeModel) => void) {
10+
constructor(app: App, plugin: MediaDbPlugin, suggestion: MediaTypeModel[], onChoose: (error: Error, result?: MediaTypeModel) => void) {
911
super(app);
12+
this.plugin = plugin;
1013
this.suggestion = suggestion;
1114
this.onChoose = onChoose;
1215
}
@@ -20,9 +23,9 @@ export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
2023

2124
// Renders each suggestion item.
2225
renderSuggestion(item: MediaTypeModel, el: HTMLElement) {
23-
el.createEl('div', {text: item.getFileName()});
26+
el.createEl('div', {text: this.plugin.mediaTypeManager.getFileName(item)});
2427
el.createEl('small', {text: `${item.englishTitle}\n`});
25-
el.createEl('small', {text: `${item.type.toUpperCase()} from ${item.dataSource}`});
28+
el.createEl('small', {text: `${item.type.toUpperCase() + (item.subType ? ` (${item.subType})` : '')} from ${item.dataSource}`});
2629
}
2730

2831
// Perform action on the selected suggestion.

src/models/GameModel.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {MediaTypeModel} from './MediaTypeModel';
2-
import {stringifyYaml} from 'obsidian';
32
import {mediaDbTag} from '../utils/Utils';
3+
import {MediaType} from '../utils/MediaType';
44

55

66
export class GameModel extends MediaTypeModel {
@@ -29,19 +29,15 @@ export class GameModel extends MediaTypeModel {
2929

3030
Object.assign(this, obj);
3131

32-
this.type = 'game';
33-
}
34-
35-
toMetaData(): string {
36-
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
37-
}
38-
39-
getFileName(): string {
40-
return this.title + (this.year ? ` (${this.year})` : '');
32+
this.type = this.getMediaType();
4133
}
4234

4335
getTags(): string[] {
4436
return [mediaDbTag, 'game'];
4537
}
4638

39+
getMediaType(): MediaType {
40+
return MediaType.Game;
41+
}
42+
4743
}

src/models/MediaTypeModel.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import {MediaType} from '../utils/MediaType';
2+
import {stringifyYaml} from 'obsidian';
3+
14
export abstract class MediaTypeModel {
25
type: string;
36
subType: string;
@@ -8,10 +11,12 @@ export abstract class MediaTypeModel {
811
url: string;
912
id: string;
1013

11-
abstract toMetaData(): string;
12-
13-
abstract getFileName(): string;
14+
abstract getMediaType(): MediaType;
1415

1516
abstract getTags(): string[];
1617

18+
toMetaData(): string {
19+
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
20+
}
21+
1722
}

src/models/MovieModel.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {MediaTypeModel} from './MediaTypeModel';
2-
import {stringifyYaml} from 'obsidian';
32
import {mediaDbTag} from '../utils/Utils';
3+
import {MediaType} from '../utils/MediaType';
44

55

66
export class MovieModel extends MediaTypeModel {
@@ -32,19 +32,15 @@ export class MovieModel extends MediaTypeModel {
3232

3333
Object.assign(this, obj);
3434

35-
this.type = 'movie';
36-
}
37-
38-
toMetaData(): string {
39-
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
40-
}
41-
42-
getFileName(): string {
43-
return this.title + (this.year ? ` (${this.year})` : '');
35+
this.type = this.getMediaType();
4436
}
4537

4638
getTags(): string[] {
4739
return [mediaDbTag, 'tv', 'movie'];
4840
}
4941

42+
getMediaType(): MediaType {
43+
return MediaType.Movie;
44+
}
45+
5046
}

src/models/MusicReleaseModel.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {MediaTypeModel} from './MediaTypeModel';
2-
import {stringifyYaml} from 'obsidian';
32
import {mediaDbTag} from '../utils/Utils';
3+
import {MediaType} from '../utils/MediaType';
44

55

66
export class MusicReleaseModel extends MediaTypeModel {
@@ -24,19 +24,15 @@ export class MusicReleaseModel extends MediaTypeModel {
2424

2525
Object.assign(this, obj);
2626

27-
this.type = 'musicRelease';
28-
}
29-
30-
toMetaData(): string {
31-
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
32-
}
33-
34-
getFileName(): string {
35-
return this.title + ' (' + this.artists.join(', ') + ' - ' + this.year + ' - ' + this.subType + ')';
27+
this.type = this.getMediaType();
3628
}
3729

3830
getTags(): string[] {
3931
return [mediaDbTag, 'music', 'album'];
4032
}
4133

34+
getMediaType(): MediaType {
35+
return MediaType.MusicRelease;
36+
}
37+
4238
}

src/models/SeriesModel.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {MediaTypeModel} from './MediaTypeModel';
2-
import {stringifyYaml} from 'obsidian';
32
import {mediaDbTag} from '../utils/Utils';
3+
import {MediaType} from '../utils/MediaType';
44

55

66
export class SeriesModel extends MediaTypeModel {
@@ -35,19 +35,15 @@ export class SeriesModel extends MediaTypeModel {
3535

3636
Object.assign(this, obj);
3737

38-
this.type = 'series';
39-
}
40-
41-
toMetaData(): string {
42-
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
43-
}
44-
45-
getFileName(): string {
46-
return this.title + ' (' + this.year + ')';
38+
this.type = this.getMediaType();
4739
}
4840

4941
getTags(): string[] {
5042
return [mediaDbTag, 'tv', 'series'];
5143
}
5244

45+
getMediaType(): MediaType {
46+
return MediaType.Series;
47+
}
48+
5349
}

0 commit comments

Comments
 (0)