mirror of
https://github.com/Wanxp/obsidian-douban.git
synced 2026-04-04 16:48:44 +08:00
add douban music import support
This commit is contained in:
parent
7c989cf78f
commit
8ceb93ec7f
@ -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}}
|
||||
---
|
||||
|
||||

|
||||
`,
|
||||
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}}
|
||||
---
|
||||
|
||||

|
||||
`,
|
||||
// totalWord: {{totalWord}}
|
||||
|
||||
@ -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(
|
||||
|
||||
103
douban/handler/DoubanMusicLoadHandler.ts
Normal file
103
douban/handler/DoubanMusicLoadHandler.ts
Normal file
@ -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<DoubanMusicSubject> {
|
||||
|
||||
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<string, string>();
|
||||
|
||||
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<string, string> = new Map(
|
||||
[['表演者:', 'actor'],
|
||||
['流派:', 'genre'],
|
||||
['发行时间:', 'datePublished'],
|
||||
['专辑类型:', 'albumType'],
|
||||
['介质:', 'medium'],
|
||||
['出版者:', 'publish'],
|
||||
['唱片数:', 'numberOfRecords'],
|
||||
['条形码:', 'barcode']]
|
||||
);
|
||||
@ -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];
|
||||
|
||||
}
|
||||
|
||||
16
douban/model/DoubanMusicSubject.ts
Normal file
16
douban/model/DoubanMusicSubject.ts
Normal file
@ -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;
|
||||
}
|
||||
@ -30,6 +30,14 @@ 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`,
|
||||
'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.':
|
||||
`This format will be used when available template variables contain date.`,
|
||||
|
||||
@ -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.':
|
||||
`这个格式是给上面获取到的参数进行格式化时显示的内容 .`,
|
||||
|
||||
2
main.ts
2
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)}`);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user