add function: sync personal movie/book/music info

This commit is contained in:
wanxp 2022-11-20 00:49:11 +08:00
parent 0a39541b02
commit 01a066f393
108 changed files with 1170 additions and 524 deletions

@ -15,7 +15,7 @@ esbuild.build({
banner: { banner: {
js: banner, js: banner,
}, },
entryPoints: ['main.ts'], entryPoints: ['src/org/wanxp/main.ts'],
bundle: true, bundle: true,
external: [ external: [
'obsidian', 'obsidian',

@ -1,119 +0,0 @@
import {
App,
ButtonComponent,
DropdownComponent,
Modal,
SliderComponent,
TextComponent,
ToggleComponent
} from "obsidian";
import DoubanPlugin from "main";
import {i18nHelper} from "src/lang/helper";
import HandleContext from "@App/data/model/HandleContext";
import {SyncType, SyncTypeRecords} from "../../constant/Constsant";
import {
ALL,
DoubanSubjectStateRecords_BOOK_SYNC, DoubanSubjectStateRecords_BROADCAST_SYNC,
DoubanSubjectStateRecords_MOVIE_SYNC, DoubanSubjectStateRecords_NOTE_SYNC
} from "../../constant/DoubanUserState";
import {SyncConfig} from "@App/sync/model/SyncConfig";
export class DoubanSyncModal extends Modal {
plugin: DoubanPlugin;
context: HandleContext
syncConfig: SyncConfig;
constructor(app: App, plugin: DoubanPlugin, context: HandleContext) {
super(app);
this.plugin = plugin;
this.context = context;
}
onOpen() {
let {contentEl} = this;
contentEl.createEl("h3", {text: i18nHelper.getMessage('500001')});
this.syncConfig = {syncType: 'movie', scope: 'collect', force: false};
const syncTypeDropdown = new DropdownComponent(contentEl);
const scopeSelections = contentEl.createDiv("scope-selection");
syncTypeDropdown.addOptions(SyncTypeRecords)
.setValue(SyncType.movie)
.onChange((value) => {
this.syncConfig.syncType = value;
this.openScopeDropdown(scopeSelections);
});
this.openScopeDropdown(scopeSelections);
new ToggleComponent(contentEl)
.setTooltip(i18nHelper.getMessage('500110'))
.setValue(false)
.onChange((value) => {
this.syncConfig.force = value;
});
const controls = contentEl.createDiv("controls");
// const syncButton = controls.createEl("button", {
// text: i18nHelper.getMessage('110007'),
// cls: "mod-cta",
// attr: {
// autofocus: true,
// },
// });
const syncButton = new ButtonComponent(controls)
.setButtonText(i18nHelper.getMessage('110007'))
.onClick(async () => {
this.close();
await this.plugin.sync(this.syncConfig, this.context);
})
const cancelButton = new ButtonComponent(controls)
.setButtonText(i18nHelper.getMessage('110005'))
.onClick(() => {
this.close();
});
cancelButton.setClass("obsidian_douban_search_button");
syncButton.setClass("obsidian_douban_search_button");
}
async onClose() {
let {contentEl} = this;
contentEl.empty();
}
private openScopeDropdown(contentEl:HTMLDivElement) {
switch (this.syncConfig.syncType) {
case SyncType.movie:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_MOVIE_SYNC);
break;
case SyncType.book:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BOOK_SYNC);
break;
case SyncType.broadcast:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BROADCAST_SYNC);
break;
case SyncType.note:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_NOTE_SYNC);
break;
}
}
private showScopeDropdown(contentEl:HTMLDivElement, scopeSelections: Record<string, string>) {
contentEl.empty();
const syncScopeTypeDropdown = new DropdownComponent(contentEl)
.addOptions(scopeSelections)
.setValue(ALL)
.onChange((value) => {
this.syncConfig.scope = value;
});
}
}

@ -1,14 +0,0 @@
import {SearchHandleMode} from "../../../constant/Constsant";
import {Editor} from "obsidian";
import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting";
import UserComponent from "@App/user/UserComponent";
import NetFileHandler from "src/net/NetFileHandler";
export default interface HandleContext {
mode:SearchHandleMode;
settings: DoubanPluginSetting;
editor?:Editor;
userComponent: UserComponent;
netFileHandler: NetFileHandler;
showAfterCreate?:boolean;
}

@ -1,26 +0,0 @@
import {CheerioAPI} from "cheerio";
import DoubanSyncSubject from "../model/DoubanSyncSubject";
import DoubanPlugin from "../../../../main";
import {SyncType} from "../../../constant/Constsant";
import {DoubanSyncHandler} from "@App/sync/handler/DoubanSyncHandler";
import { SyncConfig } from "../model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext";
export abstract class DoubanAbstractSyncHandler implements DoubanSyncHandler{
private plugin: DoubanPlugin;
constructor(plugin: DoubanPlugin) {
this.plugin = plugin;
}
support(t: string): boolean {
return this.getSyncType() == t;
}
abstract sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>;
abstract getSyncType(): SyncType;
}

@ -1,19 +0,0 @@
import {CheerioAPI} from "cheerio";
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
import DoubanPlugin from "../../../../main";
import {SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "@App/sync/model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext";
//TODO will support in future version
export class DoubanBookSyncHandler extends DoubanAbstractSyncHandler {
getSyncType(): SyncType {
return SyncType.book;
}
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
return Promise.resolve();
}
}

@ -1,59 +0,0 @@
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import {SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "@App/sync/model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext";
import DoubanSubjectLoadHandler from "@App/data/handler/DoubanSubjectLoadHandler";
import DoubanMovieLoadHandler from "@App/data/handler/DoubanMovieLoadHandler";
import DoubanMovieSubject from "@App/data/model/DoubanMovieSubject";
import DoubanPlugin from "../../../../main";
import {SubjectListItem} from "@App/data/model/SubjectListItem";
import DoubanMovieCollectListHandler from "@App/sync/handler/list/DoubanMovieCollectListHandler";
import {DoubanListHandler} from "@App/sync/handler/list/DoubanListHandler";
import DoubanMovieWishListHandler from "./list/DoubanMovieWishListHandler";
import DoubanMovieDoListHandler from "@App/sync/handler/list/DoubanMovieDoListHandler";
//TODO will support in future version
export class DoubanMovieSyncHandler extends DoubanAbstractSyncHandler {
private doubanSubjectLoadHandler:DoubanSubjectLoadHandler<DoubanMovieSubject>;
private doubanListHandlers:DoubanListHandler[];
constructor(plugin:DoubanPlugin) {
super(plugin);
this.doubanSubjectLoadHandler = new DoubanMovieLoadHandler(plugin);
this.doubanListHandlers = [
new DoubanMovieCollectListHandler(),
new DoubanMovieWishListHandler(),
new DoubanMovieDoListHandler(),
]
}
getSyncType(): SyncType {
return SyncType.movie;
}
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
Promise.resolve()
.then(() => this.getItems(syncConfig, context))
.then(this.removeExists)
.then((items) => {
items.forEach(item => {
item.id
this.doubanSubjectLoadHandler.handle(item.url, context);
})
})
}
private async getItems(syncConfig:SyncConfig, context:HandleContext):Promise<SubjectListItem[]> {
return this.doubanListHandlers.find((h) => h.support(syncConfig)).getAllPageList(context);
}
private async removeExists(items:SubjectListItem[]):Promise<SubjectListItem[]> {
return items;
}
}

@ -1,26 +0,0 @@
import {CheerioAPI} from "cheerio";
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
import DoubanPlugin from "../../../../main";
import {SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "@App/sync/model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext";
//TODO will support in future version
export class DoubanMusicSyncHandler extends DoubanAbstractSyncHandler {
getSyncType(): SyncType {
return SyncType.music;
}
support(t: string): boolean {
throw new Error("Method not implemented.");
}
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
return Promise.resolve();
}
}

@ -1,10 +0,0 @@
import HandleContext from "@App/data/model/HandleContext";
import {SubjectListItem} from "@App/data/model/SubjectListItem";
import {SyncConfig} from "@App/sync/model/SyncConfig";
export interface DoubanListHandler {
getAllPageList(context: HandleContext):Promise<SubjectListItem[]>;
support(config:SyncConfig):boolean;
}

@ -6,8 +6,8 @@ import {i18nHelper} from "../lang/helper";
export const BasicConst = { export const BasicConst = {
YAML_FRONT_MATTER_SYMBOL: '---', YAML_FRONT_MATTER_SYMBOL: '---',
CLEAN_STATUS_BAR_DELAY: 5000, CLEAN_STATUS_BAR_DELAY: 5000,
CLEAN_STATUS_BAR_DELAY_RANGE: 2000, CALL_DOUBAN_DELAY: 3000,
CALL_DOUBAN_DELAY_RANGE: 3000,
} }
/** /**
@ -84,15 +84,32 @@ export enum SyncType {
/** /**
* *
*/ */
// @ts-ignore
export const SyncTypeRecords: { [key in SyncType]: string } = { export const SyncTypeRecords: { [key in SyncType]: string } = {
[SyncType.movie]: i18nHelper.getMessage('504103'), [SyncType.movie]: i18nHelper.getMessage('504103'),
[SyncType.book]: i18nHelper.getMessage('504102'), [SyncType.book]: i18nHelper.getMessage('504102'),
[SyncType.broadcast]: i18nHelper.getMessage('504104'), // [SyncType.broadcast]: i18nHelper.getMessage('504104'),
[SyncType.note]: i18nHelper.getMessage('504105'), // [SyncType.note]: i18nHelper.getMessage('504105'),
[SyncType.music]: i18nHelper.getMessage('504105'), [SyncType.music]: i18nHelper.getMessage('504106'),
} }
export const PAGE_SIZE:number = 15; export const PAGE_SIZE:number = 30;
/**
*
*/
export enum Action {
SearchAndReplace='SearchAndReplace',
SearchAndCrate='SearchAndCrate',
Sync='Sync',
SearchEditorAndReplace='SearchEditorAndReplace'
}
export enum SyncItemStatus {
exists= 'exists',
replace= 'replace',
create= 'create',
fail= 'fail',
}

@ -1,4 +1,4 @@
import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; import {DoubanPluginSetting} from "../douban/setting/model/DoubanPluginSetting";
import {PersonNameMode, SupportType} from "./Constsant"; import {PersonNameMode, SupportType} from "./Constsant";
import {doubanHeaders} from "./Douban"; import {doubanHeaders} from "./Douban";

@ -0,0 +1,83 @@
import { Notice } from 'obsidian';
import { log } from 'src/org/wanxp/utils/Logutil';
import {i18nHelper} from "../../lang/helper";
import {DoubanSettingTab} from "../setting/DoubanSettingTab";
import SettingsManager from "../setting/SettingsManager";
import {constructDoubanTokenSettingsUI} from "../setting/BasicSettingsHelper";
// Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin
export default class DoubanHumanCheckModel {
private modal: any;
private url:string;
constructor(url:string) {
this.url = url;
const { remote } = require('electron');
const { BrowserWindow: RemoteBrowserWindow } = remote;
this.modal = new RemoteBrowserWindow({
parent: remote.getCurrentWindow(),
width: 960,
height: 540,
show: false
});
this.modal.once('ready-to-show', () => {
this.modal.setTitle(i18nHelper.getMessage('100102'));
this.modal.show();
});
const session = this.modal.webContents.session;
const filter = {
urls: [this.url]
};
session.webRequest.onSendHeaders(filter, async (details:any) => {
const cookies = details.requestHeaders['Cookie'];
const cookieArr = this.parseCookies(cookies);
// const wr_name = cookieArr.find((cookie) => cookie.name == 'wr_name').value;
if (cookieArr) {
this.onClose();
} else {
this.onReload();
}
});
}
private parseCookies(cookies: any) {
return cookies;
}
async load() {
try {
await this.modal.loadURL(this.url);
} catch (error) {
log.error(i18nHelper.getMessage('100101'), error)
}
}
async loadUrl(url:string) {
try {
await this.modal.loadURL(url);
} catch (error) {
log.error(i18nHelper.getMessage('100101'), error)
}
}
async loadHtml(html:string) {
try {
await this.modal.loadURL(`data:text/html;charset=utf-8,${html}`);
} catch (error) {
log.error(i18nHelper.getMessage('100101'), error)
}
}
onClose() {
this.modal.close();
new Notice(i18nHelper.getMessage('100103'))
}
onReload() {
this.modal.reload();
}
}

@ -1,9 +1,9 @@
import { Notice } from 'obsidian'; import { Notice } from 'obsidian';
import { log } from 'src/utils/Logutil'; import { log } from 'src/org/wanxp/utils/Logutil';
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; import {DoubanSettingTab} from "../setting/DoubanSettingTab";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "../setting/SettingsManager";
import {constructDoubanTokenSettingsUI} from "@App/setting/BasicSettingsHelper"; import {constructDoubanTokenSettingsUI} from "../setting/BasicSettingsHelper";
// Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin // Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin
@ -35,7 +35,7 @@ export default class DoubanLoginModel {
const session = this.modal.webContents.session; const session = this.modal.webContents.session;
const filter = { const filter = {
urls: ['https://www.douban.com/','https://accounts.douban.com/'] urls: ['https://www.douban.com/','https://accounts.douban.com/','https://accounts.douban.com/passport/login']
}; };
session.webRequest.onSendHeaders(filter, async (details:any) => { session.webRequest.onSendHeaders(filter, async (details:any) => {
const cookies = details.requestHeaders['Cookie']; const cookies = details.requestHeaders['Cookie'];

@ -1,7 +1,7 @@
import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; import {DoubanSettingTab} from "../setting/DoubanSettingTab";
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "../setting/SettingsManager";
import {constructDoubanTokenSettingsUI, constructLoginSettingsUI} from "@App/setting/BasicSettingsHelper"; import {constructDoubanTokenSettingsUI, constructLoginSettingsUI} from "../setting/BasicSettingsHelper";
import {log} from "../../utils/Logutil"; import {log} from "../../utils/Logutil";
// Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin // Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin

@ -0,0 +1,223 @@
import {
App,
ButtonComponent,
DropdownComponent,
Modal, SearchComponent, Setting,
ToggleComponent
} from "obsidian";
import DoubanPlugin from "../../main";
import {i18nHelper} from "src/org/wanxp/lang/helper";
import HandleContext from "../data/model/HandleContext";
import {SyncType, SyncTypeRecords} from "../../constant/Constsant";
import {
ALL,
DoubanSubjectStateRecords_BOOK_SYNC, DoubanSubjectStateRecords_BROADCAST_SYNC,
DoubanSubjectStateRecords_MOVIE_SYNC, DoubanSubjectStateRecords_NOTE_SYNC
} from "../../constant/DoubanUserState";
import {SyncConfig} from "../sync/model/SyncConfig";
import {clearInterval} from "timers";
import {statSync} from "fs";
import {CreateTemplateSelectParams} from "../setting/model/CreateTemplateSelectParams";
import {FolderSuggest} from "../setting/model/FolderSuggest";
export class DoubanSyncModal extends Modal {
plugin: DoubanPlugin;
context: HandleContext
timer: any;
constructor(app: App, plugin: DoubanPlugin, context: HandleContext) {
super(app);
this.plugin = plugin;
this.context = context;
}
onOpen() {
let {contentEl} = this;
this.show(contentEl);
}
private show(contentEl: HTMLElement) {
contentEl.empty();
if (this.plugin.statusHolder.syncing()) {
this.showSyncStatus(contentEl);
} else {
this.showSyncConfig(contentEl);
}
}
private showSyncStatus(contentEl: HTMLElement) {
const {syncStatus} = this.plugin.statusHolder;
const {syncConfig} = syncStatus;
contentEl.createEl("h3", {text: i18nHelper.getMessage('500002')});
this.showConfigPan(contentEl, syncConfig, true);
const sliderDiv = contentEl.createEl('div');
sliderDiv.addClass('obsidian_douban_sync_slider');
this.showProgress(sliderDiv);
const controls = contentEl.createDiv("controls");
const syncButton = new ButtonComponent(controls)
.setButtonText(i18nHelper.getMessage('110009'))
.onClick(async () => {
this.close();
await this.plugin.statusHolder.stopSync();
})
const cancelButton = new ButtonComponent(controls)
.setButtonText(i18nHelper.getMessage('110010'))
.onClick(() => {
this.close();
});
cancelButton.setClass("obsidian_douban_search_button");
syncButton.setClass("obsidian_douban_search_button");
this.timer = setInterval(() => {
this.showProgress(sliderDiv);
}, 1000);
}
private showProgress(sliderDiv: HTMLDivElement) {
const {syncStatus} = this.plugin.statusHolder;
if (!syncStatus) {
return;
}
sliderDiv.innerHTML = `<p>
<label for="file">${i18nHelper.getMessage('110033')}</label>
<progress class="obsidian_douban_sync_slider" max="${syncStatus.getTotal()}" value="${syncStatus.getHandle()}"> </progress> <span> ${syncStatus.getHandle()}/${syncStatus.getTotal()} </span>
</p>`}
private showSyncConfig(contentEl: HTMLElement) {
if (this.timer != null) {
clearInterval(this.timer)
}
contentEl.createEl("h3", {text: i18nHelper.getMessage('500001')});
let syncConfig:SyncConfig = {syncType: SyncType.movie, scope: ALL, force: false, outputFolder: this.plugin.settings.dataFilePath};
this.showConfigPan(contentEl, syncConfig, false);
const controls = contentEl.createDiv("controls");
const syncButton = new ButtonComponent(controls)
.setButtonText(i18nHelper.getMessage('110007'))
.onClick(async () => {
syncButton.setDisabled(true);
if(!this.plugin.statusHolder.startSync(syncConfig)) {
return;
}
this.show(contentEl);
await this.plugin.sync(syncConfig, this.context);
})
const cancelButton = new ButtonComponent(controls)
.setButtonText(i18nHelper.getMessage('110005'))
.onClick(() => {
this.close();
});
cancelButton.setClass("obsidian_douban_search_button");
syncButton.setClass("obsidian_douban_search_button");
}
private showConfigPan(contentEl: HTMLElement, config:SyncConfig, disable:boolean) {
const typeSelections = contentEl.createDiv('type-selection');
const typeSelectionLabel = typeSelections.createEl('label');
typeSelectionLabel.setText(i18nHelper.getMessage('110030'))
typeSelectionLabel.addClass('obsidian_douban_settings_text')
const syncTypeDropdown = new DropdownComponent(typeSelections);
const scopeSelections = contentEl.createDiv("scope-selection");
syncTypeDropdown.addOptions(SyncTypeRecords)
.setValue(config.syncType)
.onChange((value) => {
config.syncType = value;
this.openScopeDropdown(scopeSelections, config, disable);
});
this.openScopeDropdown(scopeSelections, config, disable);
const forceSelections = contentEl.createDiv('force-selection');
let forceLabel = forceSelections.createEl('label');
forceLabel.setText(i18nHelper.getMessage('110031'));
forceLabel.addClass('obsidian_douban_settings_text');
forceLabel.addClass('obsidian_douban_sync_config_text');
const toggle:ToggleComponent = new ToggleComponent(forceSelections)
.setTooltip(i18nHelper.getMessage('500110'))
.setValue(config.force)
.onChange((value) => {
config.force = value;
});
if (disable) {
syncTypeDropdown.setDisabled(true);
toggle.setDisabled(true);
}
const folderSelections = contentEl.createDiv('folder-selection');
let folderLabel = folderSelections.createEl('label');
folderLabel.setText(i18nHelper.getMessage('110034'));
folderLabel.addClass('obsidian_douban_settings_text');
folderLabel.addClass('obsidian_douban_sync_config_text');
this.createFolderSetting(folderSelections, config, disable);
typeSelections.addClass('obsidian_douban_sync_config');
scopeSelections.addClass('obsidian_douban_sync_config');
forceSelections.addClass('obsidian_douban_sync_config');
}
async onClose() {
let {contentEl} = this;
contentEl.empty();
if (this.timer != null) {
clearInterval(this.timer);
}
}
private openScopeDropdown(contentEl:HTMLDivElement, config: SyncConfig, disable:boolean) {
contentEl.empty();
let scopeLabel = contentEl.createEl('label');
scopeLabel.addClass('obsidian_douban_settings_text');
scopeLabel.setText(i18nHelper.getMessage('110032'));
switch (config.syncType) {
case SyncType.movie:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_MOVIE_SYNC, config, disable);
break;
case SyncType.book:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BOOK_SYNC, config, disable);
break;
case SyncType.broadcast:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BROADCAST_SYNC, config, disable);
break;
case SyncType.note:
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_NOTE_SYNC, config, disable);
break;
}
}
private showScopeDropdown(contentEl:HTMLDivElement, scopeSelections: Record<string, string>, config: SyncConfig, disable:boolean) {
const syncScopeTypeDropdown = new DropdownComponent(contentEl)
.addOptions(scopeSelections)
.setValue(config.scope)
.onChange((value) => {
config.scope = value;
});
if (disable) {
syncScopeTypeDropdown.setDisabled(true);
}
}
private createFolderSetting(contentEl:HTMLDivElement, config: SyncConfig, disable:boolean) {
let outputFolder = this.plugin.settings.dataFilePath;
if (config.outputFolder) {
outputFolder = config.outputFolder;
}
const search = new SearchComponent(contentEl);
new FolderSuggest(this.plugin.app, search.inputEl);
search.setValue(outputFolder)
.setPlaceholder(i18nHelper.getMessage('121503'))
.onChange(async (value:string) => {
config.outputFolder = value;
})
if (disable) {
search.setDisabled(true);
}
}
}

@ -1,9 +1,9 @@
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject'; import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject';
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import {moment, request, RequestUrlParam, TFile} from "obsidian"; import {moment, request, RequestUrlParam, TFile} from "obsidian";
import {i18nHelper} from 'src/lang/helper'; import {i18nHelper} from 'src/org/wanxp/lang/helper';
import {log} from "src/utils/Logutil"; import {log} from "src/org/wanxp/utils/Logutil";
import {CheerioAPI, load} from "cheerio"; import {CheerioAPI, load} from "cheerio";
import YamlUtil from "../../../utils/YamlUtil"; import YamlUtil from "../../../utils/YamlUtil";
import { import {
@ -14,13 +14,15 @@ import {
TemplateKey, TemplateKey,
TemplateTextMode TemplateTextMode
} from "../../../constant/Constsant"; } from "../../../constant/Constsant";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import HandleResult from "@App/data/model/HandleResult"; import HandleResult from "../model/HandleResult";
import {getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent"; import {getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent";
import StringUtil from "../../../utils/StringUtil"; import StringUtil from "../../../utils/StringUtil";
import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings";
import {DoubanUserParameter, UserStateSubject} from "@App/data/model/UserStateSubject"; import {DoubanUserParameter, UserStateSubject} from "../model/UserStateSubject";
import {DoubanSubjectState, DoubanSubjectStateRecords} from "../../../constant/DoubanUserState"; import {DoubanSubjectState, DoubanSubjectStateRecords} from "../../../constant/DoubanUserState";
import DoubanLoginModel from "../../component/DoubanLoginModel";
import DoubanHumanCheckModel from "../../component/DoubanHumanCheckModel";
export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> { export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
@ -62,7 +64,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
fileName = this.parsePartText(this.getFileName(context), extract, context); fileName = this.parsePartText(this.getFileName(context), extract, context);
} }
return {content: result, fileName: fileName}; return {content: result, fileName: fileName, subject:extract};
} }
private getFileName(context: HandleContext): string { private getFileName(context: HandleContext): string {
@ -140,6 +142,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
throw: true throw: true
}; };
request(requestUrlParam) request(requestUrlParam)
.then(s => this.humanCheck(s, url))
.then(load) .then(load)
.then(data => this.analysisUserState(data, context)) .then(data => this.analysisUserState(data, context))
.then(({data, userState}) => { .then(({data, userState}) => {
@ -149,11 +152,16 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
}) })
.then(content => this.toEditor(context, content)) .then(content => this.toEditor(context, content))
// .then(content => content ? editor.replaceSelection(content) : content) // .then(content => content ? editor.replaceSelection(content) : content)
.catch(e => log .catch(e => {
.error( log.error(i18nHelper.getMessage('130101', e.toString()), e);
i18nHelper.getMessage('130101') if (url) {
.replace('{0}', e.toString()) let id = StringUtil.analyzeIdByUrl(url);
, e)); context.syncStatusHolder?context.syncStatusHolder.fail(id, ''):null;
}else {
context.syncStatusHolder?context.syncStatusHolder.handled(1):null;
}
});
; ;
} }
@ -409,4 +417,17 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
extract.image = filepath; extract.image = filepath;
} }
} }
private async humanCheck(html:any, url:string):Promise<any> {
if (html && html.indexOf("<title>禁止访问</title>") != -1) {
const loginModel = new DoubanHumanCheckModel(url);
await loginModel.load();
return '';
}else {
return html;
}
}
} }

@ -1,10 +1,11 @@
import {CheerioAPI} from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject"; import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import {SupportType, TemplateTextMode} from "../../../constant/Constsant"; import {SupportType, TemplateTextMode} from "../../../constant/Constsant";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import StringUtil from "../../../utils/StringUtil";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> { export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {
@ -76,10 +77,7 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
} }
valueMap.set(BookKeyValueMap.get(key), value); valueMap.set(BookKeyValueMap.get(key), value);
}) })
let id = StringUtil.analyzeIdByUrl(url);
let idPattern = /(\d){5,10}/g;
let idE = idPattern.exec(url);
let id = idE ? idE[0] : '';
let menuIdDom = html('#dir_' + id + '_full') ? html('#dir_' + id + '_full') : html('#dir_' + id + '_short'); let menuIdDom = html('#dir_' + id + '_full') ? html('#dir_' + id + '_full') : html('#dir_' + id + '_short');
let menu: string[] = menuIdDom ? html(menuIdDom.get(0)).text().trim().split('\n').map(row => row.trim()) : []; let menu: string[] = menuIdDom ? html(menuIdDom.get(0)).text().trim().split('\n').map(row => row.trim()) : [];
menu.length > 0 ? menu.pop() : menu; menu.length > 0 ? menu.pop() : menu;

@ -1,10 +1,10 @@
import {CheerioAPI} from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import DoubanGameSubject from '../model/DoubanGameSubject'; import DoubanGameSubject from '../model/DoubanGameSubject';
import StringUtil from "../../../utils/StringUtil"; import StringUtil from "../../../utils/StringUtil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import {SupportType, TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> { export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> {

@ -1,11 +1,11 @@
import {CheerioAPI} from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import SchemaOrg from "src/utils/SchemaOrg"; import SchemaOrg from "src/org/wanxp/utils/SchemaOrg";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import DoubanMovieSubject from '../model/DoubanMovieSubject'; import DoubanMovieSubject from '../model/DoubanMovieSubject';
import StringUtil from "../../../utils/StringUtil"; import StringUtil from "../../../utils/StringUtil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import {PersonNameMode, SupportType, TemplateKey} from "../../../constant/Constsant"; import {PersonNameMode, SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> { export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> {

@ -1,9 +1,9 @@
import {CheerioAPI} from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanMusicSubject from '../model/DoubanMusicSubject'; import DoubanMusicSubject from '../model/DoubanMusicSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import {SupportType, TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> { export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> {

@ -1,10 +1,10 @@
import {CheerioAPI} from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanNoteSubject from '../model/DoubanNoteSubject'; import DoubanNoteSubject from '../model/DoubanNoteSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import html2markdown from '@notable/html2markdown'; import html2markdown from '@notable/html2markdown';
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import {SupportType, TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> { export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> {

@ -1,9 +1,9 @@
import {CheerioAPI} from "cheerio"; import {CheerioAPI} from "cheerio";
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import {i18nHelper} from "src/lang/helper"; import {i18nHelper} from "src/org/wanxp/lang/helper";
import {log} from "src/utils/Logutil"; import {log} from "src/org/wanxp/utils/Logutil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import {SupportType, TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
/** /**

@ -5,13 +5,13 @@ import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler";
import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler"; import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler";
import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler"; import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler";
import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler"; import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import {DoubanTeleplayLoadHandler} from "./DoubanTeleplayLoadHandler"; import {DoubanTeleplayLoadHandler} from "./DoubanTeleplayLoadHandler";
import DoubanGameLoadHandler from "./DoubanGameLoadHandler"; import DoubanGameLoadHandler from "./DoubanGameLoadHandler";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import HandleResult from "@App/data/model/HandleResult"; import HandleResult from "../model/HandleResult";
export class DoubanSearchChooseItemHandler { export class DoubanSearchChooseItemHandler {
@ -34,7 +34,7 @@ export class DoubanSearchChooseItemHandler {
this._doubanSubjectHandlerDefault]; this._doubanSubjectHandlerDefault];
} }
public handle(searchExtract: DoubanSubject, context: HandleContext): void { public async handle(searchExtract: DoubanSubject, context: HandleContext): Promise<void> {
if (!searchExtract) { if (!searchExtract) {
return; return;
} }

@ -1,6 +1,6 @@
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import HandleResult from "@App/data/model/HandleResult"; import HandleResult from "../model/HandleResult";
export default interface DoubanSubjectLoadHandler<T extends DoubanSubject> { export default interface DoubanSubjectLoadHandler<T extends DoubanSubject> {

@ -1,10 +1,10 @@
import {CheerioAPI} from "cheerio"; import {CheerioAPI} from "cheerio";
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import DoubanTeleplaySubject from "../model/DoubanTeleplaySubject"; import DoubanTeleplaySubject from "../model/DoubanTeleplaySubject";
import SchemaOrg from "src/utils/SchemaOrg"; import SchemaOrg from "src/org/wanxp/utils/SchemaOrg";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
import {SupportType, TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
/** /**

@ -1,4 +1,4 @@
import {UserStateSubject} from "@App/data/model/UserStateSubject"; import {UserStateSubject} from "./UserStateSubject";
export default class DoubanSubject { export default class DoubanSubject {
id: string; id: string;

@ -0,0 +1,20 @@
import {SearchHandleMode} from "../../../constant/Constsant";
import {Editor} from "obsidian";
import { DoubanPluginSetting } from "../../setting/model/DoubanPluginSetting";
import UserComponent from "../../user/UserComponent";
import NetFileHandler from "src/org/wanxp/net/NetFileHandler";
import DoubanPlugin from "../../../main";
import SyncStatusHolder from "../../sync/model/SyncStatusHolder";
export default interface HandleContext {
plugin:DoubanPlugin;
mode:SearchHandleMode;
settings: DoubanPluginSetting;
editor?:Editor;
userComponent: UserComponent;
netFileHandler: NetFileHandler;
showAfterCreate?:boolean;
syncStatusHolder?:SyncStatusHolder;
action:string;
outputFolder:string;
}

@ -1,4 +1,7 @@
import DoubanSubject from "./DoubanSubject";
export default interface HandleResult { export default interface HandleResult {
content:string content:string
fileName?:string fileName?:string
subject?:DoubanSubject,
} }

@ -1,4 +1,4 @@
import { DoubanSubjectState } from "src/constant/DoubanUserState"; import { DoubanSubjectState } from "src/org/wanxp/constant/DoubanUserState";
export interface UserStateSubject { export interface UserStateSubject {
tags: string[]; tags: string[];

@ -1,10 +1,10 @@
import {FuzzySuggestModal} from "obsidian"; import {FuzzySuggestModal} from "obsidian";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject"; import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject";
import {log} from "src/utils/Logutil"; import {log} from "src/org/wanxp/utils/Logutil";
import {i18nHelper} from "../../../lang/helper"; import {i18nHelper} from "../../../lang/helper";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
export {DoubanFuzzySuggester} export {DoubanFuzzySuggester}
@ -33,7 +33,7 @@ class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject>
} }
onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void { onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void {
this.plugin.showStatus('140204', item.title); this.plugin.showStatus(i18nHelper.getMessage('140204', item.title));
this.plugin.doubanExtractHandler.handle(item, this.context); this.plugin.doubanExtractHandler.handle(item, this.context);
} }

@ -1,8 +1,8 @@
import {App, Modal, TextComponent} from "obsidian"; import {App, Modal, TextComponent} from "obsidian";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import {i18nHelper} from "src/lang/helper"; import {i18nHelper} from "src/org/wanxp/lang/helper";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../model/HandleContext";
export class DoubanSearchModal extends Modal { export class DoubanSearchModal extends Modal {
searchTerm: string; searchTerm: string;

@ -1,11 +1,11 @@
import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject'; import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject';
import SearchParserHandler from './SearchParser'; import SearchParserHandler from './SearchParser';
import {log} from 'src/utils/Logutil'; import {log} from 'src/org/wanxp/utils/Logutil';
import {request, RequestUrlParam} from "obsidian"; import {request, RequestUrlParam} from "obsidian";
import {i18nHelper} from "../../../lang/helper"; import {i18nHelper} from "../../../lang/helper";
import {load} from 'cheerio'; import {load} from 'cheerio';
import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; import {DoubanPluginSetting} from "../../setting/model/DoubanPluginSetting";
import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings";
export default class Searcher { export default class Searcher {

@ -0,0 +1,33 @@
import GlobalSyncStatusHolder from "../sync/model/GlobalSyncStatusHolder";
import {SyncConfig} from "../sync/model/SyncConfig";
import {Notice} from "obsidian";
import {i18nHelper} from "../../lang/helper";
import {SyncTypeRecords} from "../../constant/Constsant";
import {DoubanSubjectState} from "../../constant/DoubanUserState";
export default class GlobalStatusHolder {
public syncStatus:GlobalSyncStatusHolder;
public completeSync() {
this.syncStatus = null;
}
public startSync(syncConfigOut: SyncConfig):boolean {
if (this.syncStatus) {
const {syncConfig} = this.syncStatus;
// @ts-ignore
new Notice(i18nHelper.getMessage('110008'), SyncTypeRecords[syncConfig.syncType], DoubanSubjectState[syncConfig.scope]);
return false;
}
this.syncStatus = new GlobalSyncStatusHolder(syncConfigOut);
return true;
}
public stopSync() {
this.syncStatus = null;
}
public syncing() {
return this.syncStatus;
}
}

@ -1,11 +1,11 @@
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import {Platform, Setting} from "obsidian"; import {Platform, Setting} from "obsidian";
import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./SettingsManager";
import DoubanLoginModel from "@App/component/DoubanLoginModel"; import DoubanLoginModel from "../component/DoubanLoginModel";
import DoubanLogoutModel from "@App/component/DoubanLogoutModel"; import DoubanLogoutModel from "../component/DoubanLogoutModel";
import User from "@App/user/User"; import User from "../user/User";
import {createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper"; import {createFolderSelectionSetting} from "./TemplateSettingHelper";
export function constructBasicUI(containerEl: HTMLElement, manager: SettingsManager) { export function constructBasicUI(containerEl: HTMLElement, manager: SettingsManager) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1210') }); containerEl.createEl('h3', { text: i18nHelper.getMessage('1210') });

@ -1,6 +1,6 @@
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./SettingsManager";
import {CustomProperty} from "@App/setting/model/CustomProperty"; import {CustomProperty} from "./model/CustomProperty";
import {ButtonComponent, DropdownComponent, ExtraButtonComponent, Setting, TextComponent} from "obsidian"; import {ButtonComponent, DropdownComponent, ExtraButtonComponent, Setting, TextComponent} from "obsidian";
import {SupportType} from "../../constant/Constsant"; import {SupportType} from "../../constant/Constsant";

@ -1,16 +1,16 @@
import {App, PluginSettingTab, SearchComponent, Setting} from "obsidian"; import {App, PluginSettingTab, SearchComponent, Setting} from "obsidian";
import DoubanPlugin from "main"; import DoubanPlugin from "../../main";
import {i18nHelper} from "src/lang/helper"; import {i18nHelper} from "src/org/wanxp/lang/helper";
import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant"; import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./SettingsManager";
import {FolderSuggest} from "@App/setting/model/FolderSuggest"; import {FolderSuggest} from "./model/FolderSuggest";
import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; import { DEFAULT_SETTINGS } from "src/org/wanxp/constant/DefaultSettings";
import { constructOutUI } from "./OutputSettingsHelper"; import { constructOutUI } from "./OutputSettingsHelper";
import { constructTemplateUI } from "./TemplateSettingHelper"; import { constructTemplateUI } from "./TemplateSettingHelper";
import { constructBasicUI } from "./BasicSettingsHelper"; import { constructBasicUI } from "./BasicSettingsHelper";
import { constructTemplateVariablesUI } from "./TemplateVariableSettingsHelper"; import { constructTemplateVariablesUI } from "./TemplateVariableSettingsHelper";
import {constructCustomPropertySettingsUI, constructCustomPropertyUI} from "@App/setting/CustomPropertySettingsHelper"; import {constructCustomPropertySettingsUI, constructCustomPropertyUI} from "./CustomPropertySettingsHelper";
/** /**
* *

@ -1,9 +1,9 @@
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import {Setting} from "obsidian"; import {Setting} from "obsidian";
import {createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper"; import {createFolderSelectionSetting} from "./TemplateSettingHelper";
import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings";
import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant"; import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./SettingsManager";
export function constructOutUI(containerEl: HTMLElement, manager: SettingsManager) { export function constructOutUI(containerEl: HTMLElement, manager: SettingsManager) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1220') }); containerEl.createEl('h3', { text: i18nHelper.getMessage('1220') });

@ -1,6 +1,6 @@
import {App, Setting} from "obsidian"; import {App, Setting} from "obsidian";
import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; import { DEFAULT_SETTINGS } from "src/org/wanxp/constant/DefaultSettings";
import DoubanPlugin from "../../../main"; import DoubanPlugin from "../../main";
import { DoubanPluginSetting } from "./model/DoubanPluginSetting"; import { DoubanPluginSetting } from "./model/DoubanPluginSetting";
export default class SettingsManager { export default class SettingsManager {

@ -1,11 +1,11 @@
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import {CreateTemplateSelectParams} from "@App/setting/model/CreateTemplateSelectParams"; import {CreateTemplateSelectParams} from "./model/CreateTemplateSelectParams";
import { FileSuggest } from "./model/FileSuggest"; import { FileSuggest } from "./model/FileSuggest";
import {SearchComponent, Setting} from "obsidian"; import {SearchComponent, Setting} from "obsidian";
import { log } from "src/utils/Logutil"; import { log } from "src/org/wanxp/utils/Logutil";
import {getDefaultTemplateContent} from "../../constant/DefaultTemplateContent"; import {getDefaultTemplateContent} from "../../constant/DefaultTemplateContent";
import {FolderSuggest} from "@App/setting/model/FolderSuggest"; import {FolderSuggest} from "./model/FolderSuggest";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./SettingsManager";
export function constructTemplateUI(containerEl: HTMLElement, manager: SettingsManager) { export function constructTemplateUI(containerEl: HTMLElement, manager: SettingsManager) {

@ -1,4 +1,4 @@
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./SettingsManager";
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import {Setting} from "obsidian"; import {Setting} from "obsidian";

@ -1,4 +1,4 @@
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "../SettingsManager";
import { DoubanPluginSetting } from "./DoubanPluginSetting"; import { DoubanPluginSetting } from "./DoubanPluginSetting";
export interface CreateTemplateSelectParams { export interface CreateTemplateSelectParams {

@ -1,4 +1,4 @@
import {CustomProperty} from "@App/setting/model/CustomProperty"; import {CustomProperty} from "./CustomProperty";
export interface DoubanPluginSetting { export interface DoubanPluginSetting {
movieTemplateFile: string, movieTemplateFile: string,

@ -1,5 +1,5 @@
import {TAbstractFile, TFile, TFolder} from "obsidian"; import {TAbstractFile, TFile, TFolder} from "obsidian";
import {TextInputSuggest} from "@App/setting/model/TextInputSuggest"; import {TextInputSuggest} from "./TextInputSuggest";
// Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes
export class FileSuggest extends TextInputSuggest<TFile> { export class FileSuggest extends TextInputSuggest<TFile> {

@ -1,5 +1,5 @@
import { TAbstractFile, TFolder } from "obsidian"; import { TAbstractFile, TFolder } from "obsidian";
import {TextInputSuggest} from "@App/setting/model/TextInputSuggest"; import {TextInputSuggest} from "./TextInputSuggest";
// Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes
export class FolderSuggest extends TextInputSuggest<TFolder> { export class FolderSuggest extends TextInputSuggest<TFolder> {

@ -0,0 +1,80 @@
import {CheerioAPI} from "cheerio";
import DoubanSyncSubject from "../model/DoubanSyncSubject";
import DoubanPlugin from "../../../main";
import {BasicConst, SyncType} from "../../../constant/Constsant";
import {DoubanSyncHandler} from "./DoubanSyncHandler";
import { SyncConfig } from "../model/SyncConfig";
import HandleContext from "../../data/model/HandleContext";
import {SubjectListItem} from "../../data/model/SubjectListItem";
import {sleepRange} from "../../../utils/TimeUtil";
import DoubanSubjectLoadHandler from "../../data/handler/DoubanSubjectLoadHandler";
import {DoubanListHandler} from "./list/DoubanListHandler";
import DoubanSubject from "../../data/model/DoubanSubject";
export abstract class DoubanAbstractSyncHandler<T extends DoubanSubject> implements DoubanSyncHandler{
private plugin: DoubanPlugin;
private doubanSubjectLoadHandler:DoubanSubjectLoadHandler<T>;
private doubanListHandlers:DoubanListHandler[];
constructor(plugin: DoubanPlugin,
doubanSubjectLoadHandler:DoubanSubjectLoadHandler<T>,
doubanListHandlers:DoubanListHandler[]) {
this.plugin = plugin;
this.doubanSubjectLoadHandler = doubanSubjectLoadHandler;
this.doubanListHandlers = doubanListHandlers;
}
support(t: string): boolean {
return this.getSyncType() == t;
}
abstract getSyncType(): SyncType;
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
return Promise.resolve()
.then(() => this.getItems(syncConfig, context))
.then(items => this.removeExists(items , syncConfig, context))
.then(items => this.handleItems(items, context));
}
private async getItems(syncConfig:SyncConfig, context:HandleContext):Promise<SubjectListItem[]> {
const supportHandlers:DoubanListHandler[] = this.doubanListHandlers.filter((h) => h.support(syncConfig));
let items:SubjectListItem[] = [];
for(const handler of supportHandlers) {
if (!context.plugin.statusHolder.syncing()) {
return [];
}
const item = await handler.getAllPageList(context);
if (item) {
items = items.concat(item);
}
}
return items;
}
private async removeExists(items:SubjectListItem[], syncConfig: SyncConfig, context: HandleContext):Promise<SubjectListItem[]> {
if (!context.plugin.statusHolder.syncing()) {
return [];
}
return items;
}
private async handleItems(items:SubjectListItem[], context:HandleContext):Promise<void> {
if (!items || items.length == 0) {
return ;
}
context.syncStatusHolder.setTotal(items.length);
for (const item of items) {
await sleepRange(BasicConst.CALL_DOUBAN_DELAY, BasicConst.CALL_DOUBAN_DELAY + BasicConst.CALL_DOUBAN_DELAY_RANGE);
if (!context.plugin.statusHolder.syncing()) {
return;
}
await this.doubanSubjectLoadHandler.handle(item.url, context);
}
}
}

@ -0,0 +1,25 @@
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanPlugin from "../../../main";
import {SyncType} from "../../../constant/Constsant";
import DoubanBookSubject from "../../data/model/DoubanBookSubject";
import DoubanBookLoadHandler from "../../data/handler/DoubanBookLoadHandler";
import DoubanBookWishListHandler from "./list/DoubanBookWishListHandler";
import DoubanBookCollectListHandler from "./list/DoubanBookCollectListHandler";
import DoubanBookDoListHandler from "./list/DoubanBookDoListHandler";
//TODO will support in future version
export class DoubanBookSyncHandler extends DoubanAbstractSyncHandler<DoubanBookSubject> {
constructor(plugin:DoubanPlugin) {
super(plugin, new DoubanBookLoadHandler(plugin),[
new DoubanBookCollectListHandler(),
new DoubanBookWishListHandler(),
new DoubanBookDoListHandler()]);
}
getSyncType(): SyncType {
return SyncType.book;
}
}

@ -1,13 +1,14 @@
import {CheerioAPI} from "cheerio"; import {CheerioAPI} from "cheerio";
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
import DoubanPlugin from "../../../../main"; import DoubanPlugin from "../../../main";
import {SyncType} from "../../../constant/Constsant"; import {SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import {SyncConfig} from "../model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../data/model/HandleContext";
import DoubanSubject from "../../data/model/DoubanSubject";
//TODO will support in future version //TODO will support in future version
export class DoubanBroadcastSyncHandler extends DoubanAbstractSyncHandler { export class DoubanBroadcastSyncHandler extends DoubanAbstractSyncHandler<DoubanSubject> {
getSyncType(): SyncType { getSyncType(): SyncType {
return SyncType.broadcast; return SyncType.broadcast;

@ -0,0 +1,35 @@
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import {BasicConst, SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "../model/SyncConfig";
import HandleContext from "../../data/model/HandleContext";
import DoubanSubjectLoadHandler from "../../data/handler/DoubanSubjectLoadHandler";
import DoubanMovieLoadHandler from "../../data/handler/DoubanMovieLoadHandler";
import DoubanMovieSubject from "../../data/model/DoubanMovieSubject";
import DoubanPlugin from "../../../main";
import {SubjectListItem} from "../../data/model/SubjectListItem";
import DoubanMovieCollectListHandler from "./list/DoubanMovieCollectListHandler";
import {DoubanListHandler} from "./list/DoubanListHandler";
import DoubanMovieWishListHandler from "./list/DoubanMovieWishListHandler";
import DoubanMovieDoListHandler from "./list/DoubanMovieDoListHandler";
import TimeUtil, {sleepRange} from "../../../utils/TimeUtil";
import {log} from "../../../utils/Logutil";
//TODO will support in future version
export class DoubanMovieSyncHandler extends DoubanAbstractSyncHandler<DoubanMovieSubject>{
constructor(plugin:DoubanPlugin) {
super(plugin, new DoubanMovieLoadHandler(plugin),[
new DoubanMovieCollectListHandler(),
new DoubanMovieWishListHandler(),
new DoubanMovieDoListHandler()]);
}
getSyncType(): SyncType {
return SyncType.movie;
}
}

@ -0,0 +1,25 @@
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanPlugin from "../../../main";
import {SyncType} from "../../../constant/Constsant";
import DoubanMusicSubject from "../../data/model/DoubanMusicSubject";
import DoubanMusicCollectListHandler from "./list/DoubanMusicCollectListHandler";
import DoubanMusicLoadHandler from "../../data/handler/DoubanMusicLoadHandler";
import DoubanMusicWishListHandler from "./list/DoubanMusicWishListHandler";
import DoubanMusicDoListHandler from "./list/DoubanMusicDoListHandler";
//TODO will support in future version
export class DoubanMusicSyncHandler extends DoubanAbstractSyncHandler<DoubanMusicSubject> {
getSyncType(): SyncType {
return SyncType.music;
}
constructor(plugin: DoubanPlugin) {
super(plugin, new DoubanMusicLoadHandler(plugin), [
new DoubanMusicCollectListHandler(),
new DoubanMusicWishListHandler(),
new DoubanMusicDoListHandler()]);
}
}

@ -1,13 +1,14 @@
import {CheerioAPI} from "cheerio"; import {CheerioAPI} from "cheerio";
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
import DoubanPlugin from "../../../../main"; import DoubanPlugin from "../../../main";
import {SyncType} from "../../../constant/Constsant"; import {SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import {SyncConfig} from "../model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../data/model/HandleContext";
import DoubanNoteSubject from "../../data/model/DoubanNoteSubject";
//TODO will support in future version //TODO will support in future version
export class DoubanNoteSyncHandler extends DoubanAbstractSyncHandler { export class DoubanNoteSyncHandler extends DoubanAbstractSyncHandler<DoubanNoteSubject> {
getSyncType(): SyncType { getSyncType(): SyncType {
return SyncType.note; return SyncType.note;

@ -1,13 +1,18 @@
import {CheerioAPI} from "cheerio";
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; import DoubanPlugin from "../../../main";
import DoubanPlugin from "../../../../main";
import {SyncType} from "../../../constant/Constsant"; import {SyncType} from "../../../constant/Constsant";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import {SyncConfig} from "../model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../data/model/HandleContext";
import DoubanSubject from "../../data/model/DoubanSubject";
import DoubanOtherLoadHandler from "../../data/handler/DoubanOtherLoadHandler";
//TODO will support in future version //TODO will support in future version
export class DoubanOtherSyncHandler extends DoubanAbstractSyncHandler { export class DoubanOtherSyncHandler extends DoubanAbstractSyncHandler<DoubanSubject> {
constructor(plugin:DoubanPlugin) {
super(plugin, new DoubanOtherLoadHandler(plugin),[]);
}
getSyncType(): SyncType { getSyncType(): SyncType {
throw new Error("暂不支持同步这类型的数据"); throw new Error("暂不支持同步这类型的数据");

@ -1,10 +1,10 @@
import {CheerioAPI} from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from 'src/douban/data/handler/DoubanAbstractLoadHandler'; import DoubanAbstractLoadHandler from 'src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler';
import DoubanNoteSubject from '../model/DoubanPageBroadcastSubject'; import DoubanNoteSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject'; import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import DoubanSubject from 'src/douban/data/model/DoubanSubject'; import DoubanSubject from 'src/org/wanxp/douban/data/model/DoubanSubject';
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../data/model/HandleContext";
import {SupportType, TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
//TODO will support in future version //TODO will support in future version

@ -1,7 +1,7 @@
import {CheerioAPI} from "cheerio"; import {CheerioAPI} from "cheerio";
import DoubanSyncSubject from "../model/DoubanSyncSubject"; import DoubanSyncSubject from "../model/DoubanSyncSubject";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import {SyncConfig} from "../model/SyncConfig";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../data/model/HandleContext";
export interface DoubanSyncHandler { export interface DoubanSyncHandler {

@ -1,24 +1,24 @@
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../data/model/HandleContext";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import {SyncConfig} from "../model/SyncConfig";
import DoubanPlugin from "main"; import DoubanPlugin from "../../../main";
import {App} from "obsidian"; import {App} from "obsidian";
import {DoubanSyncHandler} from "@App/sync/handler/DoubanSyncHandler"; import {DoubanSyncHandler} from "./DoubanSyncHandler";
import DoubanOtherLoadHandler from "@App/data/handler/DoubanOtherLoadHandler"; import DoubanOtherLoadHandler from "../../data/handler/DoubanOtherLoadHandler";
import DoubanMovieLoadHandler from "@App/data/handler/DoubanMovieLoadHandler"; import DoubanMovieLoadHandler from "../../data/handler/DoubanMovieLoadHandler";
import DoubanBookLoadHandler from "@App/data/handler/DoubanBookLoadHandler"; import DoubanBookLoadHandler from "../../data/handler/DoubanBookLoadHandler";
import {DoubanTeleplayLoadHandler} from "@App/data/handler/DoubanTeleplayLoadHandler"; import {DoubanTeleplayLoadHandler} from "../../data/handler/DoubanTeleplayLoadHandler";
import DoubanMusicLoadHandler from "@App/data/handler/DoubanMusicLoadHandler"; import DoubanMusicLoadHandler from "../../data/handler/DoubanMusicLoadHandler";
import DoubanNoteLoadHandler from "@App/data/handler/DoubanNoteLoadHandler"; import DoubanNoteLoadHandler from "../../data/handler/DoubanNoteLoadHandler";
import DoubanGameLoadHandler from "@App/data/handler/DoubanGameLoadHandler"; import DoubanGameLoadHandler from "../../data/handler/DoubanGameLoadHandler";
import { DoubanBroadcastSyncHandler } from "./DoubanBroadcastSyncHandler"; import { DoubanBroadcastSyncHandler } from "./DoubanBroadcastSyncHandler";
import {DoubanOtherSyncHandler} from "@App/sync/handler/DoubanOtherSyncHandler"; import {DoubanOtherSyncHandler} from "./DoubanOtherSyncHandler";
import { DoubanMovieSyncHandler } from "./DoubanMovieSyncHandler"; import { DoubanMovieSyncHandler } from "./DoubanMovieSyncHandler";
import { DoubanNoteSyncHandler } from "./DoubanNoteSyncHandler"; import { DoubanNoteSyncHandler } from "./DoubanNoteSyncHandler";
import { DoubanMusicSyncHandler } from "./DoubanMusicSyncHandler"; import { DoubanMusicSyncHandler } from "./DoubanMusicSyncHandler";
import { DoubanBookSyncHandler } from "./DoubanBookSyncHandler"; import { DoubanBookSyncHandler } from "./DoubanBookSyncHandler";
import DoubanSubjectLoadHandler from "@App/data/handler/DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "../../data/handler/DoubanSubjectLoadHandler";
import DoubanSubject from "@App/data/model/DoubanSubject"; import DoubanSubject from "../../data/model/DoubanSubject";
import {DoubanAbstractSyncHandler} from "@App/sync/handler/DoubanAbstractSyncHandler"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
export default class SyncHandler { export default class SyncHandler {
private app: App; private app: App;
@ -38,8 +38,8 @@ export default class SyncHandler {
[ [
new DoubanMovieSyncHandler(plugin), new DoubanMovieSyncHandler(plugin),
new DoubanBookSyncHandler(plugin), new DoubanBookSyncHandler(plugin),
new DoubanBroadcastSyncHandler(plugin), // new DoubanBroadcastSyncHandler(plugin),
new DoubanNoteSyncHandler(plugin), // new DoubanNoteSyncHandler(plugin),
new DoubanMusicSyncHandler(plugin), new DoubanMusicSyncHandler(plugin),
this.defaultSyncHandler this.defaultSyncHandler
]; ];

@ -1,15 +1,15 @@
import {moment, request, RequestUrlParam, TFile} from "obsidian"; import { request, RequestUrlParam} from "obsidian";
import {i18nHelper} from 'src/lang/helper'; import {i18nHelper} from 'src/org/wanxp/lang/helper';
import {log} from "src/utils/Logutil"; import {log} from "src/org/wanxp/utils/Logutil";
import {CheerioAPI, load} from "cheerio"; import {CheerioAPI, load} from "cheerio";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "../../../data/model/HandleContext";
import {doubanSubjectSyncListUrl} from "../../../../constant/Douban"; import {doubanSubjectSyncListUrl} from "../../../../constant/Douban";
import {BasicConst, PAGE_SIZE} from "../../../../constant/Constsant"; import {BasicConst, PAGE_SIZE} from "../../../../constant/Constsant";
import DoubanSearchResultSubject from "@App/data/model/DoubanSearchResultSubject"; import {SubjectListItem} from "../../../data/model/SubjectListItem";
import {SubjectListItem} from "@App/data/model/SubjectListItem"; import {DoubanListHandler} from "./DoubanListHandler";
import {DoubanListHandler} from "@App/sync/handler/list/DoubanListHandler"; import {SyncConfig} from "../../model/SyncConfig";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import { sleepRange} from "../../../../utils/TimeUtil";
import TimeUtil from "../../../../utils/TimeUtil"; import {ALL} from "../../../../constant/DoubanUserState";
export default abstract class DoubanAbstractListHandler implements DoubanListHandler{ export default abstract class DoubanAbstractListHandler implements DoubanListHandler{
@ -18,15 +18,18 @@ export default abstract class DoubanAbstractListHandler implements DoubanListHan
let pages:SubjectListItem[] = []; let pages:SubjectListItem[] = [];
let start = 0; let start = 0;
do { do {
await sleepRange(BasicConst.CALL_DOUBAN_DELAY,
BasicConst.CALL_DOUBAN_DELAY + BasicConst.CALL_DOUBAN_DELAY_RANGE);
const url:string = this.getUrl(context, start); const url:string = this.getUrl(context, start);
pages = await TimeUtil.delayRange(() => this.getPageList(url, context), if (!context.plugin.statusHolder.syncing()) {
BasicConst.CLEAN_STATUS_BAR_DELAY - BasicConst.CLEAN_STATUS_BAR_DELAY_RANGE, return [];
BasicConst.CLEAN_STATUS_BAR_DELAY - BasicConst.CLEAN_STATUS_BAR_DELAY_RANGE); }
pages = await this.getPageList(url, context);
if (pages) { if (pages) {
all = all.concat(pages); all = all.concat(pages);
} }
start = start + PAGE_SIZE; start = start + PAGE_SIZE;
} while (pages) } while (pages && pages.length > 0)
return all; return all;
} }
@ -80,8 +83,7 @@ export default abstract class DoubanAbstractListHandler implements DoubanListHan
} }
support(config: SyncConfig): boolean { support(config: SyncConfig): boolean {
return this.getDoType() == config.scope; return this.getDoType() == config.scope || ALL == config.scope;
} }
} }

@ -0,0 +1,10 @@
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import {DoubanBookListHandler} from "./DoubanBookListHandler";
export default class DoubanBookCollectListHandler extends DoubanBookListHandler{
getDoType(): string {
return DoubanSubjectState.collect;
}
}

@ -0,0 +1,10 @@
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanBookListHandler } from "./DoubanBookListHandler";
export default class DoubanBookDoListHandler extends DoubanBookListHandler{
getDoType(): string {
return DoubanSubjectState.do;
}
}

@ -0,0 +1,13 @@
import DoubanAbstractListHandler from "./DoubanAbstractListHandler";
import { SyncType} from "../../../../constant/Constsant";
export abstract class DoubanBookListHandler extends DoubanAbstractListHandler {
getSyncType(): string {
return SyncType.book;
}
abstract getDoType(): string;
}

@ -0,0 +1,10 @@
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanBookListHandler } from "./DoubanBookListHandler";
export default class DoubanBookWishListHandler extends DoubanBookListHandler{
getDoType(): string {
return DoubanSubjectState.wish;
}
}

@ -0,0 +1,10 @@
import HandleContext from "../../../data/model/HandleContext";
import {SubjectListItem} from "../../../data/model/SubjectListItem";
import {SyncConfig} from "../../model/SyncConfig";
export interface DoubanListHandler {
getAllPageList(context: HandleContext):Promise<SubjectListItem[]>;
support(config:SyncConfig):boolean;
}

@ -1,4 +1,4 @@
import { DoubanSubjectState} from "src/constant/DoubanUserState"; import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; import { DoubanMovieListHandler } from "./DoubanMovieListHandler";

@ -1,4 +1,4 @@
import { DoubanSubjectState} from "src/constant/DoubanUserState"; import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; import { DoubanMovieListHandler } from "./DoubanMovieListHandler";

@ -1,4 +1,4 @@
import DoubanAbstractListHandler from "@App/sync/handler/list/DoubanAbstractListHandler"; import DoubanAbstractListHandler from "./DoubanAbstractListHandler";
import { SyncType} from "../../../../constant/Constsant"; import { SyncType} from "../../../../constant/Constsant";
export abstract class DoubanMovieListHandler extends DoubanAbstractListHandler { export abstract class DoubanMovieListHandler extends DoubanAbstractListHandler {

@ -1,4 +1,4 @@
import { DoubanSubjectState} from "src/constant/DoubanUserState"; import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; import { DoubanMovieListHandler } from "./DoubanMovieListHandler";

@ -0,0 +1,10 @@
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanMusicListHandler } from "./DoubanMusicListHandler";
export default class DoubanMusicCollectListHandler extends DoubanMusicListHandler{
getDoType(): string {
return DoubanSubjectState.collect;
}
}

@ -0,0 +1,10 @@
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import { DoubanMusicListHandler } from "./DoubanMusicListHandler";
export default class DoubanMusicDoListHandler extends DoubanMusicListHandler{
getDoType(): string {
return DoubanSubjectState.do;
}
}

@ -0,0 +1,13 @@
import DoubanAbstractListHandler from "./DoubanAbstractListHandler";
import { SyncType} from "../../../../constant/Constsant";
export abstract class DoubanMusicListHandler extends DoubanAbstractListHandler {
getSyncType(): string {
return SyncType.music;
}
abstract getDoType(): string;
}

@ -0,0 +1,10 @@
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
import {DoubanMusicListHandler} from "./DoubanMusicListHandler";
export default class DoubanMusicWishListHandler extends DoubanMusicListHandler{
getDoType(): string {
return DoubanSubjectState.wish;
}
}

@ -1,4 +1,4 @@
import DoubanSubject from 'src/douban/data/model/DoubanSubject'; import DoubanSubject from 'src/org/wanxp/douban/data/model/DoubanSubject';
export default class DoubanPageBroadcastSubject extends DoubanSubject { export default class DoubanPageBroadcastSubject extends DoubanSubject {
pageNumber: number; pageNumber: number;

@ -0,0 +1,32 @@
import {SyncConfig} from "./SyncConfig";
import {SyncItemStatus} from "../../../constant/Constsant";
export default class GlobalSyncStatusHolder {
public syncConfig: SyncConfig;
private total:number;
private handle:number;
private startTime:number;
constructor(syncConfig: SyncConfig) {
this.syncConfig = syncConfig;
this.startTime = new Date().getTime();
this.total = 0;
this.handle = 0;
}
handled(num:number) {
this.handle = this.handle + num;
}
totalNum(num:number) {
this.total = num ;
}
getTotal():number {
return this.total;
}
getHandle():number {
return this.handle;
}
}

@ -2,4 +2,5 @@ export interface SyncConfig {
syncType: string, syncType: string,
scope: string, scope: string,
force:boolean, force:boolean,
outputFolder:string;
} }

@ -0,0 +1,7 @@
import {SyncItemStatus} from "../../../constant/Constsant";
export interface SyncItemResult {
id:string,
title:string,
status:SyncItemStatus,
}

@ -0,0 +1,56 @@
import {SyncConfig} from "./SyncConfig";
import GlobalSyncStatusHolder from "./GlobalSyncStatusHolder";
import {SyncItemResult} from "./SyncItemResult";
import {SyncItemStatus} from "../../../constant/Constsant";
import GlobalStatusHolder from "../../model/GlobalStatusHolder";
export default class SyncStatusHolder extends GlobalSyncStatusHolder{
private syncResultMap: Map<string, SyncItemResult> = new Map();
private statusHandleMap: Map<SyncItemStatus, number> = new Map([
[SyncItemStatus.exists, 0],
[SyncItemStatus.replace, 0],
[SyncItemStatus.create, 0],
[SyncItemStatus.fail, 0],
]);
private globalStatus:GlobalStatusHolder;
constructor(syncConfig: SyncConfig, globalStatus: GlobalStatusHolder) {
super(syncConfig)
this.globalStatus = globalStatus;
}
public replace(id:string, title:string) {
this.updateResult(id, title, SyncItemStatus.replace);
}
public exists(id:string, title:string) {
this.updateResult(id, title, SyncItemStatus.exists);
}
public create(id:string, title:string) {
this.updateResult(id, title, SyncItemStatus.create);
}
public fail(id:string, title:string) {
this.updateResult(id, title, SyncItemStatus.fail);
}
private updateResult(id:string, title:string, status:SyncItemStatus) {
this.syncResultMap.set(id, {id: id,title:title,status:status});
this.statusHandleMap.set(status, this.statusHandleMap.get(status) + 1);
super.handled(1);
if (this.globalStatus.syncing()) {
this.globalStatus.syncStatus.handled(1);
}
}
public setTotal(total:number) {
super.totalNum(total);
this.globalStatus.syncStatus.totalNum(total);
}
}

@ -1,14 +1,14 @@
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "../setting/SettingsManager";
import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; import {DoubanPluginSetting} from "../setting/model/DoubanPluginSetting";
import DoubanSearchResultSubject from "@App/data/model/DoubanSearchResultSubject"; import DoubanSearchResultSubject from "../data/model/DoubanSearchResultSubject";
import {request, RequestUrlParam} from "obsidian"; import {request, RequestUrlParam} from "obsidian";
import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings";
import {CheerioAPI, load} from "cheerio"; import {CheerioAPI, load} from "cheerio";
import SearchParserHandler from "@App/data/search/SearchParser"; import SearchParserHandler from "../data/search/SearchParser";
import {log} from "../../utils/Logutil"; import {log} from "../../utils/Logutil";
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import User from "@App/user/User"; import User from "./User";
import DoubanGameSubject from "@App/data/model/DoubanGameSubject"; import DoubanGameSubject from "../data/model/DoubanGameSubject";
export default class UserComponent { export default class UserComponent {
private settingsManager: SettingsManager; private settingsManager: SettingsManager;

@ -1,9 +1,10 @@
import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting"; import { DoubanPluginSetting } from "../douban/setting/model/DoubanPluginSetting";
import {App, normalizePath, Platform} from "obsidian"; import {App, normalizePath, Platform, TFile} from "obsidian";
import { log } from "src/utils/Logutil"; import { log } from "src/org/wanxp/utils/Logutil";
import DoubanPlugin from "../../main"; import DoubanPlugin from "../main";
import {FileUtil} from "../utils/FileUtil"; import {FileUtil} from "../utils/FileUtil";
import {i18nHelper} from "../lang/helper"; import {i18nHelper} from "../lang/helper";
import {exists} from "fs";
/** /**
* *
@ -119,7 +120,6 @@ export default class FileHandler {
const {dir, name} = FileUtil.parse(prependDirInput); const {dir, name} = FileUtil.parse(prependDirInput);
const filePath = FileUtil.join(dir, `${name}.md`); const filePath = FileUtil.join(dir, `${name}.md`);
try {
const fileExists = await adapter.exists(filePath); const fileExists = await adapter.exists(filePath);
if (fileExists) { if (fileExists) {
// If the file already exists, respond with error // If the file already exists, respond with error
@ -135,9 +135,40 @@ export default class FileHandler {
const leaf = this._app.workspace.splitLeafOrActive(); const leaf = this._app.workspace.splitLeafOrActive();
await leaf.openFile(File); await leaf.openFile(File);
} }
} catch (error) {
log.error(error.toString(), error);
} }
/**
* Handles creating the new note
* A new markdown file will be created at the given file path (`input`)
* in the specified parent folder (`this.folder`)
* return ture if exists
*/
async createOrReplaceNewNoteWithData(originalFilePath: string, data:string, showAfterSuccess:boolean=false): Promise<boolean> {
const {vault} = this._app;
const {adapter} = vault;
const prependDirInput = FileUtil.join("", originalFilePath);
const {dir, name} = FileUtil.parse(prependDirInput);
const filePath = FileUtil.join(dir, `${name}.md`);
const fileExists = await adapter.exists(filePath);
let File:TFile = null;
if (fileExists) {
File = vault.getMarkdownFiles().find(f => f.path == filePath);
await vault.modify(File, data);
}else {
if (dir !== '') {
// If `input` includes a directory part, create it
await this.createDirectory(dir);
}
File = await vault.create(filePath, data);
}
// Create the file and open it in the active leaf
if (showAfterSuccess) {
const leaf = this._app.workspace.splitLeafOrActive();
await leaf.openFile(File);
}
return fileExists;
} }
async getFileContent(filePath: string | undefined): Promise<string> { async getFileContent(filePath: string | undefined): Promise<string> {

@ -11,12 +11,18 @@ const locale = localeMap[lang || 'en'];
export default class I18nHelper { export default class I18nHelper {
public getMessage(str: keyof typeof en): string { public getMessage(str: keyof typeof en, ...params: any[]): string {
if (!locale) { if (!locale) {
console.error('Error: obsidian douban locale not found', lang); console.error('Error: obsidian douban locale not found', lang);
} }
return (locale && locale[str]) || en[str]; let val:string = (locale && locale[str]) || en[str];
if (params) {
for (let i:number = 0;i < params.length;i++) {
val = val.replaceAll(`{${i}}`, params[i])
}
}
return val;
} }
} }

@ -6,12 +6,21 @@ export default {
'110003': `Enter Search Term:`, '110003': `Enter Search Term:`,
'110004': `Search`, '110004': `Search`,
'110005': `Cancel`, '110005': `Cancel`,
'110006': `sync douban broadcast ot Obsidian`, '110006': `sync douban personal book-movie-music to Obsidian`,
'110101': 'search douban and create file', '110101': 'search douban and create file',
'110201': `{0} already exists`, '110201': `{0} already exists`,
'110202': `{0} template can not read`, '110202': `{0} template can not read`,
'110103': 'sync personal data from douban', '110103': 'sync personal data from douban',
'110007': `Start Sync`, '110007': `Start Sync`,
'110009': `Stop Sync`,
'110010': `Background`,
'110008': `Exists Sync: {0}-{1}`,
'110030': `Type:`,
'110031': `CoverExists:`,
'110032': `Scope:`,
'110033': `Progress:`,
'110034': `OutputFolder:`,
@ -33,6 +42,9 @@ export default {
'100123': `DoubanID`, '100123': `DoubanID`,
'100124': `Nickname`, '100124': `Nickname`,
'100125': `You can use your rating and reading status after logging in, see the last for specific variables.`, '100125': `You can use your rating and reading status after logging in, see the last for specific variables.`,
'100102': `Douban Human`,
'100103': `Douban: Please search and import again `,
'100126': `User Info`, '100126': `User Info`,
'100128': `Logout`, '100128': `Logout`,
@ -162,12 +174,15 @@ export default {
'130101': `Fetch Data Error, {0}`, '130101': `Fetch Data Error, {0}`,
'140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`, '140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`,
'140201': `[Obsidian Douban]: searching '{0}'...`, '140201': `[OB-Douban]: searching '{0}'...`,
'140202': `[Obsidian Douban]: result {0} rows`, '140202': `[OB-Douban]: result {0} rows`,
'140203': `[Obsidian Douban]: request '{0}'`, '140203': `[OB-Douban]: request '{0}'`,
'140204': `[Obsidian Douban]: replace '{0}'`, '140204': `[OB-Douban]: replace '{0}'`,
'140205': `[Obsidian Douban]: complete '{0}'`, '140205': `[OB-Douban]: complete '{0}'`,
'140206': `[Obsidian Douban]: occur error '{0}'`, '140206': `[OB-Douban]: occur error '{0}'`,
'140207': `[OB-Douban]: [{0}/{1}] {2}`,
'140208': `[OB-Douban]: [{0}/{1}] {2}`,
'140301': `Douban: Syncing...`, '140301': `Douban: Syncing...`,
'140303': `Douban: User Info Expire, Please login again`, '140303': `Douban: User Info Expire, Please login again`,
'140302': `Douban: Sync complete`, '140302': `Douban: Sync complete`,
@ -419,6 +434,10 @@ export default {
'504105': `My Note`, '504105': `My Note`,
'504106': `My Music`, '504106': `My Music`,
'500002': `Sync Status`,
'500110': `Replace exists or not`, '500110': `Replace exists or not`,

@ -9,14 +9,25 @@ export default {
'110005': `取消`, '110005': `取消`,
'110006': `同步豆瓣广播至Obsidian`, '110006': `同步豆瓣广播至Obsidian`,
'110101': '搜索豆瓣并创建文档', '110101': '搜索豆瓣并创建文档',
'110103': '同步豆瓣个人记录', '110103': '同步豆瓣个人书影音广播记录',
'110007': `开始同步`, '110007': `开始同步`,
'110009': `停止同步`,
'110010': `后台运行`,
'110008': `已经存在同步任务: {0}-{1} 结束之后再重试`,
'500002': `同步状态`,
'110030': `类型:`,
'110031': `替换已有:`,
'110032': `范围:`,
'110033': `进度:`,
'110034': `输出文件夹:`,
'110201': `{0} 文件已经存在.`, '110201': `{0} 文件已经存在.`,
'110202': `{0} 模板文件无法读取`, '110202': `{0} 模板文件无法读取`,
'100101': `登录豆瓣`, '100101': `登录豆瓣`,
'100102': `豆瓣人机验证`,
'100103': `人机认证通过,请重新搜索或导入`,
'100111': `豆瓣登录信息过期,请至Douban插件重新登录`, '100111': `豆瓣登录信息过期,请至Douban插件重新登录`,
'100113': `无法替换用户信息变量, 登录信息过期, 请重新登录Douban`, '100113': `无法替换用户信息变量, 登录信息过期, 请重新登录Douban`,
'100120': `已登录`, '100120': `已登录`,
@ -26,6 +37,7 @@ export default {
'100124': `昵称`, '100124': `昵称`,
'100125': `登录后, 可使用你的评分/阅读状态等作为导入参数,具体可用参数见最后.`, '100125': `登录后, 可使用你的评分/阅读状态等作为导入参数,具体可用参数见最后.`,
'100126': `豆瓣用户信息`, '100126': `豆瓣用户信息`,
'100128': `登出`, '100128': `登出`,
'100129': `豆瓣未登录,请先在电脑端登录!登录后导入参数可使用你的评分以及阅读状态等,具体可用参数见最后.`, '100129': `豆瓣未登录,请先在电脑端登录!登录后导入参数可使用你的评分以及阅读状态等,具体可用参数见最后.`,
@ -148,6 +160,7 @@ export default {
'121434': `assets`, '121434': `assets`,
'121501': `笔记存放位置`, '121501': `笔记存放位置`,
'121502': `创建的笔记将会存放至该文件夹中. 如果为空, 笔记将会存放到Obsidian的默认位置`, '121502': `创建的笔记将会存放至该文件夹中. 如果为空, 笔记将会存放到Obsidian的默认位置`,
@ -166,12 +179,14 @@ export default {
'130103': `Obsidian Douban插件异常提示:`, '130103': `Obsidian Douban插件异常提示:`,
'140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`, '140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`,
'140201': `[Obsidian Douban]: 开始搜索'{0}'...`, '140201': `[OB-Douban]: 开始搜索'{0}'...`,
'140202': `[Obsidian Douban]: 搜索条数{0}条`, '140202': `[OB-Douban]: 搜索条数{0}条`,
'140203': `[Obsidian Douban]: 请求豆瓣'{0}'...`, '140203': `[OB-Douban]: 请求豆瓣'{0}'...`,
'140204': `[Obsidian Douban]: 替换文本'{0}'...`, '140204': `[OB-Douban]: 替换文本'{0}'...`,
'140205': `[Obsidian Douban]: 处理完成'{0}'`, '140205': `[OB-Douban]: 处理完成'{0}'`,
'140206': `[Obsidian Douban]: 出现错误'{0}'`, '140206': `[OB-Douban]: 出现错误'{0}'`,
'140207': `[OB-Douban]: [{0}/{1}] {2}`,
'140208': `[OB-Douban]: [{0}/{1}] {2}`,
'140301': `Douban: 开始同步...`, '140301': `Douban: 开始同步...`,
@ -443,6 +458,8 @@ export default {
'504103': `我的电影`, '504103': `我的电影`,
'504104': `我的广播`, '504104': `我的广播`,
'504105': `我的日记`, '504105': `我的日记`,
'504106': `我的音乐`,
'ALL': `全部类型`, 'ALL': `全部类型`,
'MOVIE': `电影`, 'MOVIE': `电影`,

@ -1,26 +1,28 @@
import {Editor, Notice, Plugin} from "obsidian"; import {Editor, Notice, Plugin} from "obsidian";
import {DoubanFuzzySuggester} from "src/douban/data/search/DoubanSearchFuzzySuggestModal"; import {DoubanFuzzySuggester} from "./douban/data/search/DoubanSearchFuzzySuggestModal";
import {DoubanSearchChooseItemHandler} from "src/douban/data/handler/DoubanSearchChooseItemHandler"; import {DoubanSearchChooseItemHandler} from "./douban/data/handler/DoubanSearchChooseItemHandler";
import {DoubanSearchModal} from "src/douban/data/search/DoubanSearchModal"; import {DoubanSearchModal} from "./douban/data/search/DoubanSearchModal";
import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; import {DoubanSettingTab} from "./douban/setting/DoubanSettingTab";
import DoubanSubject from "src/douban/data/model/DoubanSubject"; import DoubanSubject from "./douban/data/model/DoubanSubject";
import Searcher from "src/douban/data/search/Search"; import Searcher from "./douban/data/search/Search";
import {i18nHelper} from './src/lang/helper'; import {i18nHelper} from './lang/helper';
import {log} from "src/utils/Logutil"; import {log} from "src/org/wanxp/utils/Logutil";
import {BasicConst, SearchHandleMode} from "./src/constant/Constsant"; import {Action, BasicConst, SearchHandleMode} from "./constant/Constsant";
import FileHandler from "./src/file/FileHandler"; import FileHandler from "./file/FileHandler";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "./douban/data/model/HandleContext";
import HandleResult from "@App/data/model/HandleResult"; import HandleResult from "./douban/data/model/HandleResult";
import {FileUtil} from "./src/utils/FileUtil"; import {FileUtil} from "./utils/FileUtil";
import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting"; import { DoubanPluginSetting } from "./douban/setting/model/DoubanPluginSetting";
import {DEFAULT_SETTINGS} from "./src/constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "./constant/DefaultSettings";
import UserComponent from "@App/user/UserComponent"; import UserComponent from "./douban/user/UserComponent";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "./douban/setting/SettingsManager";
import NetFileHandler from "./src/net/NetFileHandler"; import NetFileHandler from "./net/NetFileHandler";
import {DoubanSyncModal} from "@App/component/DoubanSyncModal"; import {DoubanSyncModal} from "./douban/component/DoubanSyncModal";
import SyncHandler from "@App/sync/handler/SyncHandler"; import SyncHandler from "./douban/sync/handler/SyncHandler";
import {SyncConfig} from "@App/sync/model/SyncConfig"; import {SyncConfig} from "./douban/sync/model/SyncConfig";
import GlobalStatusHolder from "./douban/model/GlobalStatusHolder";
import SyncStatusHolder from "./douban/sync/model/SyncStatusHolder";
export default class DoubanPlugin extends Plugin { export default class DoubanPlugin extends Plugin {
public settings: DoubanPluginSetting; public settings: DoubanPluginSetting;
@ -30,23 +32,34 @@ export default class DoubanPlugin extends Plugin {
public userComponent: UserComponent; public userComponent: UserComponent;
public settingsManager: SettingsManager; public settingsManager: SettingsManager;
public netFileHandler: NetFileHandler; public netFileHandler: NetFileHandler;
public statusHolder: GlobalStatusHolder;
async putToObsidian(context: HandleContext, extract: DoubanSubject) { async putToObsidian(context: HandleContext, extract: DoubanSubject) {
const {syncStatusHolder} = context;
try { try {
if (!extract) { if (!extract) {
log.warn(i18nHelper.getMessage('140101')); log.warn(i18nHelper.getMessage('140101'));
return; return;
} }
this.showStatus('140204', extract.title); if (Action.Sync == context.action) {
this.showStatus(i18nHelper.getMessage('140207', syncStatusHolder.getHandle(), syncStatusHolder.getTotal(), extract.title));
}else {
this.showStatus(i18nHelper.getMessage('140204', extract.title));
}
const result = await this.doubanExtractHandler.parseText(extract, context) const result = await this.doubanExtractHandler.parseText(extract, context)
if (result) { if (result) {
this.putContentToObsidian(context, result); await this.putContentToObsidian(context, result);
}
if (Action.Sync == context.action) {
this.showStatus(i18nHelper.getMessage('140208', syncStatusHolder.getHandle(), syncStatusHolder.getTotal(), extract.title));
}else {
this.showStatus(i18nHelper.getMessage('140205', extract.title));
} }
this.showStatus('140205', extract.title);
} catch (e) { } catch (e) {
log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e); log.error(i18nHelper.getMessage('140206', e.message), e);
syncStatusHolder!=null?syncStatusHolder.fail(extract.id, extract.title):null;
} finally { } finally {
this.clearStatusBarDelay(); this.clearStatusBarDelay();
} }
@ -56,10 +69,10 @@ export default class DoubanPlugin extends Plugin {
const {mode} = context; const {mode} = context;
switch (mode) { switch (mode) {
case SearchHandleMode.FOR_CREATE: case SearchHandleMode.FOR_CREATE:
this.createFile(context, result); await this.createFile(context, result);
break; break;
case SearchHandleMode.FOR_REPLACE: case SearchHandleMode.FOR_REPLACE:
this.putToEditor(context.editor, result.content); await this.putToEditor(context.editor, result.content);
break; break;
} }
} }
@ -72,14 +85,31 @@ export default class DoubanPlugin extends Plugin {
let filePath = this.settings.dataFilePath; let filePath = this.settings.dataFilePath;
filePath = filePath?filePath:DEFAULT_SETTINGS.dataFilePath; filePath = filePath?filePath:DEFAULT_SETTINGS.dataFilePath;
filePath = FileUtil.join(filePath, result.fileName); filePath = FileUtil.join(filePath, result.fileName);
this.fileHandler.createNewNoteWithData(filePath, result.content, context.showAfterCreate); const {syncStatusHolder} = context;
const {subject} = result;
if (Action.Sync == context.action) {
if (context.syncStatusHolder.syncConfig.force) {
const exists:boolean = await this.fileHandler.createOrReplaceNewNoteWithData(filePath, result.content, context.showAfterCreate);
if (exists) {
syncStatusHolder != null ? syncStatusHolder.replace(subject.id, subject.title):null;
}else {
syncStatusHolder != null ?syncStatusHolder.create(subject.id, subject.title):null;
}
}else {
await this.fileHandler.createNewNoteWithData(filePath, result.content, context.showAfterCreate);
syncStatusHolder != null ?syncStatusHolder.create(subject.id, subject.title):null;
}
}else {
await this.fileHandler.createNewNoteWithData(filePath, result.content, context.showAfterCreate);
syncStatusHolder != null ?syncStatusHolder.create(subject.id, subject.title):null;
}
} }
async search(searchTerm: string, context: HandleContext) { async search(searchTerm: string, context: HandleContext) {
try { try {
this.showStatus('140201', searchTerm); this.showStatus(i18nHelper.getMessage('140201', searchTerm));
const resultList = await Searcher.search(searchTerm, this.settings); const resultList = await Searcher.search(searchTerm, this.settings);
this.showStatus('140202', resultList.length.toString()); this.showStatus(i18nHelper.getMessage('140202', resultList.length.toString()));
new DoubanFuzzySuggester(this, context).showSearchList(resultList); new DoubanFuzzySuggester(this, context).showSearchList(resultList);
} catch (e) { } catch (e) {
log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e); log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e);
@ -120,43 +150,51 @@ export default class DoubanPlugin extends Plugin {
id: "search-douban-import-and-create-file", id: "search-douban-import-and-create-file",
name: i18nHelper.getMessage("110101"), name: i18nHelper.getMessage("110101"),
callback: () => callback: () =>
this.getDoubanTextForCreateNewNote({mode: SearchHandleMode.FOR_CREATE, this.getDoubanTextForCreateNewNote({plugin: this,
mode: SearchHandleMode.FOR_CREATE,
settings: this.settings, settings: this.settings,
userComponent: this.userComponent, userComponent: this.userComponent,
netFileHandler: this.netFileHandler, netFileHandler: this.netFileHandler,
showAfterCreate:true}), showAfterCreate:true,
action: Action.SearchAndCrate}),
}); });
this.addCommand({ this.addCommand({
id: "search-douban-and-input-current-file", id: "search-douban-and-input-current-file",
name: i18nHelper.getMessage("110002"), name: i18nHelper.getMessage("110002"),
editorCallback: (editor: Editor) => editorCallback: (editor: Editor) =>
this.getDoubanTextForSearchTerm({mode: SearchHandleMode.FOR_REPLACE, this.getDoubanTextForSearchTerm({plugin: this,
mode: SearchHandleMode.FOR_REPLACE,
settings: this.settings, settings: this.settings,
editor: editor, editor: editor,
userComponent: this.userComponent, userComponent: this.userComponent,
netFileHandler: this.netFileHandler}), netFileHandler: this.netFileHandler,
action: Action.SearchAndReplace}),
}); });
this.addCommand({ this.addCommand({
id: "search-douban-by-current-file-name", id: "search-douban-by-current-file-name",
name: i18nHelper.getMessage("110001"), name: i18nHelper.getMessage("110001"),
editorCallback: (editor: Editor) => editorCallback: (editor: Editor) =>
this.getDoubanTextForActiveFile({mode: SearchHandleMode.FOR_REPLACE, this.getDoubanTextForActiveFile({plugin: this,
mode: SearchHandleMode.FOR_REPLACE,
settings: this.settings, settings: this.settings,
editor: editor, editor: editor,
userComponent: this.userComponent, userComponent: this.userComponent,
netFileHandler: this.netFileHandler}), netFileHandler: this.netFileHandler,
action: Action.SearchEditorAndReplace}),
}); });
this.addCommand({ this.addCommand({
id: "sync-douban-import-and-create-file", id: "sync-douban-import-and-create-file",
name: i18nHelper.getMessage("110103"), name: i18nHelper.getMessage("110103"),
callback: () => callback: () =>
this.showSyncModal({mode: SearchHandleMode.FOR_CREATE, this.showSyncModal({plugin: this,
mode: SearchHandleMode.FOR_CREATE,
settings: this.settings, settings: this.settings,
userComponent: this.userComponent, userComponent: this.userComponent,
netFileHandler: this.netFileHandler}), netFileHandler: this.netFileHandler,
action: Action.Sync}),
}); });
this.settingsManager = new SettingsManager(app, this); this.settingsManager = new SettingsManager(app, this);
@ -167,6 +205,7 @@ export default class DoubanPlugin extends Plugin {
} }
this.addSettingTab(new DoubanSettingTab(this.app, this)); this.addSettingTab(new DoubanSettingTab(this.app, this));
this.statusHolder = new GlobalStatusHolder();
} }
async loadSettings() { async loadSettings() {
@ -183,13 +222,12 @@ export default class DoubanPlugin extends Plugin {
showStatus(origin: string, message: string) { showStatus(origin: string) {
if (!this.settings.statusBar || !this.doubanStatusBar) { if (!this.settings.statusBar || !this.doubanStatusBar) {
return; return;
} }
this.doubanStatusBar.empty(); this.doubanStatusBar.empty();
// @ts-ignore this.doubanStatusBar.setText(origin);
this.doubanStatusBar.setText(i18nHelper.getMessage(origin).replace('{0}', message));
} }
clearStatusBarDelay() { clearStatusBarDelay() {
@ -205,14 +243,17 @@ export default class DoubanPlugin extends Plugin {
if (!result) { if (!result) {
return; return;
} }
context.syncStatusHolder = new SyncStatusHolder(syncConfig, this.statusHolder);
new Notice(i18nHelper.getMessage('140301')); new Notice(i18nHelper.getMessage('140301'));
this.showStatus('140203', syncConfig.syncType); this.showStatus(i18nHelper.getMessage('140203', syncConfig.syncType));
const syncHandler = new SyncHandler(this.app, this, syncConfig, context); const syncHandler = new SyncHandler(this.app, this, syncConfig, context);
await syncHandler.sync(); await syncHandler.sync();
new Notice(i18nHelper.getMessage('140302')); new Notice(i18nHelper.getMessage('140302'));
} catch (e) { } catch (e) {
log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e); log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e);
} finally { } finally {
context.plugin.statusHolder.completeSync();
this.clearStatusBarDelay(); this.clearStatusBarDelay();
} }
} }

Some files were not shown because too many files have changed in this diff Show More