mirror of
https://github.com/Wanxp/obsidian-douban.git
synced 2026-04-04 08:38:41 +08:00
parent
e4c79a7007
commit
a176ccecb8
@ -26,17 +26,22 @@ export const doubanHeadrs = {
|
|||||||
|
|
||||||
export const DEFAULT_SETTINGS:DoubanPluginSettings = {
|
export const DEFAULT_SETTINGS:DoubanPluginSettings = {
|
||||||
movieTemplate:
|
movieTemplate:
|
||||||
`
|
`---
|
||||||
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}}
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
`,
|
`,
|
||||||
bookTemplate:
|
bookTemplate:
|
||||||
`---
|
`---
|
||||||
@ -57,6 +62,7 @@ price: {{price}}
|
|||||||
tags: Book
|
tags: Book
|
||||||
desc: {{desc}}
|
desc: {{desc}}
|
||||||
---
|
---
|
||||||
|
|
||||||

|

|
||||||
`,
|
`,
|
||||||
// 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];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
80
douban/handler/DoubanTeleplayLoadHandler.ts
Normal file
80
douban/handler/DoubanTeleplayLoadHandler.ts
Normal file
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
14
douban/model/DoubanTeleplaySubject.ts
Normal file
14
douban/model/DoubanTeleplaySubject.ts
Normal file
@ -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': `书籍文本模板`,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user