From ecffed644128ba84794b913f63c0ee4c689d5ed3 Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Tue, 25 Oct 2022 13:16:43 +0800 Subject: [PATCH] support import game's data --- src/douban/DoubanSettingTab.ts | 4 +- .../handler/DoubanBroadcastMovieHandler.ts | 29 +++---- .../handler/DoubanPageBroadcastTransformer.ts | 1 + .../handler/DoubanPageBroadcatLoadHandler.ts | 3 +- .../data/handler/DoubanGameLoadHandler.ts | 78 +++++++++++++++++++ src/douban/data/model/DoubanGameSubject.ts | 15 ++++ src/lang/locale/en.ts | 4 +- src/lang/locale/zh-cn.ts | 6 +- 8 files changed, 119 insertions(+), 21 deletions(-) create mode 100644 src/douban/data/handler/DoubanGameLoadHandler.ts create mode 100644 src/douban/data/model/DoubanGameSubject.ts diff --git a/src/douban/DoubanSettingTab.ts b/src/douban/DoubanSettingTab.ts index 5640103..5deb6e5 100644 --- a/src/douban/DoubanSettingTab.ts +++ b/src/douban/DoubanSettingTab.ts @@ -17,7 +17,7 @@ export class DoubanSettingTab extends PluginSettingTab { containerEl.empty(); - containerEl.createEl("h2", { text: '1201' }); + containerEl.createEl("h2", { text: i18nHelper.getMessage('1201') }); new Setting(containerEl).setName(i18nHelper.getMessage('120001')) .then((setting) => { @@ -116,7 +116,7 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('120301')).then((setting) => { setting.addTextArea((textarea) => { setting.descEl.appendChild( createFragment((frag) => { diff --git a/src/douban/broadcast/handler/DoubanBroadcastMovieHandler.ts b/src/douban/broadcast/handler/DoubanBroadcastMovieHandler.ts index 3a9d311..e218894 100644 --- a/src/douban/broadcast/handler/DoubanBroadcastMovieHandler.ts +++ b/src/douban/broadcast/handler/DoubanBroadcastMovieHandler.ts @@ -1,14 +1,15 @@ -import { CheerioAPI } from "cheerio"; -import { DoubanBroadcastAbstractHandler } from "./DoubanBroadcastAbstractHandler"; -import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; - -export class DoubanBroadcastMovieHandler extends DoubanBroadcastAbstractHandler{ - support(t: string): boolean { - throw new Error("Method not implemented."); - } - transform(data: Element, source:CheerioAPI): DoubanBroadcastMovieSubject { - throw new Error("Method not implemented."); - } - - -} +import { CheerioAPI } from "cheerio"; +import { DoubanBroadcastAbstractHandler } from "./DoubanBroadcastAbstractHandler"; +import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; + +//TODO will support in future version +export class DoubanBroadcastMovieHandler extends DoubanBroadcastAbstractHandler{ + support(t: string): boolean { + throw new Error("Method not implemented."); + } + transform(data: Element, source:CheerioAPI): DoubanBroadcastMovieSubject { + throw new Error("Method not implemented."); + } + + +} diff --git a/src/douban/broadcast/handler/DoubanPageBroadcastTransformer.ts b/src/douban/broadcast/handler/DoubanPageBroadcastTransformer.ts index d30ac94..a43914e 100644 --- a/src/douban/broadcast/handler/DoubanPageBroadcastTransformer.ts +++ b/src/douban/broadcast/handler/DoubanPageBroadcastTransformer.ts @@ -4,6 +4,7 @@ import { DoubanBroadcastMovieHandler } from "./DoubanBroadcastMovieHandler"; import DoubanBroadcastSubject from "../model/DoubanBroadcastSubject"; import DoubanPageBroadcastSubject from "../model/DoubanPageBroadcastSubject"; +//TODO will support in future version export class DoubanPageBroadcastTransformer { private handlers:DoubanBroadcastAbstractHandler[]; diff --git a/src/douban/broadcast/handler/DoubanPageBroadcatLoadHandler.ts b/src/douban/broadcast/handler/DoubanPageBroadcatLoadHandler.ts index b14acb3..3440f6b 100644 --- a/src/douban/broadcast/handler/DoubanPageBroadcatLoadHandler.ts +++ b/src/douban/broadcast/handler/DoubanPageBroadcatLoadHandler.ts @@ -5,9 +5,8 @@ import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject'; import DoubanPlugin from "main"; import { DoubanPluginSettings } from "src/douban/Douban"; import DoubanSubject from 'src/douban/data/model/DoubanSubject'; -import html2markdown from '@notable/html2markdown'; -import { moment } from "obsidian"; +//TODO will support in future version export default class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler { parseText(extract: DoubanNoteSubject, settings:DoubanPluginSettings): string { diff --git a/src/douban/data/handler/DoubanGameLoadHandler.ts b/src/douban/data/handler/DoubanGameLoadHandler.ts new file mode 100644 index 0000000..348d08b --- /dev/null +++ b/src/douban/data/handler/DoubanGameLoadHandler.ts @@ -0,0 +1,78 @@ +import { CheerioAPI } from 'cheerio'; +import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; +import DoubanPlugin from "main"; +import { DoubanPluginSettings } from "src/douban/Douban"; +import SchemaOrg from "src/utils/SchemaOrg"; +import { moment } from "obsidian"; +import DoubanSubject from '../model/DoubanSubject'; +import DoubanGameSubject from '../model/DoubanGameSubject'; + +export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler { + + parseText(extract: DoubanGameSubject, settings:DoubanPluginSettings): string { + return settings.movieTemplate ? settings.movieTemplate.replaceAll("{{id}}", extract.id) + .replaceAll("{{type}}", extract.type ? extract.type : "") + .replaceAll("{{title}}", extract.title ? extract.title : "") + .replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "") + .replaceAll("{{desc}}", extract.desc ? extract.desc : "") + .replaceAll("{{image}}", extract.image ? extract.image : "") + .replaceAll("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") + .replaceAll("{{actor}}", extract.actor ? extract.actor.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") + .replaceAll("{{author}}", extract.author ? extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") + .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") + .replaceAll("{{url}}", extract.url ? extract.url : "") + .replaceAll("{{score}}", extract.aggregateRating && extract.aggregateRating.ratingValue ? extract.aggregateRating.ratingValue + "" : "") + .replaceAll("{{genre}}", extract.genre ? extract.genre.join(settings.arraySpilt) : "") + + : undefined; } + support(extract: DoubanSubject): boolean { + return extract && extract.type && (extract.type.contains("游戏") || extract.type.contains("Game") || extract.type.contains("game")); + } + + + + + + constructor(doubanPlugin:DoubanPlugin) { + 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; + + let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); + let originalTitle = originalTitleExec?originalTitleExec[0]:name; + + const result:DoubanGameSubject = { + id: id?id[0]:'', + type: 'Movie', + title: title, + originalTitle: originalTitle, + desc: obj.description, + url: "https://movie.douban.com" + obj.url, + director: obj.director, + author: obj.author, + actor: obj.actor, + aggregateRating: obj.aggregateRating, + datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, + image:obj.image, + genre:obj.genre + } + return result; + })[0]; + } + +} + + diff --git a/src/douban/data/model/DoubanGameSubject.ts b/src/douban/data/model/DoubanGameSubject.ts new file mode 100644 index 0000000..6582819 --- /dev/null +++ b/src/douban/data/model/DoubanGameSubject.ts @@ -0,0 +1,15 @@ +import {AggregateRating, Person} from 'schema-dts'; + +import DoubanSubject from "./DoubanSubject"; + +export default class DoubanGameSubject extends DoubanSubject { + director:Person[]; + author:Person[]; + actor:Person[]; + aggregateRating:AggregateRating; + datePublished:Date; + image:string; + genre:string[]; + originalTitle:string; + +} diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 3d4a3fb..562e98d 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -57,7 +57,9 @@ export default { '120507': `Your current syntax looks like this`, '120508': `format reference`, '120601': `Array Spilt String`, - '120602': `string to join between array type, such as author, actor`, + '120602': `string to join between array type, such as authors, actors. + example: '/' + the list of actor's name will be shown as: 'actor1/actor2/actor3'`, '120701': `Douban Request Headers`, '120801': `This type of import is not supported temporarily, please go to github to submit issues for help`, '120901': `Douban`, diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 612222e..60aa358 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -57,13 +57,15 @@ export default { '120507': `时间参数时间格式预览`, '120508': `格式参考`, '120601': `数组分割字符串`, - '120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如 演员列表等`, + '120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如演员列表等. + 举例: '/' + 则演员表将会显示为: '演员1/演员2/演员3'`, '120701': `豆瓣HTTP请求头`, '120702': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n 参数获取方式为:\n 1. 访问http://www.douban.com 2. 复制请求头,仅复制以下请求头 `, - '120801': `暂时不支持该类型导入,请至github提交issuess获取帮助`, + '120801': `暂时不支持该类型导入,请至Github提交issuess获取帮助`, '120901': `豆瓣网`, '121201': `人名显示模式`,