complete #6 #7 \n add teleplay import

This commit is contained in:
wanxp 2022-06-21 23:51:32 +08:00
parent e4c79a7007
commit a176ccecb8
8 changed files with 149 additions and 36 deletions

@ -26,17 +26,22 @@ export const doubanHeadrs = {
export const DEFAULT_SETTINGS:DoubanPluginSettings = { export const DEFAULT_SETTINGS:DoubanPluginSettings = {
movieTemplate: movieTemplate:
`![image]({{image}}) `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
originalTitle: {{originalTitle}}
type: {{type}} type: {{type}}
score: {{score}} score: {{score}}
genre: {{genre}}
datePublished: {{datePublished}} datePublished: {{datePublished}}
director: {{director}} director: {{director}}
actor: {{actor}} actor: {{actor}}
author: {{author}} author: {{author}}
url: {{url}} url: {{url}}
desc: {{desc}} desc: {{desc}}
---
![image]({{image}})
`, `,
bookTemplate: bookTemplate:
`--- `---
@ -57,6 +62,7 @@ price: {{price}}
tags: Book tags: Book
desc: {{desc}} desc: {{desc}}
--- ---
![image|150]({{image}}) ![image|150]({{image}})
`, `,
// totalWord: {{totalWord}} // totalWord: {{totalWord}}

@ -1,14 +1,11 @@
import { Editor, moment, renderResults } from "obsidian"; import { CheerioAPI } from 'cheerio';
import cheerio, { CheerioAPI } from 'cheerio';
import { get, readStream } from "tiny-network";
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanMovieSubject from "douban/model/DoubanMovieSubject"; import DoubanMovieSubject from "douban/model/DoubanMovieSubject";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import { DoubanPluginSettings } from "douban/Douban"; import { DoubanPluginSettings } from "douban/Douban";
import DoubanSubject from "douban/model/DoubanSubject"; import DoubanSubject from "douban/model/DoubanSubject";
import SchemaOrg from "utils/SchemaOrg"; import SchemaOrg from "utils/SchemaOrg";
import { log } from "utils/Logutil"; import { moment } from "obsidian";
export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> { export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> {
@ -16,6 +13,7 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<Do
return settings.movieTemplate ? settings.movieTemplate.replaceAll("{{id}}", extract.id) return settings.movieTemplate ? settings.movieTemplate.replaceAll("{{id}}", extract.id)
.replaceAll("{{type}}", extract.type ? extract.type : "") .replaceAll("{{type}}", extract.type ? extract.type : "")
.replaceAll("{{title}}", extract.title ? extract.title : "") .replaceAll("{{title}}", extract.title ? extract.title : "")
.replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "")
.replaceAll("{{desc}}", extract.desc ? extract.desc : "") .replaceAll("{{desc}}", extract.desc ? extract.desc : "")
.replaceAll("{{image}}", extract.image ? extract.image : "") .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("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
@ -24,6 +22,8 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<Do
.replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "")
.replaceAll("{{url}}", extract.url ? extract.url : "") .replaceAll("{{url}}", extract.url ? extract.url : "")
.replaceAll("{{score}}", extract.aggregateRating && extract.aggregateRating.ratingValue ? extract.aggregateRating.ratingValue + "" : "") .replaceAll("{{score}}", extract.aggregateRating && extract.aggregateRating.ratingValue ? extract.aggregateRating.ratingValue + "" : "")
.replaceAll("{{genre}}", extract.genre ? extract.genre.join(settings.arraySpilt) : "")
: undefined; } : undefined; }
support(extract: DoubanSubject): boolean { support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("电影") || extract.type.contains("Movie") || extract.type.contains("movie")); return extract && extract.type && (extract.type.contains("电影") || extract.type.contains("Movie") || extract.type.contains("movie"));
@ -38,32 +38,40 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<Do
} }
parseSubjectFromHtml(data: CheerioAPI): DoubanMovieSubject { parseSubjectFromHtml(data: CheerioAPI): DoubanMovieSubject {
return data('script') return data('script')
.get() .get()
.filter(scd => "application/ld+json" == data(scd).attr("type")) .filter(scd => "application/ld+json" == data(scd).attr("type"))
.map(i => { .map(i => {
var item = data(i).text(); var item = data(i).text();
item = super.html_decode(item); item = super.html_decode(item);
var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); var obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
var idPattern = /(\d){5,10}/g; var idPattern = /(\d){5,10}/g;
var id = idPattern.exec(obj.url); var id = idPattern.exec(obj.url);
const result:DoubanMovieSubject = { var name = obj.name;
id: id?id[0]:'', var titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
type: 'Movie', var title = titleExec?titleExec[0]:name;
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];
}
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];
}
} }

@ -7,6 +7,7 @@ import DoubanPlugin from "main";
import { DoubanPluginSettings } from "douban/Douban"; import { DoubanPluginSettings } from "douban/Douban";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import { DoubanTeleplayLoadHandler } from "./DoubanTeleplayLoadHandler";
export class DoubanSearchChooseItemHandler { export class DoubanSearchChooseItemHandler {
@ -22,6 +23,7 @@ export class DoubanSearchChooseItemHandler {
this._doubanPlugin = doubanPlugin; this._doubanPlugin = doubanPlugin;
this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin); this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin);
this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin), this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin),
new DoubanTeleplayLoadHandler(doubanPlugin),
this._doubanSubjectHandlerDefault]; this._doubanSubjectHandlerDefault];
} }

@ -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<DoubanTeleplaySubject>{
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];
}
}

@ -8,5 +8,8 @@ export default class DoubanMovieSubject extends DoubanSubject {
actor:Person[]; actor:Person[];
aggregateRating:AggregateRating; aggregateRating:AggregateRating;
datePublished:Date; datePublished:Date;
image:string image:string;
genre:string[];
originalTitle:string;
} }

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

@ -17,9 +17,9 @@ export default {
'movie content template': `Movie Content Template`, 'movie content template': `Movie Content Template`,
'movie content template desc 1': `Set markdown Movie template for extract to be inserted.`, '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 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 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}}`, 'movie content template desc 6': `{{image}}, {{url}}`,
'book content template': `Book Content Template`, 'book content template': `Book Content Template`,

@ -18,9 +18,9 @@ export default {
'movie content template': `电影文本模板`, 'movie content template': `电影文本模板`,
'movie content template desc 1': `设置选择电影后导入的文本内容模板,`, 'movie content template desc 1': `设置选择电影后导入的文本内容模板,`,
'movie content template desc 2': `支持以下参数名称 :`, '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 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}}`, 'movie content template desc 6': `{{image}}, {{url}}`,
'book content template': `书籍文本模板`, 'book content template': `书籍文本模板`,