diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 21fcdd5..5a25b9b 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -15,7 +15,7 @@ esbuild.build({ banner: { js: banner, }, - entryPoints: ['main.ts'], + entryPoints: ['src/org/wanxp/main.ts'], bundle: true, external: [ 'obsidian', diff --git a/src/douban/component/DoubanSyncModal.ts b/src/douban/component/DoubanSyncModal.ts deleted file mode 100644 index f32c74b..0000000 --- a/src/douban/component/DoubanSyncModal.ts +++ /dev/null @@ -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) { - contentEl.empty(); - const syncScopeTypeDropdown = new DropdownComponent(contentEl) - .addOptions(scopeSelections) - .setValue(ALL) - .onChange((value) => { - this.syncConfig.scope = value; - }); - } -} diff --git a/src/douban/data/model/HandleContext.ts b/src/douban/data/model/HandleContext.ts deleted file mode 100644 index 38bc270..0000000 --- a/src/douban/data/model/HandleContext.ts +++ /dev/null @@ -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; -} diff --git a/src/douban/sync/handler/DoubanAbstractSyncHandler.ts b/src/douban/sync/handler/DoubanAbstractSyncHandler.ts deleted file mode 100644 index 9ede30a..0000000 --- a/src/douban/sync/handler/DoubanAbstractSyncHandler.ts +++ /dev/null @@ -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; - - abstract getSyncType(): SyncType; -} - - diff --git a/src/douban/sync/handler/DoubanBookSyncHandler.ts b/src/douban/sync/handler/DoubanBookSyncHandler.ts deleted file mode 100644 index dbfd85b..0000000 --- a/src/douban/sync/handler/DoubanBookSyncHandler.ts +++ /dev/null @@ -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{ - return Promise.resolve(); - } - -} diff --git a/src/douban/sync/handler/DoubanMovieSyncHandler.ts b/src/douban/sync/handler/DoubanMovieSyncHandler.ts deleted file mode 100644 index 4f8856a..0000000 --- a/src/douban/sync/handler/DoubanMovieSyncHandler.ts +++ /dev/null @@ -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; - 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{ - 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 { - return this.doubanListHandlers.find((h) => h.support(syncConfig)).getAllPageList(context); - } - - private async removeExists(items:SubjectListItem[]):Promise { - return items; - } -} diff --git a/src/douban/sync/handler/DoubanMusicSyncHandler.ts b/src/douban/sync/handler/DoubanMusicSyncHandler.ts deleted file mode 100644 index 79821b3..0000000 --- a/src/douban/sync/handler/DoubanMusicSyncHandler.ts +++ /dev/null @@ -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{ - return Promise.resolve(); - } - - - -} diff --git a/src/douban/sync/handler/list/DoubanListHandler.ts b/src/douban/sync/handler/list/DoubanListHandler.ts deleted file mode 100644 index e934244..0000000 --- a/src/douban/sync/handler/list/DoubanListHandler.ts +++ /dev/null @@ -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; - - support(config:SyncConfig):boolean; -} diff --git a/src/constant/Constsant.ts b/src/org/wanxp/constant/Constsant.ts similarity index 74% rename from src/constant/Constsant.ts rename to src/org/wanxp/constant/Constsant.ts index 6b0443a..5395a8f 100644 --- a/src/constant/Constsant.ts +++ b/src/org/wanxp/constant/Constsant.ts @@ -6,8 +6,8 @@ import {i18nHelper} from "../lang/helper"; export const BasicConst = { YAML_FRONT_MATTER_SYMBOL: '---', 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 } = { [SyncType.movie]: i18nHelper.getMessage('504103'), [SyncType.book]: i18nHelper.getMessage('504102'), - [SyncType.broadcast]: i18nHelper.getMessage('504104'), - [SyncType.note]: i18nHelper.getMessage('504105'), - [SyncType.music]: i18nHelper.getMessage('504105'), + // [SyncType.broadcast]: i18nHelper.getMessage('504104'), + // [SyncType.note]: 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', +} diff --git a/src/constant/DefaultSettings.ts b/src/org/wanxp/constant/DefaultSettings.ts similarity index 92% rename from src/constant/DefaultSettings.ts rename to src/org/wanxp/constant/DefaultSettings.ts index 5910ba6..2e57155 100644 --- a/src/constant/DefaultSettings.ts +++ b/src/org/wanxp/constant/DefaultSettings.ts @@ -1,4 +1,4 @@ -import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; +import {DoubanPluginSetting} from "../douban/setting/model/DoubanPluginSetting"; import {PersonNameMode, SupportType} from "./Constsant"; import {doubanHeaders} from "./Douban"; diff --git a/src/constant/DefaultTemplateContent.ts b/src/org/wanxp/constant/DefaultTemplateContent.ts similarity index 100% rename from src/constant/DefaultTemplateContent.ts rename to src/org/wanxp/constant/DefaultTemplateContent.ts diff --git a/src/constant/Douban.ts b/src/org/wanxp/constant/Douban.ts similarity index 100% rename from src/constant/Douban.ts rename to src/org/wanxp/constant/Douban.ts diff --git a/src/constant/DoubanUserState.ts b/src/org/wanxp/constant/DoubanUserState.ts similarity index 100% rename from src/constant/DoubanUserState.ts rename to src/org/wanxp/constant/DoubanUserState.ts diff --git a/src/org/wanxp/douban/component/DoubanHumanCheckModel.ts b/src/org/wanxp/douban/component/DoubanHumanCheckModel.ts new file mode 100644 index 0000000..2b5aa8b --- /dev/null +++ b/src/org/wanxp/douban/component/DoubanHumanCheckModel.ts @@ -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(); + } +} diff --git a/src/douban/component/DoubanLoginModel.ts b/src/org/wanxp/douban/component/DoubanLoginModel.ts similarity index 86% rename from src/douban/component/DoubanLoginModel.ts rename to src/org/wanxp/douban/component/DoubanLoginModel.ts index d353f9c..f824078 100644 --- a/src/douban/component/DoubanLoginModel.ts +++ b/src/org/wanxp/douban/component/DoubanLoginModel.ts @@ -1,9 +1,9 @@ import { Notice } from 'obsidian'; -import { log } from 'src/utils/Logutil'; +import { log } from 'src/org/wanxp/utils/Logutil'; import {i18nHelper} from "../../lang/helper"; -import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; -import SettingsManager from "@App/setting/SettingsManager"; -import {constructDoubanTokenSettingsUI} from "@App/setting/BasicSettingsHelper"; +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 @@ -35,7 +35,7 @@ export default class DoubanLoginModel { const session = this.modal.webContents.session; 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) => { const cookies = details.requestHeaders['Cookie']; diff --git a/src/douban/component/DoubanLogoutModel.ts b/src/org/wanxp/douban/component/DoubanLogoutModel.ts similarity index 90% rename from src/douban/component/DoubanLogoutModel.ts rename to src/org/wanxp/douban/component/DoubanLogoutModel.ts index fc9405e..69e277a 100644 --- a/src/douban/component/DoubanLogoutModel.ts +++ b/src/org/wanxp/douban/component/DoubanLogoutModel.ts @@ -1,7 +1,7 @@ -import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; +import {DoubanSettingTab} from "../setting/DoubanSettingTab"; import {i18nHelper} from "../../lang/helper"; -import SettingsManager from "@App/setting/SettingsManager"; -import {constructDoubanTokenSettingsUI, constructLoginSettingsUI} from "@App/setting/BasicSettingsHelper"; +import SettingsManager from "../setting/SettingsManager"; +import {constructDoubanTokenSettingsUI, constructLoginSettingsUI} from "../setting/BasicSettingsHelper"; import {log} from "../../utils/Logutil"; // Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin diff --git a/src/org/wanxp/douban/component/DoubanSyncModal.ts b/src/org/wanxp/douban/component/DoubanSyncModal.ts new file mode 100644 index 0000000..8a31651 --- /dev/null +++ b/src/org/wanxp/douban/component/DoubanSyncModal.ts @@ -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 = `

+ + ${syncStatus.getHandle()}/${syncStatus.getTotal()} +

`} + + 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, 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); + } + } + +} diff --git a/src/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts similarity index 92% rename from src/douban/data/handler/DoubanAbstractLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts index debc9b0..f946953 100644 --- a/src/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -1,9 +1,9 @@ -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject'; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import {moment, request, RequestUrlParam, TFile} from "obsidian"; -import {i18nHelper} from 'src/lang/helper'; -import {log} from "src/utils/Logutil"; +import {i18nHelper} from 'src/org/wanxp/lang/helper'; +import {log} from "src/org/wanxp/utils/Logutil"; import {CheerioAPI, load} from "cheerio"; import YamlUtil from "../../../utils/YamlUtil"; import { @@ -14,13 +14,15 @@ import { TemplateKey, TemplateTextMode } from "../../../constant/Constsant"; -import HandleContext from "@App/data/model/HandleContext"; -import HandleResult from "@App/data/model/HandleResult"; +import HandleContext from "../model/HandleContext"; +import HandleResult from "../model/HandleResult"; import {getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent"; import StringUtil from "../../../utils/StringUtil"; 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 DoubanLoginModel from "../../component/DoubanLoginModel"; +import DoubanHumanCheckModel from "../../component/DoubanHumanCheckModel"; export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { @@ -62,7 +64,7 @@ export default abstract class DoubanAbstractLoadHandler 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 { @@ -140,6 +142,7 @@ export default abstract class DoubanAbstractLoadHandler throw: true }; request(requestUrlParam) + .then(s => this.humanCheck(s, url)) .then(load) .then(data => this.analysisUserState(data, context)) .then(({data, userState}) => { @@ -149,11 +152,16 @@ export default abstract class DoubanAbstractLoadHandler }) .then(content => this.toEditor(context, content)) // .then(content => content ? editor.replaceSelection(content) : content) - .catch(e => log - .error( - i18nHelper.getMessage('130101') - .replace('{0}', e.toString()) - , e)); + .catch(e => { + log.error(i18nHelper.getMessage('130101', e.toString()), e); + if (url) { + let id = StringUtil.analyzeIdByUrl(url); + context.syncStatusHolder?context.syncStatusHolder.fail(id, ''):null; + }else { + context.syncStatusHolder?context.syncStatusHolder.handled(1):null; + + } + }); ; } @@ -409,4 +417,17 @@ export default abstract class DoubanAbstractLoadHandler extract.image = filepath; } } + + private async humanCheck(html:any, url:string):Promise { + if (html && html.indexOf("禁止访问") != -1) { + const loginModel = new DoubanHumanCheckModel(url); + await loginModel.load(); + return ''; + }else { + return html; + } + + + + } } diff --git a/src/douban/data/handler/DoubanBookLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts similarity index 96% rename from src/douban/data/handler/DoubanBookLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts index 7c7671a..1feda5e 100644 --- a/src/douban/data/handler/DoubanBookLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts @@ -1,10 +1,11 @@ import {CheerioAPI} from 'cheerio'; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject"; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject from "../model/DoubanSubject"; 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 { @@ -76,10 +77,7 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler row.trim()) : []; menu.length > 0 ? menu.pop() : menu; diff --git a/src/douban/data/handler/DoubanGameLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts similarity index 97% rename from src/douban/data/handler/DoubanGameLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts index 5231b04..629bdec 100644 --- a/src/douban/data/handler/DoubanGameLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts @@ -1,10 +1,10 @@ import {CheerioAPI} from 'cheerio'; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject from '../model/DoubanSubject'; import DoubanGameSubject from '../model/DoubanGameSubject'; import StringUtil from "../../../utils/StringUtil"; -import HandleContext from "@App/data/model/HandleContext"; +import HandleContext from "../model/HandleContext"; import {SupportType, TemplateKey} from "../../../constant/Constsant"; export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler { diff --git a/src/douban/data/handler/DoubanMovieLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts similarity index 94% rename from src/douban/data/handler/DoubanMovieLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts index d7ca758..ba0a266 100644 --- a/src/douban/data/handler/DoubanMovieLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts @@ -1,11 +1,11 @@ import {CheerioAPI} from 'cheerio'; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanPlugin from "main"; -import SchemaOrg from "src/utils/SchemaOrg"; +import DoubanPlugin from "../../../main"; +import SchemaOrg from "src/org/wanxp/utils/SchemaOrg"; import DoubanSubject from '../model/DoubanSubject'; import DoubanMovieSubject from '../model/DoubanMovieSubject'; import StringUtil from "../../../utils/StringUtil"; -import HandleContext from "@App/data/model/HandleContext"; +import HandleContext from "../model/HandleContext"; import {PersonNameMode, SupportType, TemplateKey} from "../../../constant/Constsant"; export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler { diff --git a/src/douban/data/handler/DoubanMusicLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanMusicLoadHandler.ts similarity index 97% rename from src/douban/data/handler/DoubanMusicLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanMusicLoadHandler.ts index b33b848..e4e243b 100644 --- a/src/douban/data/handler/DoubanMusicLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanMusicLoadHandler.ts @@ -1,9 +1,9 @@ import {CheerioAPI} from 'cheerio'; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanMusicSubject from '../model/DoubanMusicSubject'; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject from '../model/DoubanSubject'; -import HandleContext from "@App/data/model/HandleContext"; +import HandleContext from "../model/HandleContext"; import {SupportType, TemplateKey} from "../../../constant/Constsant"; export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler { diff --git a/src/douban/data/handler/DoubanNoteLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanNoteLoadHandler.ts similarity index 96% rename from src/douban/data/handler/DoubanNoteLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanNoteLoadHandler.ts index 472afc7..87cb741 100644 --- a/src/douban/data/handler/DoubanNoteLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanNoteLoadHandler.ts @@ -1,10 +1,10 @@ import {CheerioAPI} from 'cheerio'; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanNoteSubject from '../model/DoubanNoteSubject'; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject from '../model/DoubanSubject'; import html2markdown from '@notable/html2markdown'; -import HandleContext from "@App/data/model/HandleContext"; +import HandleContext from "../model/HandleContext"; import {SupportType, TemplateKey} from "../../../constant/Constsant"; export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler { diff --git a/src/douban/data/handler/DoubanOtherLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanOtherLoadHandler.ts similarity index 82% rename from src/douban/data/handler/DoubanOtherLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanOtherLoadHandler.ts index 715f77d..cf047cc 100644 --- a/src/douban/data/handler/DoubanOtherLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanOtherLoadHandler.ts @@ -1,9 +1,9 @@ import {CheerioAPI} from "cheerio"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanSubject from "../model/DoubanSubject"; -import {i18nHelper} from "src/lang/helper"; -import {log} from "src/utils/Logutil"; -import HandleContext from "@App/data/model/HandleContext"; +import {i18nHelper} from "src/org/wanxp/lang/helper"; +import {log} from "src/org/wanxp/utils/Logutil"; +import HandleContext from "../model/HandleContext"; import {SupportType, TemplateKey} from "../../../constant/Constsant"; /** diff --git a/src/douban/data/handler/DoubanSearchChooseItemHandler.ts b/src/org/wanxp/douban/data/handler/DoubanSearchChooseItemHandler.ts similarity index 91% rename from src/douban/data/handler/DoubanSearchChooseItemHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanSearchChooseItemHandler.ts index 1c0d075..12a7db8 100644 --- a/src/douban/data/handler/DoubanSearchChooseItemHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanSearchChooseItemHandler.ts @@ -5,13 +5,13 @@ import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler"; import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler"; import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler"; import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler"; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject from "../model/DoubanSubject"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import {DoubanTeleplayLoadHandler} from "./DoubanTeleplayLoadHandler"; import DoubanGameLoadHandler from "./DoubanGameLoadHandler"; -import HandleContext from "@App/data/model/HandleContext"; -import HandleResult from "@App/data/model/HandleResult"; +import HandleContext from "../model/HandleContext"; +import HandleResult from "../model/HandleResult"; export class DoubanSearchChooseItemHandler { @@ -34,7 +34,7 @@ export class DoubanSearchChooseItemHandler { this._doubanSubjectHandlerDefault]; } - public handle(searchExtract: DoubanSubject, context: HandleContext): void { + public async handle(searchExtract: DoubanSubject, context: HandleContext): Promise { if (!searchExtract) { return; } diff --git a/src/douban/data/handler/DoubanSubjectLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanSubjectLoadHandler.ts similarity index 72% rename from src/douban/data/handler/DoubanSubjectLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanSubjectLoadHandler.ts index 6122989..8f2c0a7 100644 --- a/src/douban/data/handler/DoubanSubjectLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanSubjectLoadHandler.ts @@ -1,6 +1,6 @@ import DoubanSubject from "../model/DoubanSubject"; -import HandleContext from "@App/data/model/HandleContext"; -import HandleResult from "@App/data/model/HandleResult"; +import HandleContext from "../model/HandleContext"; +import HandleResult from "../model/HandleResult"; export default interface DoubanSubjectLoadHandler { diff --git a/src/douban/data/handler/DoubanTeleplayLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts similarity index 94% rename from src/douban/data/handler/DoubanTeleplayLoadHandler.ts rename to src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts index 1adeb58..e6feb4a 100644 --- a/src/douban/data/handler/DoubanTeleplayLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts @@ -1,10 +1,10 @@ import {CheerioAPI} from "cheerio"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; import DoubanSubject from "../model/DoubanSubject"; import DoubanTeleplaySubject from "../model/DoubanTeleplaySubject"; -import SchemaOrg from "src/utils/SchemaOrg"; -import HandleContext from "@App/data/model/HandleContext"; +import SchemaOrg from "src/org/wanxp/utils/SchemaOrg"; +import HandleContext from "../model/HandleContext"; import {SupportType, TemplateKey} from "../../../constant/Constsant"; /** diff --git a/src/douban/data/model/DoubanBookSubject.ts b/src/org/wanxp/douban/data/model/DoubanBookSubject.ts similarity index 100% rename from src/douban/data/model/DoubanBookSubject.ts rename to src/org/wanxp/douban/data/model/DoubanBookSubject.ts diff --git a/src/douban/data/model/DoubanGameSubject.ts b/src/org/wanxp/douban/data/model/DoubanGameSubject.ts similarity index 100% rename from src/douban/data/model/DoubanGameSubject.ts rename to src/org/wanxp/douban/data/model/DoubanGameSubject.ts diff --git a/src/douban/data/model/DoubanMovieSubject.ts b/src/org/wanxp/douban/data/model/DoubanMovieSubject.ts similarity index 100% rename from src/douban/data/model/DoubanMovieSubject.ts rename to src/org/wanxp/douban/data/model/DoubanMovieSubject.ts diff --git a/src/douban/data/model/DoubanMusicSubject.ts b/src/org/wanxp/douban/data/model/DoubanMusicSubject.ts similarity index 100% rename from src/douban/data/model/DoubanMusicSubject.ts rename to src/org/wanxp/douban/data/model/DoubanMusicSubject.ts diff --git a/src/douban/data/model/DoubanNoteSubject.ts b/src/org/wanxp/douban/data/model/DoubanNoteSubject.ts similarity index 100% rename from src/douban/data/model/DoubanNoteSubject.ts rename to src/org/wanxp/douban/data/model/DoubanNoteSubject.ts diff --git a/src/douban/data/model/DoubanSearchResultSubject.ts b/src/org/wanxp/douban/data/model/DoubanSearchResultSubject.ts similarity index 100% rename from src/douban/data/model/DoubanSearchResultSubject.ts rename to src/org/wanxp/douban/data/model/DoubanSearchResultSubject.ts diff --git a/src/douban/data/model/DoubanSubject.ts b/src/org/wanxp/douban/data/model/DoubanSubject.ts similarity index 90% rename from src/douban/data/model/DoubanSubject.ts rename to src/org/wanxp/douban/data/model/DoubanSubject.ts index b8fa62d..5288cb5 100644 --- a/src/douban/data/model/DoubanSubject.ts +++ b/src/org/wanxp/douban/data/model/DoubanSubject.ts @@ -1,4 +1,4 @@ -import {UserStateSubject} from "@App/data/model/UserStateSubject"; +import {UserStateSubject} from "./UserStateSubject"; export default class DoubanSubject { id: string; diff --git a/src/douban/data/model/DoubanTeleplaySubject.ts b/src/org/wanxp/douban/data/model/DoubanTeleplaySubject.ts similarity index 100% rename from src/douban/data/model/DoubanTeleplaySubject.ts rename to src/org/wanxp/douban/data/model/DoubanTeleplaySubject.ts diff --git a/src/org/wanxp/douban/data/model/HandleContext.ts b/src/org/wanxp/douban/data/model/HandleContext.ts new file mode 100644 index 0000000..c1e5f12 --- /dev/null +++ b/src/org/wanxp/douban/data/model/HandleContext.ts @@ -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; +} diff --git a/src/douban/data/model/HandleResult.ts b/src/org/wanxp/douban/data/model/HandleResult.ts similarity index 51% rename from src/douban/data/model/HandleResult.ts rename to src/org/wanxp/douban/data/model/HandleResult.ts index 4de4a92..ed235d0 100644 --- a/src/douban/data/model/HandleResult.ts +++ b/src/org/wanxp/douban/data/model/HandleResult.ts @@ -1,4 +1,7 @@ +import DoubanSubject from "./DoubanSubject"; + export default interface HandleResult { content:string fileName?:string + subject?:DoubanSubject, } diff --git a/src/douban/data/model/PropertyExplainSubject.ts b/src/org/wanxp/douban/data/model/PropertyExplainSubject.ts similarity index 100% rename from src/douban/data/model/PropertyExplainSubject.ts rename to src/org/wanxp/douban/data/model/PropertyExplainSubject.ts diff --git a/src/douban/data/model/SubjectListItem.ts b/src/org/wanxp/douban/data/model/SubjectListItem.ts similarity index 100% rename from src/douban/data/model/SubjectListItem.ts rename to src/org/wanxp/douban/data/model/SubjectListItem.ts diff --git a/src/douban/data/model/UserStateSubject.ts b/src/org/wanxp/douban/data/model/UserStateSubject.ts similarity index 81% rename from src/douban/data/model/UserStateSubject.ts rename to src/org/wanxp/douban/data/model/UserStateSubject.ts index 1b396a2..a1f93e1 100644 --- a/src/douban/data/model/UserStateSubject.ts +++ b/src/org/wanxp/douban/data/model/UserStateSubject.ts @@ -1,4 +1,4 @@ -import { DoubanSubjectState } from "src/constant/DoubanUserState"; +import { DoubanSubjectState } from "src/org/wanxp/constant/DoubanUserState"; export interface UserStateSubject { tags: string[]; diff --git a/src/douban/data/search/DoubanSearchFuzzySuggestModal.ts b/src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts similarity index 85% rename from src/douban/data/search/DoubanSearchFuzzySuggestModal.ts rename to src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts index b433bb4..ce0bdef 100644 --- a/src/douban/data/search/DoubanSearchFuzzySuggestModal.ts +++ b/src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts @@ -1,10 +1,10 @@ import {FuzzySuggestModal} from "obsidian"; -import DoubanPlugin from "main"; +import DoubanPlugin from "../../../main"; 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 HandleContext from "@App/data/model/HandleContext"; +import HandleContext from "../model/HandleContext"; export {DoubanFuzzySuggester} @@ -33,7 +33,7 @@ class DoubanFuzzySuggester extends FuzzySuggestModal } 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); } diff --git a/src/douban/data/search/DoubanSearchModal.ts b/src/org/wanxp/douban/data/search/DoubanSearchModal.ts similarity index 91% rename from src/douban/data/search/DoubanSearchModal.ts rename to src/org/wanxp/douban/data/search/DoubanSearchModal.ts index 39227d8..6bcbc73 100644 --- a/src/douban/data/search/DoubanSearchModal.ts +++ b/src/org/wanxp/douban/data/search/DoubanSearchModal.ts @@ -1,8 +1,8 @@ import {App, Modal, TextComponent} from "obsidian"; -import DoubanPlugin from "main"; -import {i18nHelper} from "src/lang/helper"; -import HandleContext from "@App/data/model/HandleContext"; +import DoubanPlugin from "../../../main"; +import {i18nHelper} from "src/org/wanxp/lang/helper"; +import HandleContext from "../model/HandleContext"; export class DoubanSearchModal extends Modal { searchTerm: string; diff --git a/src/douban/data/search/Search.ts b/src/org/wanxp/douban/data/search/Search.ts similarity index 87% rename from src/douban/data/search/Search.ts rename to src/org/wanxp/douban/data/search/Search.ts index 619d75c..5bed948 100644 --- a/src/douban/data/search/Search.ts +++ b/src/org/wanxp/douban/data/search/Search.ts @@ -1,11 +1,11 @@ import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject'; import SearchParserHandler from './SearchParser'; -import {log} from 'src/utils/Logutil'; +import {log} from 'src/org/wanxp/utils/Logutil'; import {request, RequestUrlParam} from "obsidian"; import {i18nHelper} from "../../../lang/helper"; import {load} from 'cheerio'; -import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; +import {DoubanPluginSetting} from "../../setting/model/DoubanPluginSetting"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; export default class Searcher { diff --git a/src/douban/data/search/SearchParser.ts b/src/org/wanxp/douban/data/search/SearchParser.ts similarity index 100% rename from src/douban/data/search/SearchParser.ts rename to src/org/wanxp/douban/data/search/SearchParser.ts diff --git a/src/org/wanxp/douban/model/GlobalStatusHolder.ts b/src/org/wanxp/douban/model/GlobalStatusHolder.ts new file mode 100644 index 0000000..ec99c06 --- /dev/null +++ b/src/org/wanxp/douban/model/GlobalStatusHolder.ts @@ -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; + } +} diff --git a/src/douban/setting/BasicSettingsHelper.ts b/src/org/wanxp/douban/setting/BasicSettingsHelper.ts similarity index 94% rename from src/douban/setting/BasicSettingsHelper.ts rename to src/org/wanxp/douban/setting/BasicSettingsHelper.ts index 4eee06d..bfa7464 100644 --- a/src/douban/setting/BasicSettingsHelper.ts +++ b/src/org/wanxp/douban/setting/BasicSettingsHelper.ts @@ -1,11 +1,11 @@ import {i18nHelper} from "../../lang/helper"; import {Platform, Setting} from "obsidian"; import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings"; -import SettingsManager from "@App/setting/SettingsManager"; -import DoubanLoginModel from "@App/component/DoubanLoginModel"; -import DoubanLogoutModel from "@App/component/DoubanLogoutModel"; -import User from "@App/user/User"; -import {createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper"; +import SettingsManager from "./SettingsManager"; +import DoubanLoginModel from "../component/DoubanLoginModel"; +import DoubanLogoutModel from "../component/DoubanLogoutModel"; +import User from "../user/User"; +import {createFolderSelectionSetting} from "./TemplateSettingHelper"; export function constructBasicUI(containerEl: HTMLElement, manager: SettingsManager) { containerEl.createEl('h3', { text: i18nHelper.getMessage('1210') }); diff --git a/src/douban/setting/CustomPropertySettingsHelper.ts b/src/org/wanxp/douban/setting/CustomPropertySettingsHelper.ts similarity index 96% rename from src/douban/setting/CustomPropertySettingsHelper.ts rename to src/org/wanxp/douban/setting/CustomPropertySettingsHelper.ts index ff24507..d6612db 100644 --- a/src/douban/setting/CustomPropertySettingsHelper.ts +++ b/src/org/wanxp/douban/setting/CustomPropertySettingsHelper.ts @@ -1,6 +1,6 @@ import {i18nHelper} from "../../lang/helper"; -import SettingsManager from "@App/setting/SettingsManager"; -import {CustomProperty} from "@App/setting/model/CustomProperty"; +import SettingsManager from "./SettingsManager"; +import {CustomProperty} from "./model/CustomProperty"; import {ButtonComponent, DropdownComponent, ExtraButtonComponent, Setting, TextComponent} from "obsidian"; import {SupportType} from "../../constant/Constsant"; diff --git a/src/douban/setting/DoubanSettingTab.ts b/src/org/wanxp/douban/setting/DoubanSettingTab.ts similarity index 79% rename from src/douban/setting/DoubanSettingTab.ts rename to src/org/wanxp/douban/setting/DoubanSettingTab.ts index f8ad2e4..2608ca5 100644 --- a/src/douban/setting/DoubanSettingTab.ts +++ b/src/org/wanxp/douban/setting/DoubanSettingTab.ts @@ -1,16 +1,16 @@ import {App, PluginSettingTab, SearchComponent, Setting} from "obsidian"; -import DoubanPlugin from "main"; -import {i18nHelper} from "src/lang/helper"; +import DoubanPlugin from "../../main"; +import {i18nHelper} from "src/org/wanxp/lang/helper"; import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant"; -import SettingsManager from "@App/setting/SettingsManager"; -import {FolderSuggest} from "@App/setting/model/FolderSuggest"; -import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; +import SettingsManager from "./SettingsManager"; +import {FolderSuggest} from "./model/FolderSuggest"; +import { DEFAULT_SETTINGS } from "src/org/wanxp/constant/DefaultSettings"; import { constructOutUI } from "./OutputSettingsHelper"; import { constructTemplateUI } from "./TemplateSettingHelper"; import { constructBasicUI } from "./BasicSettingsHelper"; import { constructTemplateVariablesUI } from "./TemplateVariableSettingsHelper"; -import {constructCustomPropertySettingsUI, constructCustomPropertyUI} from "@App/setting/CustomPropertySettingsHelper"; +import {constructCustomPropertySettingsUI, constructCustomPropertyUI} from "./CustomPropertySettingsHelper"; /** * 部分逻辑参考以下项目 diff --git a/src/douban/setting/OutputSettingsHelper.ts b/src/org/wanxp/douban/setting/OutputSettingsHelper.ts similarity index 96% rename from src/douban/setting/OutputSettingsHelper.ts rename to src/org/wanxp/douban/setting/OutputSettingsHelper.ts index a72d916..4e01ff9 100644 --- a/src/douban/setting/OutputSettingsHelper.ts +++ b/src/org/wanxp/douban/setting/OutputSettingsHelper.ts @@ -1,9 +1,9 @@ import {i18nHelper} from "../../lang/helper"; import {Setting} from "obsidian"; -import {createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper"; +import {createFolderSelectionSetting} from "./TemplateSettingHelper"; import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings"; import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant"; -import SettingsManager from "@App/setting/SettingsManager"; +import SettingsManager from "./SettingsManager"; export function constructOutUI(containerEl: HTMLElement, manager: SettingsManager) { containerEl.createEl('h3', { text: i18nHelper.getMessage('1220') }); diff --git a/src/douban/setting/SettingsManager.ts b/src/org/wanxp/douban/setting/SettingsManager.ts similarity index 86% rename from src/douban/setting/SettingsManager.ts rename to src/org/wanxp/douban/setting/SettingsManager.ts index 7f44173..bed0c1b 100644 --- a/src/douban/setting/SettingsManager.ts +++ b/src/org/wanxp/douban/setting/SettingsManager.ts @@ -1,6 +1,6 @@ import {App, Setting} from "obsidian"; -import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; -import DoubanPlugin from "../../../main"; +import { DEFAULT_SETTINGS } from "src/org/wanxp/constant/DefaultSettings"; +import DoubanPlugin from "../../main"; import { DoubanPluginSetting } from "./model/DoubanPluginSetting"; export default class SettingsManager { diff --git a/src/douban/setting/TemplateSettingHelper.ts b/src/org/wanxp/douban/setting/TemplateSettingHelper.ts similarity index 93% rename from src/douban/setting/TemplateSettingHelper.ts rename to src/org/wanxp/douban/setting/TemplateSettingHelper.ts index 1c47e7e..c5cac78 100644 --- a/src/douban/setting/TemplateSettingHelper.ts +++ b/src/org/wanxp/douban/setting/TemplateSettingHelper.ts @@ -1,11 +1,11 @@ import {i18nHelper} from "../../lang/helper"; -import {CreateTemplateSelectParams} from "@App/setting/model/CreateTemplateSelectParams"; +import {CreateTemplateSelectParams} from "./model/CreateTemplateSelectParams"; import { FileSuggest } from "./model/FileSuggest"; 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 {FolderSuggest} from "@App/setting/model/FolderSuggest"; -import SettingsManager from "@App/setting/SettingsManager"; +import {FolderSuggest} from "./model/FolderSuggest"; +import SettingsManager from "./SettingsManager"; export function constructTemplateUI(containerEl: HTMLElement, manager: SettingsManager) { diff --git a/src/douban/setting/TemplateVariableSettingsHelper.ts b/src/org/wanxp/douban/setting/TemplateVariableSettingsHelper.ts similarity index 99% rename from src/douban/setting/TemplateVariableSettingsHelper.ts rename to src/org/wanxp/douban/setting/TemplateVariableSettingsHelper.ts index ac7e93f..0a56814 100644 --- a/src/douban/setting/TemplateVariableSettingsHelper.ts +++ b/src/org/wanxp/douban/setting/TemplateVariableSettingsHelper.ts @@ -1,4 +1,4 @@ -import SettingsManager from "@App/setting/SettingsManager"; +import SettingsManager from "./SettingsManager"; import {i18nHelper} from "../../lang/helper"; import {Setting} from "obsidian"; diff --git a/src/douban/setting/model/CreateTemplateSelectParams.ts b/src/org/wanxp/douban/setting/model/CreateTemplateSelectParams.ts similarity index 79% rename from src/douban/setting/model/CreateTemplateSelectParams.ts rename to src/org/wanxp/douban/setting/model/CreateTemplateSelectParams.ts index 574473c..31290e3 100644 --- a/src/douban/setting/model/CreateTemplateSelectParams.ts +++ b/src/org/wanxp/douban/setting/model/CreateTemplateSelectParams.ts @@ -1,4 +1,4 @@ -import SettingsManager from "@App/setting/SettingsManager"; +import SettingsManager from "../SettingsManager"; import { DoubanPluginSetting } from "./DoubanPluginSetting"; export interface CreateTemplateSelectParams { diff --git a/src/douban/setting/model/CustomProperty.ts b/src/org/wanxp/douban/setting/model/CustomProperty.ts similarity index 100% rename from src/douban/setting/model/CustomProperty.ts rename to src/org/wanxp/douban/setting/model/CustomProperty.ts diff --git a/src/douban/setting/model/DoubanPluginSetting.ts b/src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts similarity index 88% rename from src/douban/setting/model/DoubanPluginSetting.ts rename to src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts index 150a073..02a71d5 100644 --- a/src/douban/setting/model/DoubanPluginSetting.ts +++ b/src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts @@ -1,4 +1,4 @@ -import {CustomProperty} from "@App/setting/model/CustomProperty"; +import {CustomProperty} from "./CustomProperty"; export interface DoubanPluginSetting { movieTemplateFile: string, diff --git a/src/douban/setting/model/FileSuggest.ts b/src/org/wanxp/douban/setting/model/FileSuggest.ts similarity index 92% rename from src/douban/setting/model/FileSuggest.ts rename to src/org/wanxp/douban/setting/model/FileSuggest.ts index aa43a09..3accbfa 100644 --- a/src/douban/setting/model/FileSuggest.ts +++ b/src/org/wanxp/douban/setting/model/FileSuggest.ts @@ -1,5 +1,5 @@ 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 export class FileSuggest extends TextInputSuggest { diff --git a/src/douban/setting/model/FolderSuggest.ts b/src/org/wanxp/douban/setting/model/FolderSuggest.ts similarity index 92% rename from src/douban/setting/model/FolderSuggest.ts rename to src/org/wanxp/douban/setting/model/FolderSuggest.ts index e8d9164..767f12b 100644 --- a/src/douban/setting/model/FolderSuggest.ts +++ b/src/org/wanxp/douban/setting/model/FolderSuggest.ts @@ -1,5 +1,5 @@ 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 export class FolderSuggest extends TextInputSuggest { diff --git a/src/douban/setting/model/Suggest.ts b/src/org/wanxp/douban/setting/model/Suggest.ts similarity index 100% rename from src/douban/setting/model/Suggest.ts rename to src/org/wanxp/douban/setting/model/Suggest.ts diff --git a/src/douban/setting/model/TextInputSuggest.ts b/src/org/wanxp/douban/setting/model/TextInputSuggest.ts similarity index 100% rename from src/douban/setting/model/TextInputSuggest.ts rename to src/org/wanxp/douban/setting/model/TextInputSuggest.ts diff --git a/src/org/wanxp/douban/sync/handler/DoubanAbstractSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanAbstractSyncHandler.ts new file mode 100644 index 0000000..7b8f186 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/DoubanAbstractSyncHandler.ts @@ -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 implements DoubanSyncHandler{ + + private plugin: DoubanPlugin; + private doubanSubjectLoadHandler:DoubanSubjectLoadHandler; + private doubanListHandlers:DoubanListHandler[]; + + constructor(plugin: DoubanPlugin, + doubanSubjectLoadHandler:DoubanSubjectLoadHandler, + 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{ + 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 { + 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 { + if (!context.plugin.statusHolder.syncing()) { + return []; + } + return items; + } + + private async handleItems(items:SubjectListItem[], context:HandleContext):Promise { + 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); + } + } + +} + + diff --git a/src/org/wanxp/douban/sync/handler/DoubanBookSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanBookSyncHandler.ts new file mode 100644 index 0000000..d868cda --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/DoubanBookSyncHandler.ts @@ -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 { + + constructor(plugin:DoubanPlugin) { + super(plugin, new DoubanBookLoadHandler(plugin),[ + new DoubanBookCollectListHandler(), + new DoubanBookWishListHandler(), + new DoubanBookDoListHandler()]); + } + + getSyncType(): SyncType { + return SyncType.book; + } + + +} diff --git a/src/douban/sync/handler/DoubanBroadcastSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanBroadcastSyncHandler.ts similarity index 71% rename from src/douban/sync/handler/DoubanBroadcastSyncHandler.ts rename to src/org/wanxp/douban/sync/handler/DoubanBroadcastSyncHandler.ts index f9d9df1..097d59d 100644 --- a/src/douban/sync/handler/DoubanBroadcastSyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/DoubanBroadcastSyncHandler.ts @@ -1,13 +1,14 @@ import {CheerioAPI} from "cheerio"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; -import DoubanPlugin from "../../../../main"; +import DoubanPlugin from "../../../main"; import {SyncType} from "../../../constant/Constsant"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; -import HandleContext from "@App/data/model/HandleContext"; +import {SyncConfig} from "../model/SyncConfig"; +import HandleContext from "../../data/model/HandleContext"; +import DoubanSubject from "../../data/model/DoubanSubject"; //TODO will support in future version -export class DoubanBroadcastSyncHandler extends DoubanAbstractSyncHandler { +export class DoubanBroadcastSyncHandler extends DoubanAbstractSyncHandler { getSyncType(): SyncType { return SyncType.broadcast; diff --git a/src/org/wanxp/douban/sync/handler/DoubanMovieSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanMovieSyncHandler.ts new file mode 100644 index 0000000..fb08855 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/DoubanMovieSyncHandler.ts @@ -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{ + + constructor(plugin:DoubanPlugin) { + super(plugin, new DoubanMovieLoadHandler(plugin),[ + new DoubanMovieCollectListHandler(), + new DoubanMovieWishListHandler(), + new DoubanMovieDoListHandler()]); + } + + + + getSyncType(): SyncType { + return SyncType.movie; + } + + + +} diff --git a/src/org/wanxp/douban/sync/handler/DoubanMusicSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanMusicSyncHandler.ts new file mode 100644 index 0000000..331006a --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/DoubanMusicSyncHandler.ts @@ -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 { + + getSyncType(): SyncType { + return SyncType.music; + } + + constructor(plugin: DoubanPlugin) { + super(plugin, new DoubanMusicLoadHandler(plugin), [ + new DoubanMusicCollectListHandler(), + new DoubanMusicWishListHandler(), + new DoubanMusicDoListHandler()]); + } + + +} diff --git a/src/douban/sync/handler/DoubanNoteSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanNoteSyncHandler.ts similarity index 70% rename from src/douban/sync/handler/DoubanNoteSyncHandler.ts rename to src/org/wanxp/douban/sync/handler/DoubanNoteSyncHandler.ts index 758bc03..1c21fe3 100644 --- a/src/douban/sync/handler/DoubanNoteSyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/DoubanNoteSyncHandler.ts @@ -1,13 +1,14 @@ import {CheerioAPI} from "cheerio"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; -import DoubanPlugin from "../../../../main"; +import DoubanPlugin from "../../../main"; import {SyncType} from "../../../constant/Constsant"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; -import HandleContext from "@App/data/model/HandleContext"; +import {SyncConfig} from "../model/SyncConfig"; +import HandleContext from "../../data/model/HandleContext"; +import DoubanNoteSubject from "../../data/model/DoubanNoteSubject"; //TODO will support in future version -export class DoubanNoteSyncHandler extends DoubanAbstractSyncHandler { +export class DoubanNoteSyncHandler extends DoubanAbstractSyncHandler { getSyncType(): SyncType { return SyncType.note; diff --git a/src/douban/sync/handler/DoubanOtherSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanOtherSyncHandler.ts similarity index 53% rename from src/douban/sync/handler/DoubanOtherSyncHandler.ts rename to src/org/wanxp/douban/sync/handler/DoubanOtherSyncHandler.ts index 9ad4550..b29d702 100644 --- a/src/douban/sync/handler/DoubanOtherSyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/DoubanOtherSyncHandler.ts @@ -1,15 +1,20 @@ -import {CheerioAPI} from "cheerio"; import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; -import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; -import DoubanPlugin from "../../../../main"; +import DoubanPlugin from "../../../main"; import {SyncType} from "../../../constant/Constsant"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; -import HandleContext from "@App/data/model/HandleContext"; +import {SyncConfig} from "../model/SyncConfig"; +import HandleContext from "../../data/model/HandleContext"; +import DoubanSubject from "../../data/model/DoubanSubject"; +import DoubanOtherLoadHandler from "../../data/handler/DoubanOtherLoadHandler"; //TODO will support in future version -export class DoubanOtherSyncHandler extends DoubanAbstractSyncHandler { +export class DoubanOtherSyncHandler extends DoubanAbstractSyncHandler { - getSyncType(): SyncType { + constructor(plugin:DoubanPlugin) { + super(plugin, new DoubanOtherLoadHandler(plugin),[]); + } + + + getSyncType(): SyncType { throw new Error("暂不支持同步这类型的数据"); } diff --git a/src/douban/sync/handler/DoubanPageBroadcatLoadHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanPageBroadcatLoadHandler.ts similarity index 75% rename from src/douban/sync/handler/DoubanPageBroadcatLoadHandler.ts rename to src/org/wanxp/douban/sync/handler/DoubanPageBroadcatLoadHandler.ts index cfc135c..7d61503 100644 --- a/src/douban/sync/handler/DoubanPageBroadcatLoadHandler.ts +++ b/src/org/wanxp/douban/sync/handler/DoubanPageBroadcatLoadHandler.ts @@ -1,10 +1,10 @@ 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 DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject'; -import DoubanPlugin from "main"; -import DoubanSubject from 'src/douban/data/model/DoubanSubject'; -import HandleContext from "@App/data/model/HandleContext"; +import DoubanPlugin from "../../../main"; +import DoubanSubject from 'src/org/wanxp/douban/data/model/DoubanSubject'; +import HandleContext from "../../data/model/HandleContext"; import {SupportType, TemplateKey} from "../../../constant/Constsant"; //TODO will support in future version diff --git a/src/douban/sync/handler/DoubanSyncHandler.ts b/src/org/wanxp/douban/sync/handler/DoubanSyncHandler.ts similarity index 67% rename from src/douban/sync/handler/DoubanSyncHandler.ts rename to src/org/wanxp/douban/sync/handler/DoubanSyncHandler.ts index 655b396..a89780e 100644 --- a/src/douban/sync/handler/DoubanSyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/DoubanSyncHandler.ts @@ -1,7 +1,7 @@ import {CheerioAPI} from "cheerio"; import DoubanSyncSubject from "../model/DoubanSyncSubject"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; -import HandleContext from "@App/data/model/HandleContext"; +import {SyncConfig} from "../model/SyncConfig"; +import HandleContext from "../../data/model/HandleContext"; export interface DoubanSyncHandler { diff --git a/src/douban/sync/handler/SyncHandler.ts b/src/org/wanxp/douban/sync/handler/SyncHandler.ts similarity index 55% rename from src/douban/sync/handler/SyncHandler.ts rename to src/org/wanxp/douban/sync/handler/SyncHandler.ts index 2dab80c..834ec83 100644 --- a/src/douban/sync/handler/SyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/SyncHandler.ts @@ -1,24 +1,24 @@ -import HandleContext from "@App/data/model/HandleContext"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; -import DoubanPlugin from "main"; +import HandleContext from "../../data/model/HandleContext"; +import {SyncConfig} from "../model/SyncConfig"; +import DoubanPlugin from "../../../main"; import {App} from "obsidian"; -import {DoubanSyncHandler} from "@App/sync/handler/DoubanSyncHandler"; -import DoubanOtherLoadHandler from "@App/data/handler/DoubanOtherLoadHandler"; -import DoubanMovieLoadHandler from "@App/data/handler/DoubanMovieLoadHandler"; -import DoubanBookLoadHandler from "@App/data/handler/DoubanBookLoadHandler"; -import {DoubanTeleplayLoadHandler} from "@App/data/handler/DoubanTeleplayLoadHandler"; -import DoubanMusicLoadHandler from "@App/data/handler/DoubanMusicLoadHandler"; -import DoubanNoteLoadHandler from "@App/data/handler/DoubanNoteLoadHandler"; -import DoubanGameLoadHandler from "@App/data/handler/DoubanGameLoadHandler"; +import {DoubanSyncHandler} from "./DoubanSyncHandler"; +import DoubanOtherLoadHandler from "../../data/handler/DoubanOtherLoadHandler"; +import DoubanMovieLoadHandler from "../../data/handler/DoubanMovieLoadHandler"; +import DoubanBookLoadHandler from "../../data/handler/DoubanBookLoadHandler"; +import {DoubanTeleplayLoadHandler} from "../../data/handler/DoubanTeleplayLoadHandler"; +import DoubanMusicLoadHandler from "../../data/handler/DoubanMusicLoadHandler"; +import DoubanNoteLoadHandler from "../../data/handler/DoubanNoteLoadHandler"; +import DoubanGameLoadHandler from "../../data/handler/DoubanGameLoadHandler"; import { DoubanBroadcastSyncHandler } from "./DoubanBroadcastSyncHandler"; -import {DoubanOtherSyncHandler} from "@App/sync/handler/DoubanOtherSyncHandler"; +import {DoubanOtherSyncHandler} from "./DoubanOtherSyncHandler"; import { DoubanMovieSyncHandler } from "./DoubanMovieSyncHandler"; import { DoubanNoteSyncHandler } from "./DoubanNoteSyncHandler"; import { DoubanMusicSyncHandler } from "./DoubanMusicSyncHandler"; import { DoubanBookSyncHandler } from "./DoubanBookSyncHandler"; -import DoubanSubjectLoadHandler from "@App/data/handler/DoubanSubjectLoadHandler"; -import DoubanSubject from "@App/data/model/DoubanSubject"; -import {DoubanAbstractSyncHandler} from "@App/sync/handler/DoubanAbstractSyncHandler"; +import DoubanSubjectLoadHandler from "../../data/handler/DoubanSubjectLoadHandler"; +import DoubanSubject from "../../data/model/DoubanSubject"; +import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler"; export default class SyncHandler { private app: App; @@ -38,8 +38,8 @@ export default class SyncHandler { [ new DoubanMovieSyncHandler(plugin), new DoubanBookSyncHandler(plugin), - new DoubanBroadcastSyncHandler(plugin), - new DoubanNoteSyncHandler(plugin), + // new DoubanBroadcastSyncHandler(plugin), + // new DoubanNoteSyncHandler(plugin), new DoubanMusicSyncHandler(plugin), this.defaultSyncHandler ]; diff --git a/src/douban/sync/handler/list/DoubanAbstractListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts similarity index 69% rename from src/douban/sync/handler/list/DoubanAbstractListHandler.ts rename to src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts index 76005d1..b9a19ce 100644 --- a/src/douban/sync/handler/list/DoubanAbstractListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanAbstractListHandler.ts @@ -1,15 +1,15 @@ -import {moment, request, RequestUrlParam, TFile} from "obsidian"; -import {i18nHelper} from 'src/lang/helper'; -import {log} from "src/utils/Logutil"; +import { request, RequestUrlParam} from "obsidian"; +import {i18nHelper} from 'src/org/wanxp/lang/helper'; +import {log} from "src/org/wanxp/utils/Logutil"; import {CheerioAPI, load} from "cheerio"; -import HandleContext from "@App/data/model/HandleContext"; +import HandleContext from "../../../data/model/HandleContext"; import {doubanSubjectSyncListUrl} from "../../../../constant/Douban"; import {BasicConst, PAGE_SIZE} from "../../../../constant/Constsant"; -import DoubanSearchResultSubject from "@App/data/model/DoubanSearchResultSubject"; -import {SubjectListItem} from "@App/data/model/SubjectListItem"; -import {DoubanListHandler} from "@App/sync/handler/list/DoubanListHandler"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; -import TimeUtil from "../../../../utils/TimeUtil"; +import {SubjectListItem} from "../../../data/model/SubjectListItem"; +import {DoubanListHandler} from "./DoubanListHandler"; +import {SyncConfig} from "../../model/SyncConfig"; +import { sleepRange} from "../../../../utils/TimeUtil"; +import {ALL} from "../../../../constant/DoubanUserState"; export default abstract class DoubanAbstractListHandler implements DoubanListHandler{ @@ -18,15 +18,18 @@ export default abstract class DoubanAbstractListHandler implements DoubanListHan let pages:SubjectListItem[] = []; let start = 0; do { + await sleepRange(BasicConst.CALL_DOUBAN_DELAY, + BasicConst.CALL_DOUBAN_DELAY + BasicConst.CALL_DOUBAN_DELAY_RANGE); const url:string = this.getUrl(context, start); - pages = await TimeUtil.delayRange(() => this.getPageList(url, context), - BasicConst.CLEAN_STATUS_BAR_DELAY - BasicConst.CLEAN_STATUS_BAR_DELAY_RANGE, - BasicConst.CLEAN_STATUS_BAR_DELAY - BasicConst.CLEAN_STATUS_BAR_DELAY_RANGE); + if (!context.plugin.statusHolder.syncing()) { + return []; + } + pages = await this.getPageList(url, context); if (pages) { all = all.concat(pages); } start = start + PAGE_SIZE; - } while (pages) + } while (pages && pages.length > 0) return all; } @@ -80,8 +83,7 @@ export default abstract class DoubanAbstractListHandler implements DoubanListHan } support(config: SyncConfig): boolean { - return this.getDoType() == config.scope; + return this.getDoType() == config.scope || ALL == config.scope; } } - diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanBookCollectListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanBookCollectListHandler.ts new file mode 100644 index 0000000..d768026 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanBookCollectListHandler.ts @@ -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; + } + +} diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanBookDoListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanBookDoListHandler.ts new file mode 100644 index 0000000..25fba8c --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanBookDoListHandler.ts @@ -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; + } + +} diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanBookListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanBookListHandler.ts new file mode 100644 index 0000000..2c3bb8a --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanBookListHandler.ts @@ -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; + +} + + diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanBookWishListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanBookWishListHandler.ts new file mode 100644 index 0000000..70b4f52 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanBookWishListHandler.ts @@ -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; + } + +} diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanListHandler.ts new file mode 100644 index 0000000..252cc62 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanListHandler.ts @@ -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; + + support(config:SyncConfig):boolean; +} diff --git a/src/douban/sync/handler/list/DoubanMovieCollectListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMovieCollectListHandler.ts similarity index 74% rename from src/douban/sync/handler/list/DoubanMovieCollectListHandler.ts rename to src/org/wanxp/douban/sync/handler/list/DoubanMovieCollectListHandler.ts index 8970acc..fcc3f3e 100644 --- a/src/douban/sync/handler/list/DoubanMovieCollectListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMovieCollectListHandler.ts @@ -1,4 +1,4 @@ -import { DoubanSubjectState} from "src/constant/DoubanUserState"; +import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState"; import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; diff --git a/src/douban/sync/handler/list/DoubanMovieDoListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMovieDoListHandler.ts similarity index 73% rename from src/douban/sync/handler/list/DoubanMovieDoListHandler.ts rename to src/org/wanxp/douban/sync/handler/list/DoubanMovieDoListHandler.ts index b8fbc0a..6942358 100644 --- a/src/douban/sync/handler/list/DoubanMovieDoListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMovieDoListHandler.ts @@ -1,4 +1,4 @@ -import { DoubanSubjectState} from "src/constant/DoubanUserState"; +import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState"; import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; diff --git a/src/douban/sync/handler/list/DoubanMovieListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMovieListHandler.ts similarity index 71% rename from src/douban/sync/handler/list/DoubanMovieListHandler.ts rename to src/org/wanxp/douban/sync/handler/list/DoubanMovieListHandler.ts index b621eaa..66cd04c 100644 --- a/src/douban/sync/handler/list/DoubanMovieListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMovieListHandler.ts @@ -1,4 +1,4 @@ -import DoubanAbstractListHandler from "@App/sync/handler/list/DoubanAbstractListHandler"; +import DoubanAbstractListHandler from "./DoubanAbstractListHandler"; import { SyncType} from "../../../../constant/Constsant"; export abstract class DoubanMovieListHandler extends DoubanAbstractListHandler { diff --git a/src/douban/sync/handler/list/DoubanMovieWishListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMovieWishListHandler.ts similarity index 73% rename from src/douban/sync/handler/list/DoubanMovieWishListHandler.ts rename to src/org/wanxp/douban/sync/handler/list/DoubanMovieWishListHandler.ts index d5f9e34..a846b57 100644 --- a/src/douban/sync/handler/list/DoubanMovieWishListHandler.ts +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMovieWishListHandler.ts @@ -1,4 +1,4 @@ -import { DoubanSubjectState} from "src/constant/DoubanUserState"; +import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState"; import { DoubanMovieListHandler } from "./DoubanMovieListHandler"; diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanMusicCollectListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMusicCollectListHandler.ts new file mode 100644 index 0000000..1d3217e --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMusicCollectListHandler.ts @@ -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; + } + +} diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanMusicDoListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMusicDoListHandler.ts new file mode 100644 index 0000000..d7bb367 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMusicDoListHandler.ts @@ -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; + } + +} diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanMusicListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMusicListHandler.ts new file mode 100644 index 0000000..710f6d7 --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMusicListHandler.ts @@ -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; + +} + + diff --git a/src/org/wanxp/douban/sync/handler/list/DoubanMusicWishListHandler.ts b/src/org/wanxp/douban/sync/handler/list/DoubanMusicWishListHandler.ts new file mode 100644 index 0000000..aed671e --- /dev/null +++ b/src/org/wanxp/douban/sync/handler/list/DoubanMusicWishListHandler.ts @@ -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; + } + +} diff --git a/src/douban/sync/model/DoubanBroadcastMoveSubject.ts b/src/org/wanxp/douban/sync/model/DoubanBroadcastMoveSubject.ts similarity index 100% rename from src/douban/sync/model/DoubanBroadcastMoveSubject.ts rename to src/org/wanxp/douban/sync/model/DoubanBroadcastMoveSubject.ts diff --git a/src/douban/sync/model/DoubanBroadcastSubject1.ts b/src/org/wanxp/douban/sync/model/DoubanBroadcastSubject1.ts similarity index 100% rename from src/douban/sync/model/DoubanBroadcastSubject1.ts rename to src/org/wanxp/douban/sync/model/DoubanBroadcastSubject1.ts diff --git a/src/douban/sync/model/DoubanPageBroadcastSubject.ts b/src/org/wanxp/douban/sync/model/DoubanPageBroadcastSubject.ts similarity index 67% rename from src/douban/sync/model/DoubanPageBroadcastSubject.ts rename to src/org/wanxp/douban/sync/model/DoubanPageBroadcastSubject.ts index 3cd45d1..94eafcd 100644 --- a/src/douban/sync/model/DoubanPageBroadcastSubject.ts +++ b/src/org/wanxp/douban/sync/model/DoubanPageBroadcastSubject.ts @@ -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 { pageNumber: number; diff --git a/src/douban/sync/model/DoubanSyncSubject.ts b/src/org/wanxp/douban/sync/model/DoubanSyncSubject.ts similarity index 100% rename from src/douban/sync/model/DoubanSyncSubject.ts rename to src/org/wanxp/douban/sync/model/DoubanSyncSubject.ts diff --git a/src/org/wanxp/douban/sync/model/GlobalSyncStatusHolder.ts b/src/org/wanxp/douban/sync/model/GlobalSyncStatusHolder.ts new file mode 100644 index 0000000..257181b --- /dev/null +++ b/src/org/wanxp/douban/sync/model/GlobalSyncStatusHolder.ts @@ -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; + } +} diff --git a/src/douban/sync/model/SyncConfig.ts b/src/org/wanxp/douban/sync/model/SyncConfig.ts similarity index 79% rename from src/douban/sync/model/SyncConfig.ts rename to src/org/wanxp/douban/sync/model/SyncConfig.ts index 86b9e84..105d0ca 100644 --- a/src/douban/sync/model/SyncConfig.ts +++ b/src/org/wanxp/douban/sync/model/SyncConfig.ts @@ -2,4 +2,5 @@ export interface SyncConfig { syncType: string, scope: string, force:boolean, + outputFolder:string; } diff --git a/src/org/wanxp/douban/sync/model/SyncItemResult.ts b/src/org/wanxp/douban/sync/model/SyncItemResult.ts new file mode 100644 index 0000000..e26580f --- /dev/null +++ b/src/org/wanxp/douban/sync/model/SyncItemResult.ts @@ -0,0 +1,7 @@ +import {SyncItemStatus} from "../../../constant/Constsant"; + +export interface SyncItemResult { + id:string, + title:string, + status:SyncItemStatus, +} diff --git a/src/org/wanxp/douban/sync/model/SyncStatusHolder.ts b/src/org/wanxp/douban/sync/model/SyncStatusHolder.ts new file mode 100644 index 0000000..ec26ddf --- /dev/null +++ b/src/org/wanxp/douban/sync/model/SyncStatusHolder.ts @@ -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 = new Map(); + private statusHandleMap: Map = 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); + } + + + +} diff --git a/src/douban/user/User.ts b/src/org/wanxp/douban/user/User.ts similarity index 100% rename from src/douban/user/User.ts rename to src/org/wanxp/douban/user/User.ts diff --git a/src/douban/user/UserComponent.ts b/src/org/wanxp/douban/user/UserComponent.ts similarity index 85% rename from src/douban/user/UserComponent.ts rename to src/org/wanxp/douban/user/UserComponent.ts index d66829d..14e6695 100644 --- a/src/douban/user/UserComponent.ts +++ b/src/org/wanxp/douban/user/UserComponent.ts @@ -1,14 +1,14 @@ -import SettingsManager from "@App/setting/SettingsManager"; -import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; -import DoubanSearchResultSubject from "@App/data/model/DoubanSearchResultSubject"; +import SettingsManager from "../setting/SettingsManager"; +import {DoubanPluginSetting} from "../setting/model/DoubanPluginSetting"; +import DoubanSearchResultSubject from "../data/model/DoubanSearchResultSubject"; import {request, RequestUrlParam} from "obsidian"; import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings"; import {CheerioAPI, load} from "cheerio"; -import SearchParserHandler from "@App/data/search/SearchParser"; +import SearchParserHandler from "../data/search/SearchParser"; import {log} from "../../utils/Logutil"; import {i18nHelper} from "../../lang/helper"; -import User from "@App/user/User"; -import DoubanGameSubject from "@App/data/model/DoubanGameSubject"; +import User from "./User"; +import DoubanGameSubject from "../data/model/DoubanGameSubject"; export default class UserComponent { private settingsManager: SettingsManager; diff --git a/src/file/FileHandler.ts b/src/org/wanxp/file/FileHandler.ts similarity index 72% rename from src/file/FileHandler.ts rename to src/org/wanxp/file/FileHandler.ts index 38a8ba6..0523472 100644 --- a/src/file/FileHandler.ts +++ b/src/org/wanxp/file/FileHandler.ts @@ -1,9 +1,10 @@ -import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting"; -import {App, normalizePath, Platform} from "obsidian"; -import { log } from "src/utils/Logutil"; -import DoubanPlugin from "../../main"; +import { DoubanPluginSetting } from "../douban/setting/model/DoubanPluginSetting"; +import {App, normalizePath, Platform, TFile} from "obsidian"; +import { log } from "src/org/wanxp/utils/Logutil"; +import DoubanPlugin from "../main"; import {FileUtil} from "../utils/FileUtil"; import {i18nHelper} from "../lang/helper"; +import {exists} from "fs"; /** * 文件处理 @@ -119,25 +120,55 @@ export default class FileHandler { const {dir, name} = FileUtil.parse(prependDirInput); const filePath = FileUtil.join(dir, `${name}.md`); - try { - const fileExists = await adapter.exists(filePath); - if (fileExists) { - // If the file already exists, respond with error - throw new Error(i18nHelper.getMessage('110201').replace('{0}', filePath??'')); - } + const fileExists = await adapter.exists(filePath); + if (fileExists) { + // If the file already exists, respond with error + throw new Error(i18nHelper.getMessage('110201').replace('{0}', filePath??'')); + } + if (dir !== '') { + // If `input` includes a directory part, create it + await this.createDirectory(dir); + } + const File = await vault.create(filePath, data); + // Create the file and open it in the active leaf + if (showAfterCreate) { + const leaf = this._app.workspace.splitLeafOrActive(); + await leaf.openFile(File); + } + } + + /** + * 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 { + 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); } - const File = await vault.create(filePath, data); - // Create the file and open it in the active leaf - if (showAfterCreate) { - const leaf = this._app.workspace.splitLeafOrActive(); - await leaf.openFile(File); - } - } catch (error) { - log.error(error.toString(), error); + 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 { diff --git a/src/lang/helper.ts b/src/org/wanxp/lang/helper.ts similarity index 62% rename from src/lang/helper.ts rename to src/org/wanxp/lang/helper.ts index ee9f129..11b310d 100644 --- a/src/lang/helper.ts +++ b/src/org/wanxp/lang/helper.ts @@ -11,12 +11,18 @@ const locale = localeMap[lang || 'en']; export default class I18nHelper { - public getMessage(str: keyof typeof en): string { + public getMessage(str: keyof typeof en, ...params: any[]): string { if (!locale) { 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; } } diff --git a/src/lang/locale/en.ts b/src/org/wanxp/lang/locale/en.ts similarity index 94% rename from src/lang/locale/en.ts rename to src/org/wanxp/lang/locale/en.ts index 2ce38fd..b8c1a4e 100644 --- a/src/lang/locale/en.ts +++ b/src/org/wanxp/lang/locale/en.ts @@ -6,12 +6,21 @@ export default { '110003': `Enter Search Term:`, '110004': `Search`, '110005': `Cancel`, - '110006': `sync douban broadcast ot Obsidian`, + '110006': `sync douban personal book-movie-music to Obsidian`, '110101': 'search douban and create file', '110201': `{0} already exists`, '110202': `{0} template can not read`, '110103': 'sync personal data from douban', '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`, '100124': `Nickname`, '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`, '100128': `Logout`, @@ -162,12 +174,15 @@ export default { '130101': `Fetch Data Error, {0}`, '140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`, - '140201': `[Obsidian Douban]: searching '{0}'...`, - '140202': `[Obsidian Douban]: result {0} rows`, - '140203': `[Obsidian Douban]: request '{0}'`, - '140204': `[Obsidian Douban]: replace '{0}'`, - '140205': `[Obsidian Douban]: complete '{0}'`, - '140206': `[Obsidian Douban]: occur error '{0}'`, + '140201': `[OB-Douban]: searching '{0}'...`, + '140202': `[OB-Douban]: result {0} rows`, + '140203': `[OB-Douban]: request '{0}'`, + '140204': `[OB-Douban]: replace '{0}'`, + '140205': `[OB-Douban]: complete '{0}'`, + '140206': `[OB-Douban]: occur error '{0}'`, + '140207': `[OB-Douban]: [{0}/{1}] {2}`, + '140208': `[OB-Douban]: [{0}/{1}] {2}`, + '140301': `Douban: Syncing...`, '140303': `Douban: User Info Expire, Please login again`, '140302': `Douban: Sync complete`, @@ -419,6 +434,10 @@ export default { '504105': `My Note`, '504106': `My Music`, + '500002': `Sync Status`, + + + '500110': `Replace exists or not`, diff --git a/src/lang/locale/zh-cn.ts b/src/org/wanxp/lang/locale/zh-cn.ts similarity index 94% rename from src/lang/locale/zh-cn.ts rename to src/org/wanxp/lang/locale/zh-cn.ts index 0faadda..2c725a8 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/org/wanxp/lang/locale/zh-cn.ts @@ -9,14 +9,25 @@ export default { '110005': `取消`, '110006': `同步豆瓣广播至Obsidian`, '110101': '搜索豆瓣并创建文档', - '110103': '同步豆瓣个人记录', + '110103': '同步豆瓣个人书影音广播记录', '110007': `开始同步`, + '110009': `停止同步`, + '110010': `后台运行`, + '110008': `已经存在同步任务: {0}-{1}, 结束之后再重试`, + '500002': `同步状态`, + '110030': `类型:`, + '110031': `替换已有:`, + '110032': `范围:`, + '110033': `进度:`, + '110034': `输出文件夹:`, '110201': `{0} 文件已经存在.`, '110202': `{0} 模板文件无法读取`, '100101': `登录豆瓣`, + '100102': `豆瓣人机验证`, + '100103': `人机认证通过,请重新搜索或导入`, '100111': `豆瓣登录信息过期,请至Douban插件重新登录`, '100113': `无法替换用户信息变量, 登录信息过期, 请重新登录Douban`, '100120': `已登录`, @@ -26,6 +37,7 @@ export default { '100124': `昵称`, '100125': `登录后, 可使用你的评分/阅读状态等作为导入参数,具体可用参数见最后.`, + '100126': `豆瓣用户信息`, '100128': `登出`, '100129': `豆瓣未登录,请先在电脑端登录!登录后导入参数可使用你的评分以及阅读状态等,具体可用参数见最后.`, @@ -148,6 +160,7 @@ export default { '121434': `assets`, + '121501': `笔记存放位置`, '121502': `创建的笔记将会存放至该文件夹中. 如果为空, 笔记将会存放到Obsidian的默认位置`, @@ -166,12 +179,14 @@ export default { '130103': `Obsidian Douban插件异常提示:`, '140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`, - '140201': `[Obsidian Douban]: 开始搜索'{0}'...`, - '140202': `[Obsidian Douban]: 搜索条数{0}条`, - '140203': `[Obsidian Douban]: 请求豆瓣'{0}'...`, - '140204': `[Obsidian Douban]: 替换文本'{0}'...`, - '140205': `[Obsidian Douban]: 处理完成'{0}'`, - '140206': `[Obsidian Douban]: 出现错误'{0}'`, + '140201': `[OB-Douban]: 开始搜索'{0}'...`, + '140202': `[OB-Douban]: 搜索条数{0}条`, + '140203': `[OB-Douban]: 请求豆瓣'{0}'...`, + '140204': `[OB-Douban]: 替换文本'{0}'...`, + '140205': `[OB-Douban]: 处理完成'{0}'`, + '140206': `[OB-Douban]: 出现错误'{0}'`, + '140207': `[OB-Douban]: [{0}/{1}] {2}`, + '140208': `[OB-Douban]: [{0}/{1}] {2}`, '140301': `Douban: 开始同步...`, @@ -443,6 +458,8 @@ export default { '504103': `我的电影`, '504104': `我的广播`, '504105': `我的日记`, + '504106': `我的音乐`, + 'ALL': `全部类型`, 'MOVIE': `电影`, diff --git a/main.ts b/src/org/wanxp/main.ts similarity index 53% rename from main.ts rename to src/org/wanxp/main.ts index 2c9de5e..9ce96e6 100644 --- a/main.ts +++ b/src/org/wanxp/main.ts @@ -1,26 +1,28 @@ import {Editor, Notice, Plugin} from "obsidian"; -import {DoubanFuzzySuggester} from "src/douban/data/search/DoubanSearchFuzzySuggestModal"; -import {DoubanSearchChooseItemHandler} from "src/douban/data/handler/DoubanSearchChooseItemHandler"; -import {DoubanSearchModal} from "src/douban/data/search/DoubanSearchModal"; -import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; -import DoubanSubject from "src/douban/data/model/DoubanSubject"; -import Searcher from "src/douban/data/search/Search"; -import {i18nHelper} from './src/lang/helper'; -import {log} from "src/utils/Logutil"; -import {BasicConst, SearchHandleMode} from "./src/constant/Constsant"; -import FileHandler from "./src/file/FileHandler"; -import HandleContext from "@App/data/model/HandleContext"; -import HandleResult from "@App/data/model/HandleResult"; -import {FileUtil} from "./src/utils/FileUtil"; -import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting"; -import {DEFAULT_SETTINGS} from "./src/constant/DefaultSettings"; -import UserComponent from "@App/user/UserComponent"; -import SettingsManager from "@App/setting/SettingsManager"; -import NetFileHandler from "./src/net/NetFileHandler"; -import {DoubanSyncModal} from "@App/component/DoubanSyncModal"; -import SyncHandler from "@App/sync/handler/SyncHandler"; -import {SyncConfig} from "@App/sync/model/SyncConfig"; +import {DoubanFuzzySuggester} from "./douban/data/search/DoubanSearchFuzzySuggestModal"; +import {DoubanSearchChooseItemHandler} from "./douban/data/handler/DoubanSearchChooseItemHandler"; +import {DoubanSearchModal} from "./douban/data/search/DoubanSearchModal"; +import {DoubanSettingTab} from "./douban/setting/DoubanSettingTab"; +import DoubanSubject from "./douban/data/model/DoubanSubject"; +import Searcher from "./douban/data/search/Search"; +import {i18nHelper} from './lang/helper'; +import {log} from "src/org/wanxp/utils/Logutil"; +import {Action, BasicConst, SearchHandleMode} from "./constant/Constsant"; +import FileHandler from "./file/FileHandler"; +import HandleContext from "./douban/data/model/HandleContext"; +import HandleResult from "./douban/data/model/HandleResult"; +import {FileUtil} from "./utils/FileUtil"; +import { DoubanPluginSetting } from "./douban/setting/model/DoubanPluginSetting"; +import {DEFAULT_SETTINGS} from "./constant/DefaultSettings"; +import UserComponent from "./douban/user/UserComponent"; +import SettingsManager from "./douban/setting/SettingsManager"; +import NetFileHandler from "./net/NetFileHandler"; +import {DoubanSyncModal} from "./douban/component/DoubanSyncModal"; +import SyncHandler from "./douban/sync/handler/SyncHandler"; +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 { public settings: DoubanPluginSetting; @@ -30,23 +32,34 @@ export default class DoubanPlugin extends Plugin { public userComponent: UserComponent; public settingsManager: SettingsManager; public netFileHandler: NetFileHandler; + public statusHolder: GlobalStatusHolder; async putToObsidian(context: HandleContext, extract: DoubanSubject) { + const {syncStatusHolder} = context; try { if (!extract) { log.warn(i18nHelper.getMessage('140101')); 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) 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) { - 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 { this.clearStatusBarDelay(); } @@ -56,10 +69,10 @@ export default class DoubanPlugin extends Plugin { const {mode} = context; switch (mode) { case SearchHandleMode.FOR_CREATE: - this.createFile(context, result); + await this.createFile(context, result); break; case SearchHandleMode.FOR_REPLACE: - this.putToEditor(context.editor, result.content); + await this.putToEditor(context.editor, result.content); break; } } @@ -72,14 +85,31 @@ export default class DoubanPlugin extends Plugin { let filePath = this.settings.dataFilePath; filePath = filePath?filePath:DEFAULT_SETTINGS.dataFilePath; 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) { try { - this.showStatus('140201', searchTerm); + this.showStatus(i18nHelper.getMessage('140201', searchTerm)); 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); } catch (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", name: i18nHelper.getMessage("110101"), callback: () => - this.getDoubanTextForCreateNewNote({mode: SearchHandleMode.FOR_CREATE, + this.getDoubanTextForCreateNewNote({plugin: this, + mode: SearchHandleMode.FOR_CREATE, settings: this.settings, userComponent: this.userComponent, netFileHandler: this.netFileHandler, - showAfterCreate:true}), + showAfterCreate:true, + action: Action.SearchAndCrate}), }); this.addCommand({ id: "search-douban-and-input-current-file", name: i18nHelper.getMessage("110002"), editorCallback: (editor: Editor) => - this.getDoubanTextForSearchTerm({mode: SearchHandleMode.FOR_REPLACE, + this.getDoubanTextForSearchTerm({plugin: this, + mode: SearchHandleMode.FOR_REPLACE, settings: this.settings, editor: editor, userComponent: this.userComponent, - netFileHandler: this.netFileHandler}), + netFileHandler: this.netFileHandler, + action: Action.SearchAndReplace}), }); this.addCommand({ id: "search-douban-by-current-file-name", name: i18nHelper.getMessage("110001"), editorCallback: (editor: Editor) => - this.getDoubanTextForActiveFile({mode: SearchHandleMode.FOR_REPLACE, + this.getDoubanTextForActiveFile({plugin: this, + mode: SearchHandleMode.FOR_REPLACE, settings: this.settings, editor: editor, userComponent: this.userComponent, - netFileHandler: this.netFileHandler}), + netFileHandler: this.netFileHandler, + action: Action.SearchEditorAndReplace}), }); this.addCommand({ id: "sync-douban-import-and-create-file", name: i18nHelper.getMessage("110103"), callback: () => - this.showSyncModal({mode: SearchHandleMode.FOR_CREATE, + this.showSyncModal({plugin: this, + mode: SearchHandleMode.FOR_CREATE, settings: this.settings, userComponent: this.userComponent, - netFileHandler: this.netFileHandler}), + netFileHandler: this.netFileHandler, + action: Action.Sync}), }); this.settingsManager = new SettingsManager(app, this); @@ -167,6 +205,7 @@ export default class DoubanPlugin extends Plugin { } this.addSettingTab(new DoubanSettingTab(this.app, this)); + this.statusHolder = new GlobalStatusHolder(); } 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) { return; } this.doubanStatusBar.empty(); - // @ts-ignore - this.doubanStatusBar.setText(i18nHelper.getMessage(origin).replace('{0}', message)); + this.doubanStatusBar.setText(origin); } clearStatusBarDelay() { @@ -205,14 +243,17 @@ export default class DoubanPlugin extends Plugin { if (!result) { return; } + + context.syncStatusHolder = new SyncStatusHolder(syncConfig, this.statusHolder); 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); await syncHandler.sync(); new Notice(i18nHelper.getMessage('140302')); } catch (e) { log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e); } finally { + context.plugin.statusHolder.completeSync(); this.clearStatusBarDelay(); } } diff --git a/src/net/NetFileHandler.ts b/src/org/wanxp/net/NetFileHandler.ts similarity index 100% rename from src/net/NetFileHandler.ts rename to src/org/wanxp/net/NetFileHandler.ts diff --git a/src/utils/FileUtil.ts b/src/org/wanxp/utils/FileUtil.ts similarity index 100% rename from src/utils/FileUtil.ts rename to src/org/wanxp/utils/FileUtil.ts diff --git a/src/utils/Logutil.ts b/src/org/wanxp/utils/Logutil.ts similarity index 60% rename from src/utils/Logutil.ts rename to src/org/wanxp/utils/Logutil.ts index 1bb941c..6e5b552 100644 --- a/src/utils/Logutil.ts +++ b/src/org/wanxp/utils/Logutil.ts @@ -1,35 +1,35 @@ import {Notice} from "obsidian"; -import {i18nHelper} from "src/lang/helper"; +import {i18nHelper} from "src/org/wanxp/lang/helper"; class Logger { public error(msg: any, e:any): any { new Notice(msg); - console.log(`Douban Plugin error: ${msg}`); + console.log(`OB-Douban: ${msg}`); console.error(e); return e; } public notice(e: any): any { new Notice(e); - console.error(`Douban Plugin notice: ${e}`); + console.error(`OB-Douban: ${e}`); return e; } public warn(e: any): any { new Notice(e); - console.warn(`Douban Plugin error: ${e}`); + console.warn(`OB-Douban: ${e}`); return e; } public info(e: any): any { - console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + console.log(`OB-Douban:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); return e; } public trace(e: any): any { // return e; - console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + console.log(`OB-Douban:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); return e; } diff --git a/src/utils/NumberUtil.ts b/src/org/wanxp/utils/NumberUtil.ts similarity index 100% rename from src/utils/NumberUtil.ts rename to src/org/wanxp/utils/NumberUtil.ts diff --git a/src/utils/SchemaOrg.ts b/src/org/wanxp/utils/SchemaOrg.ts similarity index 100% rename from src/utils/SchemaOrg.ts rename to src/org/wanxp/utils/SchemaOrg.ts diff --git a/src/utils/StringUtil.ts b/src/org/wanxp/utils/StringUtil.ts similarity index 68% rename from src/utils/StringUtil.ts rename to src/org/wanxp/utils/StringUtil.ts index 4feff09..6b6ddb1 100644 --- a/src/utils/StringUtil.ts +++ b/src/org/wanxp/utils/StringUtil.ts @@ -14,4 +14,13 @@ export default class StringUtil { public static defaultIfBlank(str: string, defaultStr: string): string { return StringUtil.isBlank(str) ? defaultStr : str; } + + + public static analyzeIdByUrl(url: string):string { + let idPattern = /(\d){5,10}/g; + let idE = idPattern.exec(url); + let id = idE ? idE[0] : ''; + return id; + } + } diff --git a/src/org/wanxp/utils/TimeUtil.ts b/src/org/wanxp/utils/TimeUtil.ts new file mode 100644 index 0000000..c77eebe --- /dev/null +++ b/src/org/wanxp/utils/TimeUtil.ts @@ -0,0 +1,20 @@ +import NumberUtil from "./NumberUtil"; +import {log} from "./Logutil"; + +export default class TimeUtil { + + +} + + + +export const sleep = (ms:number)=> { + return new Promise(resolve=>setTimeout(resolve, ms)) +} + +export const sleepRange = (msMin: number, msMax:number)=> { + const msTime = NumberUtil.getRandomNum(msMin, msMax); + return new Promise(resolve=>setTimeout(resolve, msTime)) +} + + diff --git a/src/utils/YamlUtil.ts b/src/org/wanxp/utils/YamlUtil.ts similarity index 100% rename from src/utils/YamlUtil.ts rename to src/org/wanxp/utils/YamlUtil.ts diff --git a/src/utils/TimeUtil.ts b/src/utils/TimeUtil.ts deleted file mode 100644 index c2f8e5b..0000000 --- a/src/utils/TimeUtil.ts +++ /dev/null @@ -1,13 +0,0 @@ -import NumberUtil from "./NumberUtil"; - -export default class TimeUtil { - public static async delay(callback: Function, ms: number):Promise { - return await new Promise(resolve => setTimeout(() => callback, ms)); - } - - public static async delayRange(callback: Function, msMin: number, msMax:number):Promise { - return await new Promise(resolve => setTimeout(() => callback, NumberUtil.getRandomNum(msMin, msMax))); - } - - -} diff --git a/styles.css b/styles.css index d72425b..6a9f901 100644 --- a/styles.css +++ b/styles.css @@ -48,3 +48,28 @@ } +.obsidian_douban_sync_config{ + display: inline-block; +} + + +.obsidian_douban_sync_config_text{ + vertical-align: bottom; +} + +.obsidian_douban_sync_slider { + display: inline-block; + position: relative; + margin-left: 5px; + margin-bottom: 1px; + width: 90%; +} +.obsidian_douban_sync_slider.with_number { + display: inline-flex; + align-items: center; +} + + + + +