mirror of
https://github.com/Wanxp/obsidian-douban.git
synced 2026-04-04 16:48:44 +08:00
support game import
This commit is contained in:
parent
1d4bee6281
commit
92ea02f251
@ -101,19 +101,21 @@ desc: {{desc}}
|
||||
{{content}}
|
||||
`,
|
||||
gameTemplate:
|
||||
`
|
||||
`
|
||||
|
||||
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}}
|
||||
|
||||
|
||||
@ -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, ''));
|
||||
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<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',
|
||||
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<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`,
|
||||
@ -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`,
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user