add douban book template settings

This commit is contained in:
wanxp 2022-06-20 00:16:17 +08:00
parent 7ebf875b40
commit ea1845d9cf
4 changed files with 130 additions and 49 deletions

@ -1,12 +1,24 @@
# Obsidian Douban Plugin # Obsidian Douban Plugin
![GitHub release](https://img.shields.io/github/v/release/Wanxp/obsidian-douban) ![GitHub release](https://img.shields.io/github/v/release/Wanxp/obsidian-douban)
Import Movies, Books, Music Data from Douban in [Obsidian](https://obsidian.md/) Import Movies, Books, Music Data from Douban in [Obsidian](https://obsidian.md/)
在[Obsidian](https://obsidian.md/)使用并导入豆瓣中的电影/音乐/以及书籍等, 评分/发布日期/演员表等信息 在[Obsidian](https://obsidian.md/)使用并导入豆瓣中的电影/音乐/以及书籍等, 评分/发布日期/演员表等信息
If you want some features or have any questions about this plugin, create issues or join the development is welcome.
关于当前的插件如果有任何疑问或者想要什么功能, 欢迎提issues或加入到开发当中.
- [Bugs, Issues, & Feature Requests](https://github.com/Wanxp/obsidian-douban/issues) - [Bugs, Issues, & Feature Requests](https://github.com/Wanxp/obsidian-douban/issues)
- [Development Roadmap](https://github.com/users/Wanxp/projects/1) - [Development Roadmap](https://github.com/users/Wanxp/projects/1)
## Target
- [x] Movie/电影
- [ ] Book/书籍
- [ ] Music/音乐
- [ ] Broadcast/广播
## How to use ## How to use
### Movie ### Movie
- Search Movie By Input Text/通过输入文本搜索 - Search Movie By Input Text/通过输入文本搜索
@ -22,3 +34,15 @@ Import Movies, Books, Music Data from Douban in [Obsidian](https://obsidian.md/)
- Setting Example1/设置案例1 - Setting Example1/设置案例1
![Setting Example1](./doc/setting_en.gif) ![Setting Example1](./doc/setting_en.gif)
## How to install
### From Obsidian
1. go to obsidian plugin center
2. search obsidian-douban
3. click install
4. enable plugin
### Manmel
#### Windows
####
### Linx

@ -3,6 +3,7 @@ import { type } from "os";
export interface DoubanPluginSettings { export interface DoubanPluginSettings {
movieTemplate:string, movieTemplate:string,
bookTemplate:string,
dateFormat:string, dateFormat:string,
searchUrl:string, searchUrl:string,
arraySpilt:string, arraySpilt:string,
@ -24,19 +25,43 @@ export const doubanHeadrs = {
}; };
export const DEFAULT_SETTINGS:DoubanPluginSettings = { export const DEFAULT_SETTINGS:DoubanPluginSettings = {
movieTemplate: movieTemplate: `
"---\n" + ---
"doubanId: {{id}}\n" + doubanId: {{id}}
"title: {{title}}\n" + title: {{title}}
"type: {{type}}\n" + type: {{type}}
"score: {{score}}\n" + score: {{score}}
"datePublished: {{datePublished}}\n" + datePublished: {{datePublished}}
"director: {{director}}\n" + director: {{director}}
"actor: {{actor}}\n" + actor: {{actor}}
"author: {{author}}\n" + author: {{author}}
"url: {{url}}\n" + url: {{url}}
"image: {{image}}\n" + image: {{image}}
"---\n", ---`,
bookTemplate: `
---
doubanId: {{id}}
title: {{title}}
subTitle: {{subTitle}}
originalTitle: {{originalTitle}}
type: {{type}}
author: {{author}}
score: {{score}}
datePublished: {{datePublished}}
director: {{director}}
translator: {{translator}}
publish: {{publish}}
isbn: {{isbn}}
url: {{url}}
image: {{image}}
totalWord: {{totalWord}}
totalPage: {{totalPage}}
price: {{price}}
tags: Book, {{labels}}
---
- Menu
{{menu}}`,
searchUrl: 'https://www.douban.com/search?q=', searchUrl: 'https://www.douban.com/search?q=',
searchHeaders: JSON.stringify(doubanHeadrs), searchHeaders: JSON.stringify(doubanHeadrs),
dateFormat: "yyyy_MM_DD", dateFormat: "yyyy_MM_DD",

@ -6,24 +6,32 @@ import DoubanBookSubject from "douban/model/DoubanBookSubject";
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 { log } from "utils/Logutil";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> { export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {
parseText(extract: DoubanBookSubject, settings:DoubanPluginSettings): string { parseText(extract: DoubanBookSubject, settings:DoubanPluginSettings): string {
return settings.movieTemplate ? settings.movieTemplate.replaceAll("{{id}}", extract.id) return settings.bookTemplate ? settings.bookTemplate.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("{{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("{{author}}", extract.author ? extract.author.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("{{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.score && extract.score ? extract.score + "" : "")
: undefined; } .replaceAll("{{translator}}", extract.translator ? extract.translator.join(settings.arraySpilt) : "")
.replaceAll("{{totalWord}}", extract.totalWord ? extract.totalWord+"" : "")
.replaceAll("{{isbn}}", extract.isbn ? extract.isbn : "")
.replaceAll("{{publish}}", extract.publish ? extract.publish : "")
.replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "")
.replaceAll("{{subTitle}}", extract.subTitle ? extract.subTitle : "")
.replaceAll("{{totalPage}}", extract.totalPage ? extract.totalPage + "" : "")
.replaceAll("{{menu}}", extract.menu ? extract.menu.join(settings.arraySpilt) : "")
.replaceAll("{{price}}", extract.price ? extract.price + "" : "")
.replaceAll("{{labels}}", extract.labels ? extract.labels.join(settings.arraySpilt) : "")
: undefined;
}
support(extract: DoubanSubject): boolean { support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("书籍") || extract.type.contains("Book") || extract.type.contains("book")); return extract && extract.type && (extract.type.contains("书籍") || extract.type.contains("Book") || extract.type.contains("book"));
} }
@ -36,29 +44,50 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
super(doubanPlugin); super(doubanPlugin);
} }
parseSubjectFromHtml(data: CheerioAPI): DoubanBookSubject { parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject {
return data('script') var title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
.get() var desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
.filter(scd => "application/ld+json" == data(scd).attr("type")) var url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
.map(i => { var image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
var item = data(i).text(); var type = html(html("head > meta[property= 'og:type']").get(0)).attr("content");
item = super.html_decode(item); var author = html(html("head > meta[property= 'book:author']").get(0)).attr("content");
var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); var isbn = html(html("head > meta[property= 'book:isbn']").get(0)).attr("content");
var detailDom = html(html("#info").get(0))
var publish = detailDom.find("span:contains('出版社') > a").text();
var translator = detailDom.find("span:contains('译者') > a").text();
var idPattern = /(\d){5,10}/g; var idPattern = /(\d){5,10}/g;
var id = idPattern.exec(obj.url); var id = idPattern.exec(url);
var info = detailDom.html.toString();
var datePublishedPattern = /<span class="pl">出版年:<\/span> ((\d){4}-(\d){1,2})<br\/>/g;
var datePublished = datePublishedPattern.exec(info);
const result:DoubanBookSubject = { const result:DoubanBookSubject = {
id: id?id[0]:'', author: [author],
type: 'Book', translator: [translator],
title: obj.name, bookType: "",
desc: obj.description, image: image,
url: "https://book.douban.com" + obj.url, datePublished: datePublished?new Date(datePublished[0]):null,
author: obj.author, totalWord: 0,
aggregateRating: obj.aggregateRating, isbn: isbn,
datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, publish: publish,
image:obj.image score: 0,
} originalTitle: "",
subTitle: "",
totalPage: 0,
belong: "",
menu: [],
price: 0,
labels: [],
id: id ? id[0]:"",
type: "Book",
title: title,
desc: desc,
url: url
};
return result; return result;
})[0];
} }

@ -3,17 +3,20 @@ import {AggregateRating, Person, WithContext} from 'schema-dts';
import DoubanSubject from "./DoubanSubject"; import DoubanSubject from "./DoubanSubject";
export default class DoubanMovieSubject extends DoubanSubject { export default class DoubanMovieSubject extends DoubanSubject {
author:string; author:string[];
translator:string; translator:string[];
bookType:string; bookType:string;
image:string; image:string;
publishDate:string; datePublished:Date;
totalWord:number; totalWord:number;
isbn:string; isbn:string;
press:string; publish:string;
score:number; score:number;
originalName:string; originalTitle:string;
subTitle:string;
totalPage:number totalPage:number
belong:string; belong:string;
menu:string; menu:string[];
price:number;
labels:string[];
} }