Templates for file names #8
This commit is contained in:
parent
16299feced
commit
2c57094332
14 changed files with 231 additions and 115 deletions
44
src/main.ts
44
src/main.ts
|
|
@ -2,7 +2,7 @@ import {Notice, Plugin, TFile} from 'obsidian';
|
||||||
import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
|
import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
|
||||||
import {APIManager} from './api/APIManager';
|
import {APIManager} from './api/APIManager';
|
||||||
import {MediaTypeModel} from './models/MediaTypeModel';
|
import {MediaTypeModel} from './models/MediaTypeModel';
|
||||||
import {replaceIllegalFileNameCharactersInString, replaceTags} from './utils/Utils';
|
import {replaceIllegalFileNameCharactersInString} from './utils/Utils';
|
||||||
import {OMDbAPI} from './api/apis/OMDbAPI';
|
import {OMDbAPI} from './api/apis/OMDbAPI';
|
||||||
import {MediaDbAdvancedSearchModal} from './modals/MediaDbAdvancedSearchModal';
|
import {MediaDbAdvancedSearchModal} from './modals/MediaDbAdvancedSearchModal';
|
||||||
import {MediaDbSearchResultModal} from './modals/MediaDbSearchResultModal';
|
import {MediaDbSearchResultModal} from './modals/MediaDbSearchResultModal';
|
||||||
|
|
@ -10,10 +10,12 @@ import {MALAPI} from './api/apis/MALAPI';
|
||||||
import {MediaDbIdSearchModal} from './modals/MediaDbIdSearchModal';
|
import {MediaDbIdSearchModal} from './modals/MediaDbIdSearchModal';
|
||||||
import {WikipediaAPI} from './api/apis/WikipediaAPI';
|
import {WikipediaAPI} from './api/apis/WikipediaAPI';
|
||||||
import {MusicBrainzAPI} from './api/apis/MusicBrainzAPI';
|
import {MusicBrainzAPI} from './api/apis/MusicBrainzAPI';
|
||||||
|
import {MediaTypeManager} from './utils/MediaTypeManager';
|
||||||
|
|
||||||
export default class MediaDbPlugin extends Plugin {
|
export default class MediaDbPlugin extends Plugin {
|
||||||
settings: MediaDbPluginSettings;
|
settings: MediaDbPluginSettings;
|
||||||
apiManager: APIManager;
|
apiManager: APIManager;
|
||||||
|
mediaTypeManager: MediaTypeManager;
|
||||||
|
|
||||||
async onload() {
|
async onload() {
|
||||||
await this.loadSettings();
|
await this.loadSettings();
|
||||||
|
|
@ -54,6 +56,8 @@ export default class MediaDbPlugin extends Plugin {
|
||||||
this.apiManager.registerAPI(new WikipediaAPI(this));
|
this.apiManager.registerAPI(new WikipediaAPI(this));
|
||||||
this.apiManager.registerAPI(new MusicBrainzAPI(this));
|
this.apiManager.registerAPI(new MusicBrainzAPI(this));
|
||||||
// this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data
|
// this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data
|
||||||
|
|
||||||
|
this.mediaTypeManager = new MediaTypeManager(this.settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
async createMediaDbNote(modal: () => Promise<MediaTypeModel>): Promise<void> {
|
async createMediaDbNote(modal: () => Promise<MediaTypeModel>): Promise<void> {
|
||||||
|
|
@ -68,37 +72,18 @@ export default class MediaDbPlugin extends Plugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async createMediaDbNoteFromModel(data: MediaTypeModel): Promise<void> {
|
async createMediaDbNoteFromModel(mediaTypeModel: MediaTypeModel): Promise<void> {
|
||||||
try {
|
try {
|
||||||
console.log('MDB | Creating new note...');
|
console.log('MDB | Creating new note...');
|
||||||
// console.log(data);
|
// console.log(mediaTypeModel);
|
||||||
|
|
||||||
let fileContent = `---\n${data.toMetaData()}---\n`;
|
let fileContent = `---\n${mediaTypeModel.toMetaData()}---\n`;
|
||||||
|
|
||||||
let templateFile: TFile = null;
|
if (this.settings.templates) {
|
||||||
|
fileContent += await this.mediaTypeManager.getContent(mediaTypeModel, this.app);
|
||||||
if (data.type === 'movie' && this.settings.movieTemplate) {
|
|
||||||
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.movieTemplate).first();
|
|
||||||
} else if (data.type === 'series' && this.settings.seriesTemplate) {
|
|
||||||
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.seriesTemplate).first();
|
|
||||||
} else if (data.type === 'game' && this.settings.gameTemplate) {
|
|
||||||
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first();
|
|
||||||
} else if (data.type === 'wiki' && this.settings.wikiTemplate) {
|
|
||||||
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.wikiTemplate).first();
|
|
||||||
} else if (data.type === 'musicRelease' && this.settings.musicReleaseTemplate) {
|
|
||||||
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.musicReleaseTemplate).first();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (templateFile) {
|
const fileName = replaceIllegalFileNameCharactersInString(this.mediaTypeManager.getFileName(mediaTypeModel));
|
||||||
let template = await this.app.vault.cachedRead(templateFile);
|
|
||||||
// console.log(template);
|
|
||||||
if (this.settings.templates) {
|
|
||||||
template = replaceTags(template, data);
|
|
||||||
}
|
|
||||||
fileContent += template;
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileName = replaceIllegalFileNameCharactersInString(data.getFileName());
|
|
||||||
const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`;
|
const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`;
|
||||||
|
|
||||||
await this.app.vault.delete(this.app.vault.getAbstractFileByPath(filePath));
|
await this.app.vault.delete(this.app.vault.getAbstractFileByPath(filePath));
|
||||||
|
|
@ -120,9 +105,9 @@ export default class MediaDbPlugin extends Plugin {
|
||||||
|
|
||||||
async openMediaDbSearchModal(): Promise<MediaTypeModel> {
|
async openMediaDbSearchModal(): Promise<MediaTypeModel> {
|
||||||
return new Promise(((resolve, reject) => {
|
return new Promise(((resolve, reject) => {
|
||||||
new MediaDbAdvancedSearchModal(this.app, this.apiManager, (err, results) => {
|
new MediaDbAdvancedSearchModal(this.app, this, (err, results) => {
|
||||||
if (err) return reject(err);
|
if (err) return reject(err);
|
||||||
new MediaDbSearchResultModal(this.app, results, (err2, res) => {
|
new MediaDbSearchResultModal(this.app, this, results, (err2, res) => {
|
||||||
if (err2) return reject(err2);
|
if (err2) return reject(err2);
|
||||||
resolve(res);
|
resolve(res);
|
||||||
}).open();
|
}).open();
|
||||||
|
|
@ -132,7 +117,7 @@ export default class MediaDbPlugin extends Plugin {
|
||||||
|
|
||||||
async openMediaDbIdSearchModal(): Promise<MediaTypeModel> {
|
async openMediaDbIdSearchModal(): Promise<MediaTypeModel> {
|
||||||
return new Promise(((resolve, reject) => {
|
return new Promise(((resolve, reject) => {
|
||||||
new MediaDbIdSearchModal(this.app, this.apiManager, (err, res) => {
|
new MediaDbIdSearchModal(this.app, this, (err, res) => {
|
||||||
if (err) return reject(err);
|
if (err) return reject(err);
|
||||||
resolve(res);
|
resolve(res);
|
||||||
}).open();
|
}).open();
|
||||||
|
|
@ -165,6 +150,7 @@ export default class MediaDbPlugin extends Plugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
async saveSettings() {
|
async saveSettings() {
|
||||||
|
this.mediaTypeManager.updateTemplates(this.settings);
|
||||||
await this.saveData(this.settings);
|
await this.saveData(this.settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
import {App, ButtonComponent, Component, Modal, Notice, Setting, TextComponent, ToggleComponent} from 'obsidian';
|
import {App, ButtonComponent, Component, Modal, Notice, Setting, TextComponent, ToggleComponent} from 'obsidian';
|
||||||
import {MediaTypeModel} from '../models/MediaTypeModel';
|
import {MediaTypeModel} from '../models/MediaTypeModel';
|
||||||
import {APIManager} from '../api/APIManager';
|
|
||||||
import {debugLog} from '../utils/Utils';
|
import {debugLog} from '../utils/Utils';
|
||||||
|
import MediaDbPlugin from '../main';
|
||||||
|
|
||||||
export class MediaDbAdvancedSearchModal extends Modal {
|
export class MediaDbAdvancedSearchModal extends Modal {
|
||||||
query: string;
|
query: string;
|
||||||
isBusy: boolean;
|
isBusy: boolean;
|
||||||
apiManager: APIManager;
|
plugin: MediaDbPlugin;
|
||||||
searchBtn: ButtonComponent;
|
searchBtn: ButtonComponent;
|
||||||
selectedApis: any;
|
selectedApis: any;
|
||||||
onSubmit: (err: Error, result?: MediaTypeModel[]) => void;
|
onSubmit: (err: Error, result?: MediaTypeModel[]) => void;
|
||||||
|
|
||||||
constructor(app: App, apiManager: APIManager, onSubmit?: (err: Error, result?: MediaTypeModel[]) => void) {
|
constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (err: Error, result?: MediaTypeModel[]) => void) {
|
||||||
super(app);
|
super(app);
|
||||||
this.apiManager = apiManager;
|
this.plugin = plugin;
|
||||||
this.onSubmit = onSubmit;
|
this.onSubmit = onSubmit;
|
||||||
this.selectedApis = [];
|
this.selectedApis = [];
|
||||||
for (const api of this.apiManager.apis) {
|
for (const api of this.plugin.apiManager.apis) {
|
||||||
this.selectedApis[api.apiName] = false;
|
this.selectedApis[api.apiName] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -56,7 +56,7 @@ export class MediaDbAdvancedSearchModal extends Modal {
|
||||||
|
|
||||||
console.log(`MDB | query started with title ${this.query}`);
|
console.log(`MDB | query started with title ${this.query}`);
|
||||||
|
|
||||||
const res = await this.apiManager.query(this.query, this.selectedApis);
|
const res = await this.plugin.apiManager.query(this.query, this.selectedApis);
|
||||||
this.onSubmit(null, res);
|
this.onSubmit(null, res);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.onSubmit(e);
|
this.onSubmit(e);
|
||||||
|
|
@ -84,7 +84,7 @@ export class MediaDbAdvancedSearchModal extends Modal {
|
||||||
contentEl.createEl('h3', {text: 'APIs to search'});
|
contentEl.createEl('h3', {text: 'APIs to search'});
|
||||||
|
|
||||||
const apiToggleComponents: Component[] = [];
|
const apiToggleComponents: Component[] = [];
|
||||||
for (const api of this.apiManager.apis) {
|
for (const api of this.plugin.apiManager.apis) {
|
||||||
const apiToggleListElementWrapper = contentEl.createEl('div', {cls: 'media-db-plugin-list-wrapper'});
|
const apiToggleListElementWrapper = contentEl.createEl('div', {cls: 'media-db-plugin-list-wrapper'});
|
||||||
|
|
||||||
const apiToggleTextWrapper = apiToggleListElementWrapper.createEl('div', {cls: 'media-db-plugin-list-text-wrapper'});
|
const apiToggleTextWrapper = apiToggleListElementWrapper.createEl('div', {cls: 'media-db-plugin-list-text-wrapper'});
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
import {App, ButtonComponent, DropdownComponent, Modal, Notice, Setting, TextComponent} from 'obsidian';
|
import {App, ButtonComponent, DropdownComponent, Modal, Notice, Setting, TextComponent} from 'obsidian';
|
||||||
import {MediaTypeModel} from '../models/MediaTypeModel';
|
import {MediaTypeModel} from '../models/MediaTypeModel';
|
||||||
import {APIManager} from '../api/APIManager';
|
|
||||||
import {debugLog} from '../utils/Utils';
|
import {debugLog} from '../utils/Utils';
|
||||||
|
import MediaDbPlugin from '../main';
|
||||||
|
|
||||||
export class MediaDbIdSearchModal extends Modal {
|
export class MediaDbIdSearchModal extends Modal {
|
||||||
query: string;
|
query: string;
|
||||||
isBusy: boolean;
|
isBusy: boolean;
|
||||||
apiManager: APIManager;
|
plugin: MediaDbPlugin;
|
||||||
searchBtn: ButtonComponent;
|
searchBtn: ButtonComponent;
|
||||||
selectedApi: string;
|
selectedApi: string;
|
||||||
onSubmit: (err: Error, result?: MediaTypeModel) => void;
|
onSubmit: (err: Error, result?: MediaTypeModel) => void;
|
||||||
|
|
||||||
constructor(app: App, apiManager: APIManager, onSubmit?: (err: Error, result?: MediaTypeModel) => void) {
|
constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (err: Error, result?: MediaTypeModel) => void) {
|
||||||
super(app);
|
super(app);
|
||||||
this.apiManager = apiManager;
|
this.plugin = plugin;
|
||||||
this.onSubmit = onSubmit;
|
this.onSubmit = onSubmit;
|
||||||
this.selectedApi = '';
|
this.selectedApi = '';
|
||||||
}
|
}
|
||||||
|
|
@ -46,7 +46,7 @@ export class MediaDbIdSearchModal extends Modal {
|
||||||
|
|
||||||
console.log(`MDB | query started with id ${this.query}`);
|
console.log(`MDB | query started with id ${this.query}`);
|
||||||
|
|
||||||
const api = this.apiManager.getApiByName(this.selectedApi);
|
const api = this.plugin.apiManager.getApiByName(this.selectedApi);
|
||||||
if (!api) {
|
if (!api) {
|
||||||
this.onSubmit(new Error('the selected api does not exist'));
|
this.onSubmit(new Error('the selected api does not exist'));
|
||||||
}
|
}
|
||||||
|
|
@ -83,7 +83,7 @@ export class MediaDbIdSearchModal extends Modal {
|
||||||
apiSelectorComponent.onChange((value: string) => {
|
apiSelectorComponent.onChange((value: string) => {
|
||||||
this.selectedApi = value;
|
this.selectedApi = value;
|
||||||
});
|
});
|
||||||
for (const api of this.apiManager.apis) {
|
for (const api of this.plugin.apiManager.apis) {
|
||||||
apiSelectorComponent.addOption(api.apiName, api.apiName);
|
apiSelectorComponent.addOption(api.apiName, api.apiName);
|
||||||
}
|
}
|
||||||
apiSelectorWrapper.appendChild(apiSelectorComponent.selectEl);
|
apiSelectorWrapper.appendChild(apiSelectorComponent.selectEl);
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,15 @@
|
||||||
import {App, SuggestModal} from 'obsidian';
|
import {App, SuggestModal} from 'obsidian';
|
||||||
import {MediaTypeModel} from '../models/MediaTypeModel';
|
import {MediaTypeModel} from '../models/MediaTypeModel';
|
||||||
|
import MediaDbPlugin from '../main';
|
||||||
|
|
||||||
export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
|
export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
|
||||||
suggestion: MediaTypeModel[];
|
suggestion: MediaTypeModel[];
|
||||||
|
plugin: MediaDbPlugin;
|
||||||
onChoose: (error: Error, result?: MediaTypeModel) => void;
|
onChoose: (error: Error, result?: MediaTypeModel) => void;
|
||||||
|
|
||||||
constructor(app: App, suggestion: MediaTypeModel[], onChoose: (error: Error, result?: MediaTypeModel) => void) {
|
constructor(app: App, plugin: MediaDbPlugin, suggestion: MediaTypeModel[], onChoose: (error: Error, result?: MediaTypeModel) => void) {
|
||||||
super(app);
|
super(app);
|
||||||
|
this.plugin = plugin;
|
||||||
this.suggestion = suggestion;
|
this.suggestion = suggestion;
|
||||||
this.onChoose = onChoose;
|
this.onChoose = onChoose;
|
||||||
}
|
}
|
||||||
|
|
@ -20,9 +23,9 @@ export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
|
||||||
|
|
||||||
// Renders each suggestion item.
|
// Renders each suggestion item.
|
||||||
renderSuggestion(item: MediaTypeModel, el: HTMLElement) {
|
renderSuggestion(item: MediaTypeModel, el: HTMLElement) {
|
||||||
el.createEl('div', {text: item.getFileName()});
|
el.createEl('div', {text: this.plugin.mediaTypeManager.getFileName(item)});
|
||||||
el.createEl('small', {text: `${item.englishTitle}\n`});
|
el.createEl('small', {text: `${item.englishTitle}\n`});
|
||||||
el.createEl('small', {text: `${item.type.toUpperCase()} from ${item.dataSource}`});
|
el.createEl('small', {text: `${item.type.toUpperCase() + (item.subType ? ` (${item.subType})` : '')} from ${item.dataSource}`});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform action on the selected suggestion.
|
// Perform action on the selected suggestion.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {MediaTypeModel} from './MediaTypeModel';
|
import {MediaTypeModel} from './MediaTypeModel';
|
||||||
import {stringifyYaml} from 'obsidian';
|
|
||||||
import {mediaDbTag} from '../utils/Utils';
|
import {mediaDbTag} from '../utils/Utils';
|
||||||
|
import {MediaType} from '../utils/MediaType';
|
||||||
|
|
||||||
|
|
||||||
export class GameModel extends MediaTypeModel {
|
export class GameModel extends MediaTypeModel {
|
||||||
|
|
@ -29,19 +29,15 @@ export class GameModel extends MediaTypeModel {
|
||||||
|
|
||||||
Object.assign(this, obj);
|
Object.assign(this, obj);
|
||||||
|
|
||||||
this.type = 'game';
|
this.type = this.getMediaType();
|
||||||
}
|
|
||||||
|
|
||||||
toMetaData(): string {
|
|
||||||
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileName(): string {
|
|
||||||
return this.title + (this.year ? ` (${this.year})` : '');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTags(): string[] {
|
getTags(): string[] {
|
||||||
return [mediaDbTag, 'game'];
|
return [mediaDbTag, 'game'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMediaType(): MediaType {
|
||||||
|
return MediaType.Game;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
import {MediaType} from '../utils/MediaType';
|
||||||
|
import {stringifyYaml} from 'obsidian';
|
||||||
|
|
||||||
export abstract class MediaTypeModel {
|
export abstract class MediaTypeModel {
|
||||||
type: string;
|
type: string;
|
||||||
subType: string;
|
subType: string;
|
||||||
|
|
@ -8,10 +11,12 @@ export abstract class MediaTypeModel {
|
||||||
url: string;
|
url: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
abstract toMetaData(): string;
|
abstract getMediaType(): MediaType;
|
||||||
|
|
||||||
abstract getFileName(): string;
|
|
||||||
|
|
||||||
abstract getTags(): string[];
|
abstract getTags(): string[];
|
||||||
|
|
||||||
|
toMetaData(): string {
|
||||||
|
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {MediaTypeModel} from './MediaTypeModel';
|
import {MediaTypeModel} from './MediaTypeModel';
|
||||||
import {stringifyYaml} from 'obsidian';
|
|
||||||
import {mediaDbTag} from '../utils/Utils';
|
import {mediaDbTag} from '../utils/Utils';
|
||||||
|
import {MediaType} from '../utils/MediaType';
|
||||||
|
|
||||||
|
|
||||||
export class MovieModel extends MediaTypeModel {
|
export class MovieModel extends MediaTypeModel {
|
||||||
|
|
@ -32,19 +32,15 @@ export class MovieModel extends MediaTypeModel {
|
||||||
|
|
||||||
Object.assign(this, obj);
|
Object.assign(this, obj);
|
||||||
|
|
||||||
this.type = 'movie';
|
this.type = this.getMediaType();
|
||||||
}
|
|
||||||
|
|
||||||
toMetaData(): string {
|
|
||||||
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileName(): string {
|
|
||||||
return this.title + (this.year ? ` (${this.year})` : '');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTags(): string[] {
|
getTags(): string[] {
|
||||||
return [mediaDbTag, 'tv', 'movie'];
|
return [mediaDbTag, 'tv', 'movie'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMediaType(): MediaType {
|
||||||
|
return MediaType.Movie;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {MediaTypeModel} from './MediaTypeModel';
|
import {MediaTypeModel} from './MediaTypeModel';
|
||||||
import {stringifyYaml} from 'obsidian';
|
|
||||||
import {mediaDbTag} from '../utils/Utils';
|
import {mediaDbTag} from '../utils/Utils';
|
||||||
|
import {MediaType} from '../utils/MediaType';
|
||||||
|
|
||||||
|
|
||||||
export class MusicReleaseModel extends MediaTypeModel {
|
export class MusicReleaseModel extends MediaTypeModel {
|
||||||
|
|
@ -24,19 +24,15 @@ export class MusicReleaseModel extends MediaTypeModel {
|
||||||
|
|
||||||
Object.assign(this, obj);
|
Object.assign(this, obj);
|
||||||
|
|
||||||
this.type = 'musicRelease';
|
this.type = this.getMediaType();
|
||||||
}
|
|
||||||
|
|
||||||
toMetaData(): string {
|
|
||||||
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileName(): string {
|
|
||||||
return this.title + ' (' + this.artists.join(', ') + ' - ' + this.year + ' - ' + this.subType + ')';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTags(): string[] {
|
getTags(): string[] {
|
||||||
return [mediaDbTag, 'music', 'album'];
|
return [mediaDbTag, 'music', 'album'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMediaType(): MediaType {
|
||||||
|
return MediaType.MusicRelease;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {MediaTypeModel} from './MediaTypeModel';
|
import {MediaTypeModel} from './MediaTypeModel';
|
||||||
import {stringifyYaml} from 'obsidian';
|
|
||||||
import {mediaDbTag} from '../utils/Utils';
|
import {mediaDbTag} from '../utils/Utils';
|
||||||
|
import {MediaType} from '../utils/MediaType';
|
||||||
|
|
||||||
|
|
||||||
export class SeriesModel extends MediaTypeModel {
|
export class SeriesModel extends MediaTypeModel {
|
||||||
|
|
@ -35,19 +35,15 @@ export class SeriesModel extends MediaTypeModel {
|
||||||
|
|
||||||
Object.assign(this, obj);
|
Object.assign(this, obj);
|
||||||
|
|
||||||
this.type = 'series';
|
this.type = this.getMediaType();
|
||||||
}
|
|
||||||
|
|
||||||
toMetaData(): string {
|
|
||||||
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileName(): string {
|
|
||||||
return this.title + ' (' + this.year + ')';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTags(): string[] {
|
getTags(): string[] {
|
||||||
return [mediaDbTag, 'tv', 'series'];
|
return [mediaDbTag, 'tv', 'series'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMediaType(): MediaType {
|
||||||
|
return MediaType.Series;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {MediaTypeModel} from './MediaTypeModel';
|
import {MediaTypeModel} from './MediaTypeModel';
|
||||||
import {stringifyYaml} from 'obsidian';
|
|
||||||
import {mediaDbTag} from '../utils/Utils';
|
import {mediaDbTag} from '../utils/Utils';
|
||||||
|
import {MediaType} from '../utils/MediaType';
|
||||||
|
|
||||||
|
|
||||||
export class WikiModel extends MediaTypeModel {
|
export class WikiModel extends MediaTypeModel {
|
||||||
|
|
@ -23,19 +23,15 @@ export class WikiModel extends MediaTypeModel {
|
||||||
|
|
||||||
Object.assign(this, obj);
|
Object.assign(this, obj);
|
||||||
|
|
||||||
this.type = 'wiki';
|
this.type = this.getMediaType();
|
||||||
}
|
|
||||||
|
|
||||||
toMetaData(): string {
|
|
||||||
return stringifyYaml({...this, tags: '#' + this.getTags().join('/')});
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileName(): string {
|
|
||||||
return this.title;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTags(): string[] {
|
getTags(): string[] {
|
||||||
return [mediaDbTag, 'wiki'];
|
return [mediaDbTag, 'wiki'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMediaType(): MediaType {
|
||||||
|
return MediaType.Wiki;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,19 @@ export interface MediaDbPluginSettings {
|
||||||
folder: string,
|
folder: string,
|
||||||
sfwFilter: boolean,
|
sfwFilter: boolean,
|
||||||
OMDbKey: string,
|
OMDbKey: string,
|
||||||
|
|
||||||
movieTemplate: string,
|
movieTemplate: string,
|
||||||
seriesTemplate: string,
|
seriesTemplate: string,
|
||||||
gameTemplate: string,
|
gameTemplate: string,
|
||||||
wikiTemplate: string,
|
wikiTemplate: string,
|
||||||
musicReleaseTemplate: string,
|
musicReleaseTemplate: string,
|
||||||
|
|
||||||
|
movieFileNameTemplate: string,
|
||||||
|
seriesFileNameTemplate: string,
|
||||||
|
gameFileNameTemplate: string,
|
||||||
|
wikiFileNameTemplate: string,
|
||||||
|
musicReleaseFileNameTemplate: string,
|
||||||
|
|
||||||
templates: boolean,
|
templates: boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -21,11 +29,19 @@ export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
|
||||||
folder: '',
|
folder: '',
|
||||||
sfwFilter: true,
|
sfwFilter: true,
|
||||||
OMDbKey: '',
|
OMDbKey: '',
|
||||||
|
|
||||||
movieTemplate: '',
|
movieTemplate: '',
|
||||||
seriesTemplate: '',
|
seriesTemplate: '',
|
||||||
gameTemplate: '',
|
gameTemplate: '',
|
||||||
wikiTemplate: '',
|
wikiTemplate: '',
|
||||||
musicReleaseTemplate: '',
|
musicReleaseTemplate: '',
|
||||||
|
|
||||||
|
movieFileNameTemplate: '{{ title }} ({{ year }})',
|
||||||
|
seriesFileNameTemplate: '{{ title }} ({{ year }})',
|
||||||
|
gameFileNameTemplate: '{{ title }} ({{ year }})',
|
||||||
|
wikiFileNameTemplate: '{{ title }}',
|
||||||
|
musicReleaseFileNameTemplate: '{{ title }} (by {{ artists.0 }} - {{ year }})',
|
||||||
|
|
||||||
templates: true,
|
templates: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -57,6 +73,29 @@ export class MediaDbSettingTab extends PluginSettingTab {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('OMDb API key')
|
||||||
|
.setDesc('API key for "www.omdbapi.com".')
|
||||||
|
.addText(cb => {
|
||||||
|
cb.setPlaceholder('API key')
|
||||||
|
.setValue(this.plugin.settings.OMDbKey)
|
||||||
|
.onChange(data => {
|
||||||
|
this.plugin.settings.OMDbKey = data;
|
||||||
|
this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('SFW filter')
|
||||||
|
.setDesc('Only shows SFW results for APIs that offer filtering.')
|
||||||
|
.addToggle(cb => {
|
||||||
|
cb.setValue(this.plugin.settings.sfwFilter)
|
||||||
|
.onChange(data => {
|
||||||
|
this.plugin.settings.sfwFilter = data;
|
||||||
|
this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
new Setting(containerEl)
|
new Setting(containerEl)
|
||||||
.setName('Resolve {{ tags }} in templates')
|
.setName('Resolve {{ tags }} in templates')
|
||||||
.setDesc('Whether to resolve {{ tags }} in templates. The spaces inside the curly braces are important.')
|
.setDesc('Whether to resolve {{ tags }} in templates. The spaces inside the curly braces are important.')
|
||||||
|
|
@ -68,6 +107,9 @@ export class MediaDbSettingTab extends PluginSettingTab {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
containerEl.createEl('h3', {text: 'Template Settings'});
|
||||||
|
// region templates
|
||||||
new Setting(containerEl)
|
new Setting(containerEl)
|
||||||
.setName('Movie template')
|
.setName('Movie template')
|
||||||
.setDesc('Template file to be used when creating a new note for a movie.')
|
.setDesc('Template file to be used when creating a new note for a movie.')
|
||||||
|
|
@ -132,29 +174,76 @@ export class MediaDbSettingTab extends PluginSettingTab {
|
||||||
this.plugin.saveSettings();
|
this.plugin.saveSettings();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
containerEl.createEl('h3', {text: 'File Name Settings'});
|
||||||
|
// region file name templates
|
||||||
new Setting(containerEl)
|
new Setting(containerEl)
|
||||||
.setName('OMDb API key')
|
.setName('Movie file name template')
|
||||||
.setDesc('API key for "www.omdbapi.com".')
|
.setDesc('Template for the file name used when creating a new note for a movie.')
|
||||||
.addText(cb => {
|
.addSearch(cb => {
|
||||||
cb.setPlaceholder('API key')
|
new FileSuggest(this.app, cb.inputEl);
|
||||||
.setValue(this.plugin.settings.OMDbKey)
|
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.movieFileNameTemplate}`)
|
||||||
|
.setValue(this.plugin.settings.movieFileNameTemplate)
|
||||||
.onChange(data => {
|
.onChange(data => {
|
||||||
this.plugin.settings.OMDbKey = data;
|
this.plugin.settings.movieFileNameTemplate = data;
|
||||||
this.plugin.saveSettings();
|
this.plugin.saveSettings();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
new Setting(containerEl)
|
new Setting(containerEl)
|
||||||
.setName('SFW filter')
|
.setName('Series file name template')
|
||||||
.setDesc('Only shows SFW results for APIs that offer filtering.')
|
.setDesc('Template for the file name used when creating a new note for a series.')
|
||||||
.addToggle(cb => {
|
.addSearch(cb => {
|
||||||
cb.setValue(this.plugin.settings.sfwFilter)
|
new FileSuggest(this.app, cb.inputEl);
|
||||||
|
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.seriesFileNameTemplate}`)
|
||||||
|
.setValue(this.plugin.settings.seriesFileNameTemplate)
|
||||||
.onChange(data => {
|
.onChange(data => {
|
||||||
this.plugin.settings.sfwFilter = data;
|
this.plugin.settings.seriesFileNameTemplate = data;
|
||||||
this.plugin.saveSettings();
|
this.plugin.saveSettings();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('Game file name template')
|
||||||
|
.setDesc('Template for the file name used when creating a new note for a game.')
|
||||||
|
.addSearch(cb => {
|
||||||
|
new FileSuggest(this.app, cb.inputEl);
|
||||||
|
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.gameFileNameTemplate}`)
|
||||||
|
.setValue(this.plugin.settings.gameFileNameTemplate)
|
||||||
|
.onChange(data => {
|
||||||
|
this.plugin.settings.gameFileNameTemplate = data;
|
||||||
|
this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('Wiki file name template')
|
||||||
|
.setDesc('Template for the file name used when creating a new note for a wiki entry.')
|
||||||
|
.addSearch(cb => {
|
||||||
|
new FileSuggest(this.app, cb.inputEl);
|
||||||
|
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.wikiFileNameTemplate}`)
|
||||||
|
.setValue(this.plugin.settings.wikiFileNameTemplate)
|
||||||
|
.onChange(data => {
|
||||||
|
this.plugin.settings.wikiFileNameTemplate = data;
|
||||||
|
this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('Music Release file name template')
|
||||||
|
.setDesc('Template for the file name used when creating a new note for a music release.')
|
||||||
|
.addSearch(cb => {
|
||||||
|
new FileSuggest(this.app, cb.inputEl);
|
||||||
|
cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.musicReleaseFileNameTemplate}`)
|
||||||
|
.setValue(this.plugin.settings.musicReleaseFileNameTemplate)
|
||||||
|
.onChange(data => {
|
||||||
|
this.plugin.settings.musicReleaseFileNameTemplate = data;
|
||||||
|
this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
7
src/utils/MediaType.ts
Normal file
7
src/utils/MediaType.ts
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
export enum MediaType {
|
||||||
|
Movie = 'movie',
|
||||||
|
Series = 'series',
|
||||||
|
Game = 'game',
|
||||||
|
MusicRelease = 'musicRelease',
|
||||||
|
Wiki = 'wiki',
|
||||||
|
}
|
||||||
52
src/utils/MediaTypeManager.ts
Normal file
52
src/utils/MediaTypeManager.ts
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
import {MediaDbPluginSettings} from '../settings/Settings';
|
||||||
|
import {MediaType} from './MediaType';
|
||||||
|
import {MediaTypeModel} from '../models/MediaTypeModel';
|
||||||
|
import {replaceTags} from './Utils';
|
||||||
|
import {App, TFile} from 'obsidian';
|
||||||
|
|
||||||
|
export class MediaTypeManager {
|
||||||
|
mediaFileNameTemplateMap: Map<MediaType, string>;
|
||||||
|
mediaTemplateMap: Map<MediaType, string>;
|
||||||
|
|
||||||
|
constructor(settings: MediaDbPluginSettings) {
|
||||||
|
this.updateTemplates(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateTemplates(settings: MediaDbPluginSettings) {
|
||||||
|
this.mediaFileNameTemplateMap = new Map<MediaType, string>();
|
||||||
|
this.mediaFileNameTemplateMap.set(MediaType.Movie, settings.movieFileNameTemplate);
|
||||||
|
this.mediaFileNameTemplateMap.set(MediaType.Series, settings.seriesFileNameTemplate);
|
||||||
|
this.mediaFileNameTemplateMap.set(MediaType.Game, settings.gameFileNameTemplate);
|
||||||
|
this.mediaFileNameTemplateMap.set(MediaType.Wiki, settings.wikiFileNameTemplate);
|
||||||
|
this.mediaFileNameTemplateMap.set(MediaType.MusicRelease, settings.musicReleaseFileNameTemplate);
|
||||||
|
|
||||||
|
this.mediaTemplateMap = new Map<MediaType, string>();
|
||||||
|
this.mediaTemplateMap.set(MediaType.Movie, settings.movieTemplate);
|
||||||
|
this.mediaTemplateMap.set(MediaType.Series, settings.seriesTemplate);
|
||||||
|
this.mediaTemplateMap.set(MediaType.Game, settings.gameTemplate);
|
||||||
|
this.mediaTemplateMap.set(MediaType.Wiki, settings.wikiTemplate);
|
||||||
|
this.mediaTemplateMap.set(MediaType.MusicRelease, settings.musicReleaseTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
getFileName(mediaTypeModel: MediaTypeModel): string {
|
||||||
|
return replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType()), mediaTypeModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getContent(mediaTypeModel: MediaTypeModel, app: App) {
|
||||||
|
const templateFileName = this.mediaTemplateMap.get(mediaTypeModel.getMediaType());
|
||||||
|
|
||||||
|
if (!templateFileName) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
const templateFile: TFile = app.vault.getFiles().filter((f: TFile) => f.name === templateFileName).first();
|
||||||
|
|
||||||
|
if (!templateFile) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
const template = await app.vault.cachedRead(templateFile);
|
||||||
|
// console.log(template);
|
||||||
|
return replaceTags(template, mediaTypeModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import {MediaTypeModel} from '../models/MediaTypeModel';
|
import {MediaTypeModel} from '../models/MediaTypeModel';
|
||||||
import {TFile} from 'obsidian';
|
|
||||||
|
|
||||||
|
|
||||||
export const pluginName: string = 'obsidian-media-db-plugin';
|
export const pluginName: string = 'obsidian-media-db-plugin';
|
||||||
|
|
@ -8,7 +7,6 @@ export const mediaDbTag: string = 'mediaDB';
|
||||||
export const mediaDbVersion: string = '0.1.8';
|
export const mediaDbVersion: string = '0.1.8';
|
||||||
export const debug: boolean = false;
|
export const debug: boolean = false;
|
||||||
|
|
||||||
|
|
||||||
export function wrapAround(value: number, size: number): number {
|
export function wrapAround(value: number, size: number): number {
|
||||||
return ((value % size) + size) % size;
|
return ((value % size) + size) % size;
|
||||||
}
|
}
|
||||||
|
|
@ -86,7 +84,3 @@ function traverseMetaData(path: Array<string>, mediaTypeModel: MediaTypeModel):
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function updateNote(file: TFile) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue