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}}
`,
gameTemplate:
`![image]({{image}})
`![image]({{image}})
doubanId: {{id}}
title: {{title}}
originalTitle: {{originalTitle}}
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}}

@ -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(

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

@ -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<DoubanGameSubject> {
@ -29,41 +30,62 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
super(doubanPlugin);
}
parseSubjectFromHtml(data: CheerioAPI): DoubanGameSubject {
return data('script')
.get()
.filter(scd => "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, ''));
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 id = idPattern.exec(obj.url);
let name = obj.name;
let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
let title = titleExec?titleExec[0]:name;
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 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);
})
let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
const result:DoubanGameSubject = {
id: id ? id[0] : '',
type: 'Game',
id: id,
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];
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<string, string> = new Map(
[['类型:', 'genre'],
['平台:', 'platform'],
['别名:', 'aliases'],
['开发商:', 'developer'],
['发行商:', 'publisher'],
['发行日期:', 'datePublished'],
]
);

@ -55,7 +55,7 @@ export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<Do
}else{
value = html(info.next).text().trim();
}
valueMap.set(BookKeyValueMap.get(key), value);
valueMap.set(MusicKeyValueMap.get(key), value);
})
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'],
['流派:', 'genre'],
['发行时间:', 'datePublished'],

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

@ -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`,
@ -48,6 +48,13 @@ export default {
'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`,
'120503': `This format will be used when available template variables contain date.`,

@ -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': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`,

@ -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;
}