diff --git a/src/douban/Douban.ts b/src/douban/Douban.ts index 7262181..3e91e66 100644 --- a/src/douban/Douban.ts +++ b/src/douban/Douban.ts @@ -101,19 +101,21 @@ desc: {{desc}} {{content}} `, gameTemplate: - `![image]({{image}}) +`![image]({{image}}) + doubanId: {{id}} title: {{title}} -originalTitle: {{originalTitle}} -type: {{type}} +aliases: {{aliases}} +type: {{type}} score: {{score}} +tags: Game +dateTimePublished: {{datePublished}} {{timePublished}} +publisher: {{publisher}} genre: {{genre}} -datePublished: {{datePublished}} -director: {{director}} -actor: {{actor}} -author: {{author}} +developer: {{developer}} +platform: {{platform}} url: {{url}} -desc: {{desc}} +desc: {{desc}}} `, // totalWord: {{totalWord}} diff --git a/src/douban/DoubanSettingTab.ts b/src/douban/DoubanSettingTab.ts index 0db854e..778dd92 100644 --- a/src/douban/DoubanSettingTab.ts +++ b/src/douban/DoubanSettingTab.ts @@ -173,6 +173,33 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl).setName(i18nHelper.getMessage('121301')).then((setting) => { + setting.addTextArea((textarea) => { + setting.descEl.appendChild( + createFragment((frag) => { + frag.appendText(i18nHelper.getMessage('121302')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('121303')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('121304')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('121305')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('121306')); + frag.createEl('br'); + }) + ); + textarea.inputEl.addClass("obsidian_douban_settings_area"); + textarea.inputEl.setAttr("rows", 10); + textarea.setPlaceholder(DEFAULT_SETTINGS.gameTemplate) + .setValue(this.plugin.settings.gameTemplate) + .onChange(async (value) => { + this.plugin.settings.gameTemplate = value; + await this.plugin.saveSettings(); + }); + }); + }) + new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => { setting.addDropdown((dropdwon) => { setting.descEl.appendChild( diff --git a/src/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/douban/data/handler/DoubanAbstractLoadHandler.ts index 96b5003..3fc6127 100644 --- a/src/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -50,6 +50,7 @@ export default abstract class DoubanAbstractLoadHandler throw: true }; request(requestUrlParam) + .then(e => {log.trace(e.toString());return e;}) .then(load) .then(this.parseSubjectFromHtml) .then(content => this.toEditor(editor, content)) diff --git a/src/douban/data/handler/DoubanGameLoadHandler.ts b/src/douban/data/handler/DoubanGameLoadHandler.ts index 1ccd7e6..c34debd 100644 --- a/src/douban/data/handler/DoubanGameLoadHandler.ts +++ b/src/douban/data/handler/DoubanGameLoadHandler.ts @@ -6,6 +6,7 @@ import SchemaOrg from "src/utils/SchemaOrg"; import { moment } from "obsidian"; import DoubanSubject from '../model/DoubanSubject'; import DoubanGameSubject from '../model/DoubanGameSubject'; +import DoubanBookSubject from "@App/data/model/DoubanBookSubject"; export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler { @@ -29,41 +30,62 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler "application/ld+json" == data(scd).attr("type")) - .map(i => { - let item = data(i).text(); - item = super.html_decode(item); - let obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); - let idPattern = /(\d){5,10}/g; - let id = idPattern.exec(obj.url); - let name = obj.name; - let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name); - let title = titleExec?titleExec[0]:name; + parseSubjectFromHtml(html: CheerioAPI): DoubanGameSubject { + let title = html(html("#content > h1").get(0)).text(); + let idContent = html(html("head > meta[name= 'mobile-agent']").get(0)).attr("content"); + let idPattern = /(\d){5,10}/g; + let idP = idPattern.exec(idContent); + let id = idP ? idP[0] : ""; + let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text(); + let detailDom = html(html("dl.game-attr").get(0)); + let dt = detailDom.find("dt"); + let image = html(html("#content > div > div.article > div.mod.item-subject > div.item-subject-info > div > a > img").get(0)).attr("src"); + let desc = html(html("#link-report > p").get(0)).text(); - let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); + let url = `https://www.douban.com/game/${id}/`; + let valueMap = new Map(); + let value:any; + dt.map((index, info) => { + let key = html(info).text().trim(); + if(key.indexOf('平台') >= 0 || key.indexOf('类型') >= 0){ + html(info.next).find("a").map((index, a) => { + value.push(html(a).text().trim()); + }); + }else{ + value = html(info.next).text().trim(); + } + valueMap.set(GameKeyValueMap.get(key), value); + }) - const result:DoubanGameSubject = { - id: id ? id[0] : '', - type: 'Game', - title: title, - desc: obj.description, - url: "https://movie.douban.com" + obj.url, - datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, - image: obj.image, - genre: obj.genre, - aliases: [], - developer: '', - platform: [], - score: undefined, - publisher: '' - } - return result; - })[0]; + + + const result:DoubanGameSubject = { + id: id, + type: "Game", + title: title, + desc: desc, + url: url, + genre: valueMap.has('genre') ? valueMap.get('genre') : "", + image: image, + datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : null, + publisher: valueMap.has('publisher') ? valueMap.get('publisher') : "", + score: Number(score), + aliases: valueMap.has('aliases') ? valueMap.get('aliases') : "", + developer: valueMap.has('developer') ? valueMap.get('developer') : "", + platform: valueMap.has('platform') ? valueMap.get('platform') : "" + }; + return result } } +const GameKeyValueMap:Map = new Map( + [['类型:', 'genre'], + ['平台:', 'platform'], + ['别名:', 'aliases'], + ['开发商:', 'developer'], + ['发行商:', 'publisher'], + ['发行日期:', 'datePublished'], + ] +); diff --git a/src/douban/data/handler/DoubanMusicLoadHandler.ts b/src/douban/data/handler/DoubanMusicLoadHandler.ts index 73b11c4..7d3f110 100644 --- a/src/douban/data/handler/DoubanMusicLoadHandler.ts +++ b/src/douban/data/handler/DoubanMusicLoadHandler.ts @@ -55,7 +55,7 @@ export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler = new Map( +const MusicKeyValueMap:Map = new Map( [['表演者:', 'actor'], ['流派:', 'genre'], ['发行时间:', 'datePublished'], diff --git a/src/douban/data/model/DoubanGameSubject.ts b/src/douban/data/model/DoubanGameSubject.ts index 015e4a8..bf6aaab 100644 --- a/src/douban/data/model/DoubanGameSubject.ts +++ b/src/douban/data/model/DoubanGameSubject.ts @@ -6,5 +6,4 @@ export default class DoubanGameSubject extends DoubanSubject { aliases:string[]; developer:string; platform:string[]; - genre:string[]; } diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 6daf841..3d9d9fc 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -36,9 +36,9 @@ export default { '120301': `Music Content Template`, '120302': `Set markdown Music template for extract to be inserted.`, '120303': `Available Music template variables are :`, - '120304': `{{id}}, {{title}}, {{type}}, {{image}},`, - '120305': `{{url}}, {{desc}}, {{datePublished}}`, - '120306': `{{genre}}, {{actor}}, {{medium}}, {{albumType}},`, + '120304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`, + '120305': `{{url}}, {{desc}}, {{datePublished}}, {{genre}},`, + '120306': `{{actor}}, {{medium}}, {{albumType}},`, '120307': `{{barcode}}, {{numberOfRecords}}`, '120401': `Article Content Template`, @@ -47,6 +47,13 @@ export default { '120404': `{{id}}, {{title}}, {{type}}, {{image}},`, '120405': `{{url}}, {{desc}}, {{datePublished}}`, '120406': `{{author}}, {{authorUrl}}, {{content}}`, + + '121301': `Game Content Template`, + '121302': `Set markdown Game template for extract to be inserted.`, + '121303': `Available Game template variables are :`, + '121304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`, + '121305': `{{url}}, {{desc}}, {{publisher}}, {{datePublished}}`, + '121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`, '120501': `Date Format`, '120502': `Time Format`, diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index fd4d60c..ebe6f00 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -48,6 +48,13 @@ export default { '120405': `{{url}}, {{desc}}, {{datePublished}}`, '120406': `{{author}}, {{authorUrl}}, {{content}}`, + '121301': `游戏文本模板`, + '121302': `设置选择游戏后导入的文本内容模板,`, + '121303': `支持以下参数名称 :`, + '121304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`, + '121305': `{{url}}, {{desc}}, {{publisher}}, {{datePublished}}`, + '121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`, + '120501': `日期格式`, '120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`, diff --git a/src/utils/Logutil.ts b/src/utils/Logutil.ts index bd88e43..f2a7752 100644 --- a/src/utils/Logutil.ts +++ b/src/utils/Logutil.ts @@ -15,13 +15,13 @@ class Logger { } public info(e:any):any { - // console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); return e; } public trace(e:any):any { // return e; - // console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); return e; }