From ea1845d9cf67f87b444592aea1841d4d2ce19ed7 Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Mon, 20 Jun 2022 00:16:17 +0800 Subject: [PATCH] add douban book template settings --- README.md | 24 +++++++ douban/Douban.ts | 51 ++++++++++---- douban/handler/DoubanBookLoadHandler.ts | 89 ++++++++++++++++--------- douban/model/DoubanBookSubject.ts | 15 +++-- 4 files changed, 130 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 09aaaaf..d038f79 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,24 @@ # Obsidian Douban Plugin + ![GitHub release](https://img.shields.io/github/v/release/Wanxp/obsidian-douban) Import Movies, Books, Music Data from Douban in [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) - [Development Roadmap](https://github.com/users/Wanxp/projects/1) + +## Target +- [x] Movie/电影 +- [ ] Book/书籍 +- [ ] Music/音乐 +- [ ] Broadcast/广播 + ## How to use ### Movie - 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](./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 \ No newline at end of file diff --git a/douban/Douban.ts b/douban/Douban.ts index c6a94e4..3b68477 100644 --- a/douban/Douban.ts +++ b/douban/Douban.ts @@ -3,6 +3,7 @@ import { type } from "os"; export interface DoubanPluginSettings { movieTemplate:string, + bookTemplate:string, dateFormat:string, searchUrl:string, arraySpilt:string, @@ -24,19 +25,43 @@ export const doubanHeadrs = { }; export const DEFAULT_SETTINGS:DoubanPluginSettings = { - movieTemplate: - "---\n" + - "doubanId: {{id}}\n" + - "title: {{title}}\n" + - "type: {{type}}\n" + - "score: {{score}}\n" + - "datePublished: {{datePublished}}\n" + - "director: {{director}}\n" + - "actor: {{actor}}\n" + - "author: {{author}}\n" + - "url: {{url}}\n" + - "image: {{image}}\n" + - "---\n", + movieTemplate: ` +--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +score: {{score}} +datePublished: {{datePublished}} +director: {{director}} +actor: {{actor}} +author: {{author}} +url: {{url}} +image: {{image}} +---`, + 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=', searchHeaders: JSON.stringify(doubanHeadrs), dateFormat: "yyyy_MM_DD", diff --git a/douban/handler/DoubanBookLoadHandler.ts b/douban/handler/DoubanBookLoadHandler.ts index 709186a..c71e346 100644 --- a/douban/handler/DoubanBookLoadHandler.ts +++ b/douban/handler/DoubanBookLoadHandler.ts @@ -6,24 +6,32 @@ import DoubanBookSubject from "douban/model/DoubanBookSubject"; 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"; export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler { 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("{{title}}", extract.title ? extract.title : "") .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("{{author}}", extract.author ? extract.author.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 + "" : "") - : undefined; } + .replaceAll("{{score}}", extract.score && extract.score ? extract.score + "" : "") + .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 { 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 "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:DoubanBookSubject = { - id: id?id[0]:'', - type: 'Book', - title: obj.name, - desc: obj.description, - url: "https://book.douban.com" + obj.url, - author: obj.author, - aggregateRating: obj.aggregateRating, - datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, - image:obj.image - } + parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject { + var title = html(html("head > meta[property= 'og:title']").get(0)).attr("content"); + var desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content"); + var url = html(html("head > meta[property= 'og:url']").get(0)).attr("content"); + var image = html(html("head > meta[property= 'og:image']").get(0)).attr("content"); + var type = html(html("head > meta[property= 'og:type']").get(0)).attr("content"); + var author = html(html("head > meta[property= 'book:author']").get(0)).attr("content"); + 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 id = idPattern.exec(url); + + var info = detailDom.html.toString(); + + var datePublishedPattern = /出版年:<\/span> ((\d){4}-(\d){1,2})/g; + var datePublished = datePublishedPattern.exec(info); + + const result:DoubanBookSubject = { + author: [author], + translator: [translator], + bookType: "", + image: image, + datePublished: datePublished?new Date(datePublished[0]):null, + totalWord: 0, + isbn: isbn, + publish: publish, + 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; - })[0]; } diff --git a/douban/model/DoubanBookSubject.ts b/douban/model/DoubanBookSubject.ts index 4d8a856..c0287c2 100644 --- a/douban/model/DoubanBookSubject.ts +++ b/douban/model/DoubanBookSubject.ts @@ -3,17 +3,20 @@ import {AggregateRating, Person, WithContext} from 'schema-dts'; import DoubanSubject from "./DoubanSubject"; export default class DoubanMovieSubject extends DoubanSubject { - author:string; - translator:string; + author:string[]; + translator:string[]; bookType:string; image:string; - publishDate:string; + datePublished:Date; totalWord:number; isbn:string; - press:string; + publish:string; score:number; - originalName:string; + originalTitle:string; + subTitle:string; totalPage:number belong:string; - menu:string; + menu:string[]; + price:number; + labels:string[]; }