diff --git a/douban/Douban.ts b/douban/Douban.ts index 62999cd..ea6bfb6 100644 --- a/douban/Douban.ts +++ b/douban/Douban.ts @@ -26,17 +26,22 @@ export const doubanHeadrs = { export const DEFAULT_SETTINGS:DoubanPluginSettings = { movieTemplate: -`![image]({{image}}) +`--- doubanId: {{id}} title: {{title}} +originalTitle: {{originalTitle}} type: {{type}} score: {{score}} +genre: {{genre}} datePublished: {{datePublished}} director: {{director}} actor: {{actor}} author: {{author}} url: {{url}} desc: {{desc}} +--- + +![image]({{image}}) `, bookTemplate: `--- @@ -57,6 +62,7 @@ price: {{price}} tags: Book desc: {{desc}} --- + ![image|150]({{image}}) `, // totalWord: {{totalWord}} diff --git a/douban/handler/DoubanMovieLoadHandler.ts b/douban/handler/DoubanMovieLoadHandler.ts index 945658e..a410ca3 100644 --- a/douban/handler/DoubanMovieLoadHandler.ts +++ b/douban/handler/DoubanMovieLoadHandler.ts @@ -1,14 +1,11 @@ -import { Editor, moment, renderResults } from "obsidian"; -import cheerio, { CheerioAPI } from 'cheerio'; -import { get, readStream } from "tiny-network"; - +import { CheerioAPI } from 'cheerio'; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanMovieSubject from "douban/model/DoubanMovieSubject"; import DoubanPlugin from "main"; import { DoubanPluginSettings } from "douban/Douban"; import DoubanSubject from "douban/model/DoubanSubject"; import SchemaOrg from "utils/SchemaOrg"; -import { log } from "utils/Logutil"; +import { moment } from "obsidian"; export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler { @@ -16,6 +13,7 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") @@ -24,6 +22,8 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler "application/ld+json" == data(scd).attr("type")) - .map(i => { - var item = data(i).text(); - item = super.html_decode(item); - var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); - var idPattern = /(\d){5,10}/g; - var id = idPattern.exec(obj.url); - const result:DoubanMovieSubject = { - id: id?id[0]:'', - type: 'Movie', - title: obj.name, - 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 - } - return result; - })[0]; -} + return data('script') + .get() + .filter(scd => "application/ld+json" == data(scd).attr("type")) + .map(i => { + var item = data(i).text(); + item = super.html_decode(item); + var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); + var idPattern = /(\d){5,10}/g; + var id = idPattern.exec(obj.url); + var name = obj.name; + var titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name); + var title = titleExec?titleExec[0]:name; + var originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); + var originalTitle = originalTitleExec?originalTitleExec[0]:name; + + const result:DoubanMovieSubject = { + 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/douban/handler/DoubanSearchChooseItemHandler.ts b/douban/handler/DoubanSearchChooseItemHandler.ts index e3aed5a..a96a5c3 100644 --- a/douban/handler/DoubanSearchChooseItemHandler.ts +++ b/douban/handler/DoubanSearchChooseItemHandler.ts @@ -7,6 +7,7 @@ import DoubanPlugin from "main"; import { DoubanPluginSettings } from "douban/Douban"; import DoubanSubject from "../model/DoubanSubject"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; +import { DoubanTeleplayLoadHandler } from "./DoubanTeleplayLoadHandler"; export class DoubanSearchChooseItemHandler { @@ -22,6 +23,7 @@ export class DoubanSearchChooseItemHandler { this._doubanPlugin = doubanPlugin; this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin); this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin), + new DoubanTeleplayLoadHandler(doubanPlugin), this._doubanSubjectHandlerDefault]; } diff --git a/douban/handler/DoubanTeleplayLoadHandler.ts b/douban/handler/DoubanTeleplayLoadHandler.ts new file mode 100644 index 0000000..8ad1069 --- /dev/null +++ b/douban/handler/DoubanTeleplayLoadHandler.ts @@ -0,0 +1,80 @@ +import { CheerioAPI } from "cheerio"; +import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; +import DoubanPlugin from "main"; +import { DoubanPluginSettings } from "douban/Douban"; +import DoubanSubject from "douban/model/DoubanSubject"; +import DoubanTeleplaySubject from "douban/model/DoubanTeleplaySubject"; +import SchemaOrg from "utils/SchemaOrg"; +import { moment } from "obsidian"; + +/** + * teleplay + */ +export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler{ + + + + constructor(doubanPlugin:DoubanPlugin) { + super(doubanPlugin); + } + + + parseText(extract: DoubanTeleplaySubject, 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("Teleplay") || extract.type.contains("teleplay")); + } + + + parseSubjectFromHtml(data: CheerioAPI): DoubanTeleplaySubject { + return data('script') + .get() + .filter(scd => "application/ld+json" == data(scd).attr("type")) + .map(i => { + var item = data(i).text(); + item = super.html_decode(item); + var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); + var idPattern = /(\d){5,10}/g; + var id = idPattern.exec(obj.url); + var name = obj.name; + var titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name); + var title = titleExec?titleExec[0]:name; + + var originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); + var originalTitle = originalTitleExec?originalTitleExec[0]:name; + + const result:DoubanTeleplaySubject = { + 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]; + } + +} \ No newline at end of file diff --git a/douban/model/DoubanMovieSubject.ts b/douban/model/DoubanMovieSubject.ts index 102fc67..0f827c2 100644 --- a/douban/model/DoubanMovieSubject.ts +++ b/douban/model/DoubanMovieSubject.ts @@ -8,5 +8,8 @@ export default class DoubanMovieSubject extends DoubanSubject { actor:Person[]; aggregateRating:AggregateRating; datePublished:Date; - image:string + image:string; + genre:string[]; + originalTitle:string; + } diff --git a/douban/model/DoubanTeleplaySubject.ts b/douban/model/DoubanTeleplaySubject.ts new file mode 100644 index 0000000..dc7263e --- /dev/null +++ b/douban/model/DoubanTeleplaySubject.ts @@ -0,0 +1,14 @@ +import {AggregateRating, Person, WithContext} from 'schema-dts'; + +import DoubanSubject from "./DoubanSubject"; + +export default class DoubanTeleplaySubject extends DoubanSubject { + director:Person[]; + author:Person[]; + actor:Person[]; + aggregateRating:AggregateRating; + datePublished:Date; + image:string; + genre:string[]; + originalTitle:string; +} diff --git a/lang/locale/en.ts b/lang/locale/en.ts index fd7e68e..9a78f0a 100644 --- a/lang/locale/en.ts +++ b/lang/locale/en.ts @@ -17,9 +17,9 @@ export default { 'movie content template': `Movie Content Template`, 'movie content template desc 1': `Set markdown Movie template for extract to be inserted.`, 'movie content template desc 2': `Available template variables are :`, - 'movie content template desc 3': `{{id}}, {{type}}, {{title}},`, + 'movie content template desc 3': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, 'movie content template desc 4': `{{score}}, {{datePublished}}, {{director}},`, - 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}},`, + 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, 'movie content template desc 6': `{{image}}, {{url}}`, 'book content template': `Book Content Template`, diff --git a/lang/locale/zh-cn.ts b/lang/locale/zh-cn.ts index 0ecbcfb..ccf97f6 100644 --- a/lang/locale/zh-cn.ts +++ b/lang/locale/zh-cn.ts @@ -18,9 +18,9 @@ export default { 'movie content template': `电影文本模板`, 'movie content template desc 1': `设置选择电影后导入的文本内容模板,`, 'movie content template desc 2': `支持以下参数名称 :`, - 'movie content template desc 3': `{{id}}, {{type}}, {{title}},`, + 'movie content template desc 3': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, 'movie content template desc 4': `{{score}}, {{datePublished}}, {{director}},`, - 'movie content template desc 5': `{{author}}, {{autor}}, {{desc}},`, + 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, 'movie content template desc 6': `{{image}}, {{url}}`, 'book content template': `书籍文本模板`,