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}}
|
{{content}}
|
||||||
`,
|
`,
|
||||||
gameTemplate:
|
gameTemplate:
|
||||||
`
|
`
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user