diff --git a/douban/Douban.ts b/douban/Douban.ts index ea6bfb6..b0cf885 100644 --- a/douban/Douban.ts +++ b/douban/Douban.ts @@ -4,6 +4,7 @@ import { type } from "os"; export interface DoubanPluginSettings { movieTemplate:string, bookTemplate:string, + musicTemplate:string, dateFormat:string, searchUrl:string, arraySpilt:string, @@ -63,6 +64,27 @@ tags: Book desc: {{desc}} --- +![image|150]({{image}}) +`, + musicTemplate: +`--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +actor: {{actor}} +score: {{score}} +genre: {{genre}} +medium: {{medium}} +albumType: {{albumType}} +datePublished: {{datePublished}} +publish: {{publish}} +barcode: {{barcode}} +url: {{url}} +numberOfRecords: {{numberOfRecords}} +tags: Book +desc: {{desc}} +--- + ![image|150]({{image}}) `, // totalWord: {{totalWord}} diff --git a/douban/DoubanSettingTab.ts b/douban/DoubanSettingTab.ts index 0c5c859..ae46d3d 100644 --- a/douban/DoubanSettingTab.ts +++ b/douban/DoubanSettingTab.ts @@ -117,6 +117,35 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl).setName(i18nHelper.getMessage("music content template")).then((setting) => { + setting.addTextArea((textarea) => { + setting.descEl.appendChild( + createFragment((frag) => { + frag.appendText(i18nHelper.getMessage('music content template desc 1')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('music content template desc 2')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('music content template desc 3')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('music content template desc 4')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('music content template desc 5')); + frag.createEl('br'); + frag.appendText(i18nHelper.getMessage('music content template desc 6')); + frag.createEl('br'); + }) + ); + textarea.inputEl.addClass("settings_area"); + textarea.inputEl.setAttr("rows", 10); + textarea.setPlaceholder(DEFAULT_SETTINGS.musicTemplate) + .setValue(this.plugin.settings.musicTemplate) + .onChange(async (value) => { + this.plugin.settings.musicTemplate = value; + await this.plugin.saveSettings(); + }); + }); + }); + new Setting(containerEl).setName(i18nHelper.getMessage("Person Name Language Mode")).then((setting) => { setting.addDropdown((dropdwon) => { setting.descEl.appendChild( diff --git a/douban/handler/DoubanMusicLoadHandler.ts b/douban/handler/DoubanMusicLoadHandler.ts new file mode 100644 index 0000000..9d36f63 --- /dev/null +++ b/douban/handler/DoubanMusicLoadHandler.ts @@ -0,0 +1,103 @@ +import { CheerioAPI } from 'cheerio'; +import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; +import DoubanMusicSubject from 'douban/model/DoubanMusicSubject'; +import DoubanPlugin from "main"; +import { DoubanPluginSettings } from "douban/Douban"; +import DoubanSubject from "douban/model/DoubanSubject"; +import { moment } from "obsidian"; + +export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler { + + parseText(extract: DoubanMusicSubject, settings:DoubanPluginSettings): string { + return settings.bookTemplate ? settings.musicTemplate + .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("{{actor}}", extract.actor ? extract.actor.join(settings.arraySpilt) : "") + .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") + .replaceAll("{{url}}", extract.url ? extract.url : "") + .replaceAll("{{score}}", extract.score && extract.score ? extract.score + "" : "") + .replaceAll("{{barcode}}", extract.barcode ? extract.barcode : "") + .replaceAll("{{publish}}", extract.publish ? extract.publish : "") + .replaceAll("{{genre}}", extract.genre ? extract.genre : "") + .replaceAll("{{medium}}", extract.medium ? extract.medium : "") + .replaceAll("{{albumType}}", extract.albumType ? extract.albumType : "") + .replaceAll("{{numberOfRecords}}", extract.numberOfRecords ? extract.numberOfRecords + "" : "") + : undefined; + } + support(extract: DoubanSubject): boolean { + return extract && extract.type && (extract.type.contains("音乐") || extract.type.contains("Music") || extract.type.contains("music")); + } + + + + + + constructor(doubanPlugin:DoubanPlugin) { + super(doubanPlugin); + } + + parseSubjectFromHtml(html: CheerioAPI): DoubanMusicSubject { + 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 score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text(); + var detailDom = html(html("#info").get(0)); + var publish = detailDom.find("span.pl"); + + var valueMap = new Map(); + + publish.map((index, info) => { + let key = html(info).text().trim(); + let value = '' + if(key.indexOf('表演者') >= 0){ + // value = html(info.next.next).text().trim(); + var vas:string[] = key.split("\n \n "); + value = vas && vas.length > 1? vas[1]:""; + key = vas && vas.length > 0? vas[0]:""; + }else{ + value = html(info.next).text().trim(); + } + valueMap.set(BookKeyValueMap.get(key), value); + }) + + var idPattern = /(\d){5,10}/g; + var id = idPattern.exec(url); + + const result:DoubanMusicSubject = { + image: image, + datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : null, + publish: valueMap.has('publish') ? valueMap.get('publish') : "", + score: Number(score), + numberOfRecords: valueMap.has('numberOfRecords') ? Number(valueMap.get('numberOfRecords')) : null, + id: id ? id[0] : "", + type: "Music", + title: title, + desc: desc, + url: url, + actor: [valueMap.has('actor') ? valueMap.get('actor') : null], + genre: valueMap.has('genre') ? valueMap.get('genre') : "", + albumType: valueMap.has('albumType') ? valueMap.get('albumType') : "", + medium: valueMap.has('medium') ? valueMap.get('medium') : "", + barcode: valueMap.has('barcode') ? valueMap.get('barcode') : "" + }; + return result; +} + + +} + + +const BookKeyValueMap:Map = new Map( + [['表演者:', 'actor'], + ['流派:', 'genre'], + ['发行时间:', 'datePublished'], + ['专辑类型:', 'albumType'], + ['介质:', 'medium'], + ['出版者:', 'publish'], + ['唱片数:', 'numberOfRecords'], + ['条形码:', 'barcode']] +); \ No newline at end of file diff --git a/douban/handler/DoubanSearchChooseItemHandler.ts b/douban/handler/DoubanSearchChooseItemHandler.ts index a96a5c3..8db93e8 100644 --- a/douban/handler/DoubanSearchChooseItemHandler.ts +++ b/douban/handler/DoubanSearchChooseItemHandler.ts @@ -2,6 +2,7 @@ import { App, Editor } from "obsidian"; import DoubanBookLoadHandler from "./DoubanBookLoadHandler"; import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler"; +import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler"; import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler"; import DoubanPlugin from "main"; import { DoubanPluginSettings } from "douban/Douban"; @@ -24,6 +25,7 @@ export class DoubanSearchChooseItemHandler { this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin); this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin), new DoubanTeleplayLoadHandler(doubanPlugin), + new DoubanMusicLoadHandler(doubanPlugin), this._doubanSubjectHandlerDefault]; } diff --git a/douban/model/DoubanMusicSubject.ts b/douban/model/DoubanMusicSubject.ts new file mode 100644 index 0000000..0101da5 --- /dev/null +++ b/douban/model/DoubanMusicSubject.ts @@ -0,0 +1,16 @@ +import {AggregateRating, Person, WithContext} from 'schema-dts'; + +import DoubanSubject from "./DoubanSubject"; + +export default class DoubanMusicSubject extends DoubanSubject { + actor:string[]; + datePublished:Date; + image:string; + genre:string; + albumType:string; + medium:string; + publish:string; + numberOfRecords:number; + barcode:string; + score:number; +} diff --git a/lang/locale/en.ts b/lang/locale/en.ts index 9a78f0a..383442f 100644 --- a/lang/locale/en.ts +++ b/lang/locale/en.ts @@ -29,6 +29,14 @@ export default { 'book content template desc 4': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, 'book content template desc 5': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, 'book content template desc 6': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, + + 'music content template': `Music Content Template`, + 'music content template desc 1': `Set markdown Music template for extract to be inserted.`, + 'music content template desc 2': `Available Music template variables are :`, + 'music content template desc 3': `{{id}}, {{title}}, {{actor}}, {{genre}},`, + 'music content template desc 4': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, + 'music content template desc 5': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, + 'music content template desc 6': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, 'Date format': `Date Format`, 'This format will be used when available template variables contain date.': diff --git a/lang/locale/zh-cn.ts b/lang/locale/zh-cn.ts index ccf97f6..fb5e7c6 100644 --- a/lang/locale/zh-cn.ts +++ b/lang/locale/zh-cn.ts @@ -31,6 +31,15 @@ export default { 'book content template desc 5': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, 'book content template desc 6': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, + 'music content template': `音乐文本模板`, + 'music content template desc 1': `设置选择音乐后导入的文本内容模板,`, + 'music content template desc 2': `支持以下参数名称 :`, + 'music content template desc 3': `{{id}}, {{title}}, {{actor}}, {{genre}},`, + 'music content template desc 4': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, + 'music content template desc 5': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, + 'music content template desc 6': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, + + 'Date format': `参数日期格式`, 'This format will be used when available template variables contain date.': `这个格式是给上面获取到的参数进行格式化时显示的内容 .`, diff --git a/main.ts b/main.ts index 4c90aa9..0126de0 100644 --- a/main.ts +++ b/main.ts @@ -17,7 +17,7 @@ export default class DoubanPlugin extends Plugin { async putToEditor(editor:Editor, extract:DoubanSubject) { if(!editor || !extract) { - log.trace(`chosen item can not load data`); + log.warn(`Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`); return; } log.trace(`you choose item load data success: ${JSON.stringify(extract)}`);