support game import

This commit is contained in:
wanxp 2022-10-26 00:54:41 +08:00
parent 1d4bee6281
commit 92ea02f251
9 changed files with 112 additions and 47 deletions

@ -101,19 +101,21 @@ desc: {{desc}}
{{content}} {{content}}
`, `,
gameTemplate: gameTemplate:
`![image]({{image}}) `![image]({{image}})
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
originalTitle: {{originalTitle}} aliases: {{aliases}}
type: {{type}} type: {{type}}
score: {{score}} score: {{score}}
tags: Game
dateTimePublished: {{datePublished}} {{timePublished}}
publisher: {{publisher}}
genre: {{genre}} genre: {{genre}}
datePublished: {{datePublished}} developer: {{developer}}
director: {{director}} platform: {{platform}}
actor: {{actor}}
author: {{author}}
url: {{url}} url: {{url}}
desc: {{desc}} desc: {{desc}}}
`, `,
// totalWord: {{totalWord}} // totalWord: {{totalWord}}

@ -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) => { new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => {
setting.addDropdown((dropdwon) => { setting.addDropdown((dropdwon) => {
setting.descEl.appendChild( setting.descEl.appendChild(

@ -50,6 +50,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
throw: true throw: true
}; };
request(requestUrlParam) request(requestUrlParam)
.then(e => {log.trace(e.toString());return e;})
.then(load) .then(load)
.then(this.parseSubjectFromHtml) .then(this.parseSubjectFromHtml)
.then(content => this.toEditor(editor, content)) .then(content => this.toEditor(editor, content))

@ -6,6 +6,7 @@ import SchemaOrg from "src/utils/SchemaOrg";
import { moment } from "obsidian"; import { moment } from "obsidian";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import DoubanGameSubject from '../model/DoubanGameSubject'; import DoubanGameSubject from '../model/DoubanGameSubject';
import DoubanBookSubject from "@App/data/model/DoubanBookSubject";
export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> { export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> {
@ -29,41 +30,62 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
super(doubanPlugin); super(doubanPlugin);
} }
parseSubjectFromHtml(data: CheerioAPI): DoubanGameSubject { parseSubjectFromHtml(html: CheerioAPI): DoubanGameSubject {
return data('script') let title = html(html("#content > h1").get(0)).text();
.get() let idContent = html(html("head > meta[name= 'mobile-agent']").get(0)).attr("content");
.filter(scd => "application/ld+json" == data(scd).attr("type")) let idPattern = /(\d){5,10}/g;
.map(i => { let idP = idPattern.exec(idContent);
let item = data(i).text(); let id = idP ? idP[0] : "";
item = super.html_decode(item); let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text();
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); let detailDom = html(html("dl.game-attr").get(0));
let idPattern = /(\d){5,10}/g; let dt = detailDom.find("dt");
let id = idPattern.exec(obj.url); let image = html(html("#content > div > div.article > div.mod.item-subject > div.item-subject-info > div > a > img").get(0)).attr("src");
let name = obj.name; let desc = html(html("#link-report > p").get(0)).text();
let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
let title = titleExec?titleExec[0]:name;
let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); let url = `https://www.douban.com/game/${id}/`;
let valueMap = new Map<string, any>();
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', const result:DoubanGameSubject = {
title: title, id: id,
desc: obj.description, type: "Game",
url: "https://movie.douban.com" + obj.url, title: title,
datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, desc: desc,
image: obj.image, url: url,
genre: obj.genre, genre: valueMap.has('genre') ? valueMap.get('genre') : "",
aliases: [], image: image,
developer: '', datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : null,
platform: [], publisher: valueMap.has('publisher') ? valueMap.get('publisher') : "",
score: undefined, score: Number(score),
publisher: '' aliases: valueMap.has('aliases') ? valueMap.get('aliases') : "",
} developer: valueMap.has('developer') ? valueMap.get('developer') : "",
return result; platform: valueMap.has('platform') ? valueMap.get('platform') : ""
})[0]; };
return result
} }
} }
const GameKeyValueMap:Map<string, string> = new Map(
[['类型:', 'genre'],
['平台:', 'platform'],
['别名:', 'aliases'],
['开发商:', 'developer'],
['发行商:', 'publisher'],
['发行日期:', 'datePublished'],
]
);

@ -55,7 +55,7 @@ export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<Do
}else{ }else{
value = html(info.next).text().trim(); value = html(info.next).text().trim();
} }
valueMap.set(BookKeyValueMap.get(key), value); valueMap.set(MusicKeyValueMap.get(key), value);
}) })
let idPattern = /(\d){5,10}/g; let idPattern = /(\d){5,10}/g;
@ -85,7 +85,7 @@ export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<Do
} }
const BookKeyValueMap:Map<string, string> = new Map( const MusicKeyValueMap:Map<string, string> = new Map(
[['表演者:', 'actor'], [['表演者:', 'actor'],
['流派:', 'genre'], ['流派:', 'genre'],
['发行时间:', 'datePublished'], ['发行时间:', 'datePublished'],

@ -6,5 +6,4 @@ export default class DoubanGameSubject extends DoubanSubject {
aliases:string[]; aliases:string[];
developer:string; developer:string;
platform:string[]; platform:string[];
genre:string[];
} }

@ -36,9 +36,9 @@ export default {
'120301': `Music Content Template`, '120301': `Music Content Template`,
'120302': `Set markdown Music template for extract to be inserted.`, '120302': `Set markdown Music template for extract to be inserted.`,
'120303': `Available Music template variables are :`, '120303': `Available Music template variables are :`,
'120304': `{{id}}, {{title}}, {{type}}, {{image}},`, '120304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120305': `{{url}}, {{desc}}, {{datePublished}}`, '120305': `{{url}}, {{desc}}, {{datePublished}}, {{genre}},`,
'120306': `{{genre}}, {{actor}}, {{medium}}, {{albumType}},`, '120306': `{{actor}}, {{medium}}, {{albumType}},`,
'120307': `{{barcode}}, {{numberOfRecords}}`, '120307': `{{barcode}}, {{numberOfRecords}}`,
'120401': `Article Content Template`, '120401': `Article Content Template`,
@ -48,6 +48,13 @@ export default {
'120405': `{{url}}, {{desc}}, {{datePublished}}`, '120405': `{{url}}, {{desc}}, {{datePublished}}`,
'120406': `{{author}}, {{authorUrl}}, {{content}}`, '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`, '120501': `Date Format`,
'120502': `Time Format`, '120502': `Time Format`,
'120503': `This format will be used when available template variables contain date.`, '120503': `This format will be used when available template variables contain date.`,

@ -48,6 +48,13 @@ export default {
'120405': `{{url}}, {{desc}}, {{datePublished}}`, '120405': `{{url}}, {{desc}}, {{datePublished}}`,
'120406': `{{author}}, {{authorUrl}}, {{content}}`, '120406': `{{author}}, {{authorUrl}}, {{content}}`,
'121301': `游戏文本模板`,
'121302': `设置选择游戏后导入的文本内容模板,`,
'121303': `支持以下参数名称 :`,
'121304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'121305': `{{url}}, {{desc}}, {{publisher}}, {{datePublished}}`,
'121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`,
'120501': `日期格式`, '120501': `日期格式`,
'120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`, '120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`,

@ -15,13 +15,13 @@ class Logger {
} }
public info(e:any):any { 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; return e;
} }
public trace(e:any):any { public trace(e:any):any {
// return e; // 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; return e;
} }