diff --git a/src/api/APIManager.ts b/src/api/APIManager.ts index c20c677..cca4a41 100644 --- a/src/api/APIManager.ts +++ b/src/api/APIManager.ts @@ -25,9 +25,13 @@ export class APIManager { } async queryDetailedInfo(item: MediaTypeModel): Promise { + return await this.queryDetailedInfoById(item.id, item.dataSource); + } + + async queryDetailedInfoById(id: string, dataSource: string): Promise { for (const api of this.apis) { - if (api.apiName === item.dataSource) { - return api.getById(item); + if (api.apiName === dataSource) { + return api.getById(id); } } } diff --git a/src/api/APIModel.ts b/src/api/APIModel.ts index 0cbf5fa..9d2dd78 100644 --- a/src/api/APIModel.ts +++ b/src/api/APIModel.ts @@ -13,7 +13,7 @@ export abstract class APIModel { */ abstract searchByTitle(title: string): Promise; - abstract getById(item: MediaTypeModel): Promise; + abstract getById(id: string): Promise; hasType(type: string): boolean { return this.types.contains(type); diff --git a/src/api/apis/LocGovAPI.ts b/src/api/apis/LocGovAPI.ts index fd0b2d5..c90cdd0 100644 --- a/src/api/apis/LocGovAPI.ts +++ b/src/api/apis/LocGovAPI.ts @@ -40,10 +40,10 @@ export class LocGovAPI extends APIModel { // return ret; } - async getById(item: MediaTypeModel): Promise { + async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://www.loc.gov/item/${item.id}/?fo=json`; + const searchUrl = `https://www.loc.gov/item/${encodeURIComponent(id)}/?fo=json`; const fetchData = await fetch(searchUrl); if (fetchData.status !== 200) { throw Error(`MDB | Received status code ${fetchData.status} from an API.`); diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index a60e349..5507a10 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -69,10 +69,10 @@ export class MALAPI extends APIModel { return ret; } - async getById(item: MediaTypeModel): Promise { + async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://api.jikan.moe/v4/anime/${item.id}`; + const searchUrl = `https://api.jikan.moe/v4/anime/${encodeURIComponent(id)}`; const fetchData = await fetch(searchUrl); if (fetchData.status !== 200) { diff --git a/src/api/apis/MusicBrainzAPI.ts b/src/api/apis/MusicBrainzAPI.ts index 53936cc..1bcd84b 100644 --- a/src/api/apis/MusicBrainzAPI.ts +++ b/src/api/apis/MusicBrainzAPI.ts @@ -58,14 +58,14 @@ export class MusicBrainzAPI extends APIModel { return ret; } - async getById(item: MediaTypeModel): Promise { + async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://musicbrainz.org/ws/2/release-group/${encodeURIComponent(item.id)}?inc=releases+artists+tags+ratings+genres&fmt=json`; + const searchUrl = `https://musicbrainz.org/ws/2/release-group/${encodeURIComponent(id)}?inc=releases+artists+tags+ratings+genres&fmt=json`; const fetchData = await requestUrl({ url: searchUrl, headers: { - 'User-Agent': `${pluginName}/0.1.7 (${contactEmail})`, + 'User-Agent': `${pluginName}/${mediaDbVersion} (${contactEmail})`, }, }); diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index e4c2bee..2c8bafb 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -88,10 +88,10 @@ export class OMDbAPI extends APIModel { return ret; } - async getById(item: MediaTypeModel): Promise { + async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `http://www.omdbapi.com/?i=${item.id}&apikey=${this.plugin.settings.OMDbKey}`; + const searchUrl = `http://www.omdbapi.com/?i=${encodeURIComponent(id)}&apikey=${this.plugin.settings.OMDbKey}`; const fetchData = await fetch(searchUrl); if (fetchData.status === 401) { diff --git a/src/api/apis/SteamAPI.ts b/src/api/apis/SteamAPI.ts index 92cb1dd..c523609 100644 --- a/src/api/apis/SteamAPI.ts +++ b/src/api/apis/SteamAPI.ts @@ -65,10 +65,10 @@ export class SteamAPI extends APIModel { return ret; } - async getById(item: MediaTypeModel): Promise { + async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `http://store.steampowered.com/api/appdetails?appids=${item.id}`; + const searchUrl = `http://store.steampowered.com/api/appdetails?appids=${encodeURIComponent(id)}`; const fetchData = await requestUrl({ url: searchUrl, }); @@ -77,7 +77,17 @@ export class SteamAPI extends APIModel { throw Error(`MDB | Received status code ${fetchData.status} from an API.`); } - const result = (await fetchData.json)[item.id].data; + debugLog(await fetchData.json); + + let result; + for (const [key, value] of Object.entries(await fetchData.json)) { + if (key == id) { + result = value.data; + } + } + if (!result) { + throw Error(`MDB | API returned invalid data.`); + } debugLog(result); diff --git a/src/api/apis/WikipediaAPI.ts b/src/api/apis/WikipediaAPI.ts index 096d1d4..b0796b2 100644 --- a/src/api/apis/WikipediaAPI.ts +++ b/src/api/apis/WikipediaAPI.ts @@ -46,10 +46,10 @@ export class WikipediaAPI extends APIModel { return ret; } - async getById(item: MediaTypeModel): Promise { + async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://en.wikipedia.org/w/api.php?action=query&prop=info&pageids=${item.id}&inprop=url&format=json&origin=*`; + const searchUrl = `https://en.wikipedia.org/w/api.php?action=query&prop=info&pageids=${encodeURIComponent(id)}&inprop=url&format=json&origin=*`; const fetchData = await fetch(searchUrl); if (fetchData.status !== 200) { diff --git a/src/main.ts b/src/main.ts index a93a63c..a08be41 100644 --- a/src/main.ts +++ b/src/main.ts @@ -43,7 +43,15 @@ export default class MediaDbPlugin extends Plugin { this.addCommand({ id: 'update-media-db-note', name: 'Update the open note, if it is a Media DB entry.', - callback: () => this.updateActiveNote(), + checkCallback: (checking: boolean) => { + if (!this.app.workspace.getActiveFile()) { + return false; + } + if (!checking) { + this.updateActiveNote() + } + return true; + }, }); // register the settings tab @@ -88,7 +96,11 @@ export default class MediaDbPlugin extends Plugin { const fileName = replaceIllegalFileNameCharactersInString(this.mediaTypeManager.getFileName(mediaTypeModel)); const filePath = `${this.settings.folder.replace(/\/$/, '')}/${fileName}.md`; - await this.app.vault.delete(this.app.vault.getAbstractFileByPath(filePath)); + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file) { + await this.app.vault.delete(file); + } + const targetFile = await this.app.vault.create(filePath, fileContent); // open file @@ -127,10 +139,12 @@ export default class MediaDbPlugin extends Plugin { } async updateActiveNote() { - const activeLeaf: TFile = this.app.workspace.getActiveFile(); - if (!activeLeaf.name) return; + const activeFile: TFile = this.app.workspace.getActiveFile(); + if (!activeFile) { + throw new Error('MDB | there is no active note'); + } - let metadata: FrontMatterCache = this.app.metadataCache.getFileCache(activeLeaf).frontmatter; + let metadata: FrontMatterCache = this.app.metadataCache.getFileCache(activeFile).frontmatter; if (!metadata?.type || !metadata?.dataSource || !metadata?.id) { throw new Error('MDB | active note is not a Media DB entry or is missing metadata'); @@ -139,7 +153,7 @@ export default class MediaDbPlugin extends Plugin { delete metadata.position; // remove unnecessary data from the FrontMatterCache let oldMediaTypeModel = this.mediaTypeManager.createMediaTypeModelFromMediaType(metadata, metadata.type); - let newMediaTypeModel = await this.apiManager.queryDetailedInfo({dataSource: metadata.dataSource, id: metadata.id} as MediaTypeModel); + let newMediaTypeModel = await this.apiManager.queryDetailedInfoById(metadata.id, metadata.dataSource); if (!newMediaTypeModel) { return; } @@ -147,7 +161,7 @@ export default class MediaDbPlugin extends Plugin { newMediaTypeModel = Object.assign(oldMediaTypeModel, newMediaTypeModel.getWithOutUserData()); console.log('MDB | deleting old entry'); - await this.app.vault.delete(activeLeaf); + await this.app.vault.delete(activeFile); await this.createMediaDbNoteFromModel(newMediaTypeModel); }