mirror of
https://github.com/Wanxp/obsidian-douban.git
synced 2026-04-04 16:48:44 +08:00
add function: sync personal movie/book/music info
This commit is contained in:
parent
0a39541b02
commit
01a066f393
@ -15,7 +15,7 @@ esbuild.build({
|
||||
banner: {
|
||||
js: banner,
|
||||
},
|
||||
entryPoints: ['main.ts'],
|
||||
entryPoints: ['src/org/wanxp/main.ts'],
|
||||
bundle: true,
|
||||
external: [
|
||||
'obsidian',
|
||||
|
||||
@ -1,119 +0,0 @@
|
||||
import {
|
||||
App,
|
||||
ButtonComponent,
|
||||
DropdownComponent,
|
||||
Modal,
|
||||
SliderComponent,
|
||||
TextComponent,
|
||||
ToggleComponent
|
||||
} from "obsidian";
|
||||
|
||||
import DoubanPlugin from "main";
|
||||
import {i18nHelper} from "src/lang/helper";
|
||||
import HandleContext from "@App/data/model/HandleContext";
|
||||
import {SyncType, SyncTypeRecords} from "../../constant/Constsant";
|
||||
import {
|
||||
ALL,
|
||||
DoubanSubjectStateRecords_BOOK_SYNC, DoubanSubjectStateRecords_BROADCAST_SYNC,
|
||||
DoubanSubjectStateRecords_MOVIE_SYNC, DoubanSubjectStateRecords_NOTE_SYNC
|
||||
} from "../../constant/DoubanUserState";
|
||||
import {SyncConfig} from "@App/sync/model/SyncConfig";
|
||||
|
||||
export class DoubanSyncModal extends Modal {
|
||||
plugin: DoubanPlugin;
|
||||
context: HandleContext
|
||||
syncConfig: SyncConfig;
|
||||
|
||||
constructor(app: App, plugin: DoubanPlugin, context: HandleContext) {
|
||||
super(app);
|
||||
this.plugin = plugin;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
onOpen() {
|
||||
let {contentEl} = this;
|
||||
|
||||
contentEl.createEl("h3", {text: i18nHelper.getMessage('500001')});
|
||||
|
||||
|
||||
this.syncConfig = {syncType: 'movie', scope: 'collect', force: false};
|
||||
|
||||
const syncTypeDropdown = new DropdownComponent(contentEl);
|
||||
const scopeSelections = contentEl.createDiv("scope-selection");
|
||||
|
||||
syncTypeDropdown.addOptions(SyncTypeRecords)
|
||||
.setValue(SyncType.movie)
|
||||
.onChange((value) => {
|
||||
this.syncConfig.syncType = value;
|
||||
this.openScopeDropdown(scopeSelections);
|
||||
});
|
||||
|
||||
this.openScopeDropdown(scopeSelections);
|
||||
|
||||
|
||||
|
||||
new ToggleComponent(contentEl)
|
||||
.setTooltip(i18nHelper.getMessage('500110'))
|
||||
.setValue(false)
|
||||
.onChange((value) => {
|
||||
this.syncConfig.force = value;
|
||||
});
|
||||
|
||||
const controls = contentEl.createDiv("controls");
|
||||
// const syncButton = controls.createEl("button", {
|
||||
// text: i18nHelper.getMessage('110007'),
|
||||
// cls: "mod-cta",
|
||||
// attr: {
|
||||
// autofocus: true,
|
||||
// },
|
||||
// });
|
||||
|
||||
const syncButton = new ButtonComponent(controls)
|
||||
.setButtonText(i18nHelper.getMessage('110007'))
|
||||
.onClick(async () => {
|
||||
this.close();
|
||||
await this.plugin.sync(this.syncConfig, this.context);
|
||||
})
|
||||
|
||||
const cancelButton = new ButtonComponent(controls)
|
||||
.setButtonText(i18nHelper.getMessage('110005'))
|
||||
.onClick(() => {
|
||||
this.close();
|
||||
});
|
||||
cancelButton.setClass("obsidian_douban_search_button");
|
||||
syncButton.setClass("obsidian_douban_search_button");
|
||||
}
|
||||
|
||||
|
||||
async onClose() {
|
||||
let {contentEl} = this;
|
||||
contentEl.empty();
|
||||
}
|
||||
|
||||
private openScopeDropdown(contentEl:HTMLDivElement) {
|
||||
switch (this.syncConfig.syncType) {
|
||||
case SyncType.movie:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_MOVIE_SYNC);
|
||||
break;
|
||||
case SyncType.book:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BOOK_SYNC);
|
||||
break;
|
||||
case SyncType.broadcast:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BROADCAST_SYNC);
|
||||
break;
|
||||
case SyncType.note:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_NOTE_SYNC);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private showScopeDropdown(contentEl:HTMLDivElement, scopeSelections: Record<string, string>) {
|
||||
contentEl.empty();
|
||||
const syncScopeTypeDropdown = new DropdownComponent(contentEl)
|
||||
.addOptions(scopeSelections)
|
||||
.setValue(ALL)
|
||||
.onChange((value) => {
|
||||
this.syncConfig.scope = value;
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
import {SearchHandleMode} from "../../../constant/Constsant";
|
||||
import {Editor} from "obsidian";
|
||||
import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting";
|
||||
import UserComponent from "@App/user/UserComponent";
|
||||
import NetFileHandler from "src/net/NetFileHandler";
|
||||
|
||||
export default interface HandleContext {
|
||||
mode:SearchHandleMode;
|
||||
settings: DoubanPluginSetting;
|
||||
editor?:Editor;
|
||||
userComponent: UserComponent;
|
||||
netFileHandler: NetFileHandler;
|
||||
showAfterCreate?:boolean;
|
||||
}
|
||||
@ -1,26 +0,0 @@
|
||||
import {CheerioAPI} from "cheerio";
|
||||
import DoubanSyncSubject from "../model/DoubanSyncSubject";
|
||||
import DoubanPlugin from "../../../../main";
|
||||
import {SyncType} from "../../../constant/Constsant";
|
||||
import {DoubanSyncHandler} from "@App/sync/handler/DoubanSyncHandler";
|
||||
import { SyncConfig } from "../model/SyncConfig";
|
||||
import HandleContext from "@App/data/model/HandleContext";
|
||||
|
||||
export abstract class DoubanAbstractSyncHandler implements DoubanSyncHandler{
|
||||
|
||||
private plugin: DoubanPlugin;
|
||||
|
||||
constructor(plugin: DoubanPlugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
support(t: string): boolean {
|
||||
return this.getSyncType() == t;
|
||||
}
|
||||
|
||||
abstract sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>;
|
||||
|
||||
abstract getSyncType(): SyncType;
|
||||
}
|
||||
|
||||
|
||||
@ -1,19 +0,0 @@
|
||||
import {CheerioAPI} from "cheerio";
|
||||
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
|
||||
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
|
||||
import DoubanPlugin from "../../../../main";
|
||||
import {SyncType} from "../../../constant/Constsant";
|
||||
import {SyncConfig} from "@App/sync/model/SyncConfig";
|
||||
import HandleContext from "@App/data/model/HandleContext";
|
||||
|
||||
//TODO will support in future version
|
||||
export class DoubanBookSyncHandler extends DoubanAbstractSyncHandler {
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.book;
|
||||
}
|
||||
|
||||
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,59 +0,0 @@
|
||||
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
|
||||
import {SyncType} from "../../../constant/Constsant";
|
||||
import {SyncConfig} from "@App/sync/model/SyncConfig";
|
||||
import HandleContext from "@App/data/model/HandleContext";
|
||||
import DoubanSubjectLoadHandler from "@App/data/handler/DoubanSubjectLoadHandler";
|
||||
import DoubanMovieLoadHandler from "@App/data/handler/DoubanMovieLoadHandler";
|
||||
import DoubanMovieSubject from "@App/data/model/DoubanMovieSubject";
|
||||
import DoubanPlugin from "../../../../main";
|
||||
import {SubjectListItem} from "@App/data/model/SubjectListItem";
|
||||
import DoubanMovieCollectListHandler from "@App/sync/handler/list/DoubanMovieCollectListHandler";
|
||||
import {DoubanListHandler} from "@App/sync/handler/list/DoubanListHandler";
|
||||
import DoubanMovieWishListHandler from "./list/DoubanMovieWishListHandler";
|
||||
import DoubanMovieDoListHandler from "@App/sync/handler/list/DoubanMovieDoListHandler";
|
||||
|
||||
//TODO will support in future version
|
||||
export class DoubanMovieSyncHandler extends DoubanAbstractSyncHandler {
|
||||
|
||||
private doubanSubjectLoadHandler:DoubanSubjectLoadHandler<DoubanMovieSubject>;
|
||||
private doubanListHandlers:DoubanListHandler[];
|
||||
|
||||
constructor(plugin:DoubanPlugin) {
|
||||
super(plugin);
|
||||
this.doubanSubjectLoadHandler = new DoubanMovieLoadHandler(plugin);
|
||||
this.doubanListHandlers = [
|
||||
new DoubanMovieCollectListHandler(),
|
||||
new DoubanMovieWishListHandler(),
|
||||
new DoubanMovieDoListHandler(),
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.movie;
|
||||
}
|
||||
|
||||
|
||||
|
||||
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
|
||||
Promise.resolve()
|
||||
.then(() => this.getItems(syncConfig, context))
|
||||
.then(this.removeExists)
|
||||
.then((items) => {
|
||||
items.forEach(item => {
|
||||
item.id
|
||||
this.doubanSubjectLoadHandler.handle(item.url, context);
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
private async getItems(syncConfig:SyncConfig, context:HandleContext):Promise<SubjectListItem[]> {
|
||||
return this.doubanListHandlers.find((h) => h.support(syncConfig)).getAllPageList(context);
|
||||
}
|
||||
|
||||
private async removeExists(items:SubjectListItem[]):Promise<SubjectListItem[]> {
|
||||
return items;
|
||||
}
|
||||
}
|
||||
@ -1,26 +0,0 @@
|
||||
import {CheerioAPI} from "cheerio";
|
||||
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
|
||||
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
|
||||
import DoubanPlugin from "../../../../main";
|
||||
import {SyncType} from "../../../constant/Constsant";
|
||||
import {SyncConfig} from "@App/sync/model/SyncConfig";
|
||||
import HandleContext from "@App/data/model/HandleContext";
|
||||
|
||||
//TODO will support in future version
|
||||
export class DoubanMusicSyncHandler extends DoubanAbstractSyncHandler {
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.music;
|
||||
}
|
||||
|
||||
support(t: string): boolean {
|
||||
throw new Error("Method not implemented.");
|
||||
}
|
||||
|
||||
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
import HandleContext from "@App/data/model/HandleContext";
|
||||
import {SubjectListItem} from "@App/data/model/SubjectListItem";
|
||||
import {SyncConfig} from "@App/sync/model/SyncConfig";
|
||||
|
||||
export interface DoubanListHandler {
|
||||
|
||||
getAllPageList(context: HandleContext):Promise<SubjectListItem[]>;
|
||||
|
||||
support(config:SyncConfig):boolean;
|
||||
}
|
||||
@ -6,8 +6,8 @@ import {i18nHelper} from "../lang/helper";
|
||||
export const BasicConst = {
|
||||
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',
|
||||
}
|
||||
|
||||
@ -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";
|
||||
|
||||
83
src/org/wanxp/douban/component/DoubanHumanCheckModel.ts
Normal file
83
src/org/wanxp/douban/component/DoubanHumanCheckModel.ts
Normal file
@ -0,0 +1,83 @@
|
||||
import { Notice } from 'obsidian';
|
||||
import { log } from 'src/org/wanxp/utils/Logutil';
|
||||
import {i18nHelper} from "../../lang/helper";
|
||||
import {DoubanSettingTab} from "../setting/DoubanSettingTab";
|
||||
import SettingsManager from "../setting/SettingsManager";
|
||||
import {constructDoubanTokenSettingsUI} from "../setting/BasicSettingsHelper";
|
||||
|
||||
// Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin
|
||||
|
||||
|
||||
export default class DoubanHumanCheckModel {
|
||||
private modal: any;
|
||||
private url:string;
|
||||
constructor(url:string) {
|
||||
this.url = url;
|
||||
const { remote } = require('electron');
|
||||
const { BrowserWindow: RemoteBrowserWindow } = remote;
|
||||
this.modal = new RemoteBrowserWindow({
|
||||
parent: remote.getCurrentWindow(),
|
||||
width: 960,
|
||||
height: 540,
|
||||
show: false
|
||||
});
|
||||
|
||||
this.modal.once('ready-to-show', () => {
|
||||
this.modal.setTitle(i18nHelper.getMessage('100102'));
|
||||
this.modal.show();
|
||||
});
|
||||
|
||||
|
||||
const session = this.modal.webContents.session;
|
||||
const filter = {
|
||||
urls: [this.url]
|
||||
};
|
||||
session.webRequest.onSendHeaders(filter, async (details:any) => {
|
||||
const cookies = details.requestHeaders['Cookie'];
|
||||
const cookieArr = this.parseCookies(cookies);
|
||||
// const wr_name = cookieArr.find((cookie) => cookie.name == 'wr_name').value;
|
||||
if (cookieArr) {
|
||||
this.onClose();
|
||||
} else {
|
||||
this.onReload();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private parseCookies(cookies: any) {
|
||||
return cookies;
|
||||
}
|
||||
|
||||
async load() {
|
||||
try {
|
||||
await this.modal.loadURL(this.url);
|
||||
} catch (error) {
|
||||
log.error(i18nHelper.getMessage('100101'), error)
|
||||
}
|
||||
}
|
||||
|
||||
async loadUrl(url:string) {
|
||||
try {
|
||||
await this.modal.loadURL(url);
|
||||
} catch (error) {
|
||||
log.error(i18nHelper.getMessage('100101'), error)
|
||||
}
|
||||
}
|
||||
|
||||
async loadHtml(html:string) {
|
||||
try {
|
||||
await this.modal.loadURL(`data:text/html;charset=utf-8,${html}`);
|
||||
} catch (error) {
|
||||
log.error(i18nHelper.getMessage('100101'), error)
|
||||
}
|
||||
}
|
||||
|
||||
onClose() {
|
||||
this.modal.close();
|
||||
new Notice(i18nHelper.getMessage('100103'))
|
||||
}
|
||||
|
||||
onReload() {
|
||||
this.modal.reload();
|
||||
}
|
||||
}
|
||||
@ -1,9 +1,9 @@
|
||||
import { Notice } from 'obsidian';
|
||||
import { 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'];
|
||||
@ -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
|
||||
223
src/org/wanxp/douban/component/DoubanSyncModal.ts
Normal file
223
src/org/wanxp/douban/component/DoubanSyncModal.ts
Normal file
@ -0,0 +1,223 @@
|
||||
import {
|
||||
App,
|
||||
ButtonComponent,
|
||||
DropdownComponent,
|
||||
Modal, SearchComponent, Setting,
|
||||
ToggleComponent
|
||||
} from "obsidian";
|
||||
|
||||
import DoubanPlugin from "../../main";
|
||||
import {i18nHelper} from "src/org/wanxp/lang/helper";
|
||||
import HandleContext from "../data/model/HandleContext";
|
||||
import {SyncType, SyncTypeRecords} from "../../constant/Constsant";
|
||||
import {
|
||||
ALL,
|
||||
DoubanSubjectStateRecords_BOOK_SYNC, DoubanSubjectStateRecords_BROADCAST_SYNC,
|
||||
DoubanSubjectStateRecords_MOVIE_SYNC, DoubanSubjectStateRecords_NOTE_SYNC
|
||||
} from "../../constant/DoubanUserState";
|
||||
import {SyncConfig} from "../sync/model/SyncConfig";
|
||||
import {clearInterval} from "timers";
|
||||
import {statSync} from "fs";
|
||||
import {CreateTemplateSelectParams} from "../setting/model/CreateTemplateSelectParams";
|
||||
import {FolderSuggest} from "../setting/model/FolderSuggest";
|
||||
|
||||
export class DoubanSyncModal extends Modal {
|
||||
plugin: DoubanPlugin;
|
||||
context: HandleContext
|
||||
timer: any;
|
||||
|
||||
constructor(app: App, plugin: DoubanPlugin, context: HandleContext) {
|
||||
super(app);
|
||||
this.plugin = plugin;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
onOpen() {
|
||||
let {contentEl} = this;
|
||||
this.show(contentEl);
|
||||
}
|
||||
|
||||
private show(contentEl: HTMLElement) {
|
||||
contentEl.empty();
|
||||
if (this.plugin.statusHolder.syncing()) {
|
||||
this.showSyncStatus(contentEl);
|
||||
} else {
|
||||
this.showSyncConfig(contentEl);
|
||||
}
|
||||
}
|
||||
|
||||
private showSyncStatus(contentEl: HTMLElement) {
|
||||
const {syncStatus} = this.plugin.statusHolder;
|
||||
const {syncConfig} = syncStatus;
|
||||
contentEl.createEl("h3", {text: i18nHelper.getMessage('500002')});
|
||||
|
||||
this.showConfigPan(contentEl, syncConfig, true);
|
||||
|
||||
const sliderDiv = contentEl.createEl('div');
|
||||
sliderDiv.addClass('obsidian_douban_sync_slider');
|
||||
this.showProgress(sliderDiv);
|
||||
const controls = contentEl.createDiv("controls");
|
||||
|
||||
const syncButton = new ButtonComponent(controls)
|
||||
.setButtonText(i18nHelper.getMessage('110009'))
|
||||
.onClick(async () => {
|
||||
this.close();
|
||||
await this.plugin.statusHolder.stopSync();
|
||||
})
|
||||
|
||||
const cancelButton = new ButtonComponent(controls)
|
||||
.setButtonText(i18nHelper.getMessage('110010'))
|
||||
.onClick(() => {
|
||||
this.close();
|
||||
});
|
||||
cancelButton.setClass("obsidian_douban_search_button");
|
||||
syncButton.setClass("obsidian_douban_search_button");
|
||||
|
||||
this.timer = setInterval(() => {
|
||||
this.showProgress(sliderDiv);
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
|
||||
private showProgress(sliderDiv: HTMLDivElement) {
|
||||
const {syncStatus} = this.plugin.statusHolder;
|
||||
if (!syncStatus) {
|
||||
return;
|
||||
}
|
||||
sliderDiv.innerHTML = `<p>
|
||||
<label for="file">${i18nHelper.getMessage('110033')}</label>
|
||||
<progress class="obsidian_douban_sync_slider" max="${syncStatus.getTotal()}" value="${syncStatus.getHandle()}"> </progress> <span> ${syncStatus.getHandle()}/${syncStatus.getTotal()} </span>
|
||||
</p>`}
|
||||
|
||||
private showSyncConfig(contentEl: HTMLElement) {
|
||||
if (this.timer != null) {
|
||||
clearInterval(this.timer)
|
||||
}
|
||||
contentEl.createEl("h3", {text: i18nHelper.getMessage('500001')});
|
||||
|
||||
let syncConfig:SyncConfig = {syncType: SyncType.movie, scope: ALL, force: false, outputFolder: this.plugin.settings.dataFilePath};
|
||||
this.showConfigPan(contentEl, syncConfig, false);
|
||||
const controls = contentEl.createDiv("controls");
|
||||
|
||||
const syncButton = new ButtonComponent(controls)
|
||||
.setButtonText(i18nHelper.getMessage('110007'))
|
||||
.onClick(async () => {
|
||||
syncButton.setDisabled(true);
|
||||
if(!this.plugin.statusHolder.startSync(syncConfig)) {
|
||||
return;
|
||||
}
|
||||
this.show(contentEl);
|
||||
await this.plugin.sync(syncConfig, this.context);
|
||||
})
|
||||
|
||||
const cancelButton = new ButtonComponent(controls)
|
||||
.setButtonText(i18nHelper.getMessage('110005'))
|
||||
.onClick(() => {
|
||||
this.close();
|
||||
});
|
||||
cancelButton.setClass("obsidian_douban_search_button");
|
||||
syncButton.setClass("obsidian_douban_search_button");
|
||||
}
|
||||
|
||||
private showConfigPan(contentEl: HTMLElement, config:SyncConfig, disable:boolean) {
|
||||
const typeSelections = contentEl.createDiv('type-selection');
|
||||
const typeSelectionLabel = typeSelections.createEl('label');
|
||||
typeSelectionLabel.setText(i18nHelper.getMessage('110030'))
|
||||
typeSelectionLabel.addClass('obsidian_douban_settings_text')
|
||||
const syncTypeDropdown = new DropdownComponent(typeSelections);
|
||||
const scopeSelections = contentEl.createDiv("scope-selection");
|
||||
syncTypeDropdown.addOptions(SyncTypeRecords)
|
||||
.setValue(config.syncType)
|
||||
.onChange((value) => {
|
||||
config.syncType = value;
|
||||
this.openScopeDropdown(scopeSelections, config, disable);
|
||||
});
|
||||
|
||||
this.openScopeDropdown(scopeSelections, config, disable);
|
||||
|
||||
const forceSelections = contentEl.createDiv('force-selection');
|
||||
let forceLabel = forceSelections.createEl('label');
|
||||
forceLabel.setText(i18nHelper.getMessage('110031'));
|
||||
forceLabel.addClass('obsidian_douban_settings_text');
|
||||
forceLabel.addClass('obsidian_douban_sync_config_text');
|
||||
const toggle:ToggleComponent = new ToggleComponent(forceSelections)
|
||||
.setTooltip(i18nHelper.getMessage('500110'))
|
||||
.setValue(config.force)
|
||||
.onChange((value) => {
|
||||
config.force = value;
|
||||
});
|
||||
if (disable) {
|
||||
syncTypeDropdown.setDisabled(true);
|
||||
toggle.setDisabled(true);
|
||||
}
|
||||
const folderSelections = contentEl.createDiv('folder-selection');
|
||||
let folderLabel = folderSelections.createEl('label');
|
||||
folderLabel.setText(i18nHelper.getMessage('110034'));
|
||||
folderLabel.addClass('obsidian_douban_settings_text');
|
||||
folderLabel.addClass('obsidian_douban_sync_config_text');
|
||||
this.createFolderSetting(folderSelections, config, disable);
|
||||
|
||||
typeSelections.addClass('obsidian_douban_sync_config');
|
||||
scopeSelections.addClass('obsidian_douban_sync_config');
|
||||
forceSelections.addClass('obsidian_douban_sync_config');
|
||||
}
|
||||
|
||||
async onClose() {
|
||||
let {contentEl} = this;
|
||||
contentEl.empty();
|
||||
if (this.timer != null) {
|
||||
clearInterval(this.timer);
|
||||
}
|
||||
}
|
||||
|
||||
private openScopeDropdown(contentEl:HTMLDivElement, config: SyncConfig, disable:boolean) {
|
||||
contentEl.empty();
|
||||
let scopeLabel = contentEl.createEl('label');
|
||||
scopeLabel.addClass('obsidian_douban_settings_text');
|
||||
scopeLabel.setText(i18nHelper.getMessage('110032'));
|
||||
switch (config.syncType) {
|
||||
case SyncType.movie:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_MOVIE_SYNC, config, disable);
|
||||
break;
|
||||
case SyncType.book:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BOOK_SYNC, config, disable);
|
||||
break;
|
||||
case SyncType.broadcast:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_BROADCAST_SYNC, config, disable);
|
||||
break;
|
||||
case SyncType.note:
|
||||
this.showScopeDropdown(contentEl, DoubanSubjectStateRecords_NOTE_SYNC, config, disable);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private showScopeDropdown(contentEl:HTMLDivElement, scopeSelections: Record<string, string>, config: SyncConfig, disable:boolean) {
|
||||
const syncScopeTypeDropdown = new DropdownComponent(contentEl)
|
||||
.addOptions(scopeSelections)
|
||||
.setValue(config.scope)
|
||||
.onChange((value) => {
|
||||
config.scope = value;
|
||||
});
|
||||
if (disable) {
|
||||
syncScopeTypeDropdown.setDisabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private createFolderSetting(contentEl:HTMLDivElement, config: SyncConfig, disable:boolean) {
|
||||
let outputFolder = this.plugin.settings.dataFilePath;
|
||||
if (config.outputFolder) {
|
||||
outputFolder = config.outputFolder;
|
||||
}
|
||||
const search = new SearchComponent(contentEl);
|
||||
new FolderSuggest(this.plugin.app, search.inputEl);
|
||||
search.setValue(outputFolder)
|
||||
.setPlaceholder(i18nHelper.getMessage('121503'))
|
||||
.onChange(async (value:string) => {
|
||||
config.outputFolder = value;
|
||||
})
|
||||
if (disable) {
|
||||
search.setDisabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,9 +1,9 @@
|
||||
import DoubanPlugin from "main";
|
||||
import DoubanPlugin from "../../../main";
|
||||
import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject';
|
||||
import 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<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
|
||||
|
||||
@ -62,7 +64,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
|
||||
fileName = this.parsePartText(this.getFileName(context), extract, context);
|
||||
}
|
||||
|
||||
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<T extends DoubanSubject>
|
||||
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<T extends DoubanSubject>
|
||||
})
|
||||
.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<T extends DoubanSubject>
|
||||
extract.image = filepath;
|
||||
}
|
||||
}
|
||||
|
||||
private async humanCheck(html:any, url:string):Promise<any> {
|
||||
if (html && html.indexOf("<title>禁止访问</title>") != -1) {
|
||||
const loginModel = new DoubanHumanCheckModel(url);
|
||||
await loginModel.load();
|
||||
return '';
|
||||
}else {
|
||||
return html;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,10 +1,11 @@
|
||||
import {CheerioAPI} from 'cheerio';
|
||||
import 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<DoubanBookSubject> {
|
||||
|
||||
@ -76,10 +77,7 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
|
||||
}
|
||||
valueMap.set(BookKeyValueMap.get(key), value);
|
||||
})
|
||||
|
||||
let idPattern = /(\d){5,10}/g;
|
||||
let idE = idPattern.exec(url);
|
||||
let id = idE ? idE[0] : '';
|
||||
let id = StringUtil.analyzeIdByUrl(url);
|
||||
let menuIdDom = html('#dir_' + id + '_full') ? html('#dir_' + id + '_full') : html('#dir_' + id + '_short');
|
||||
let menu: string[] = menuIdDom ? html(menuIdDom.get(0)).text().trim().split('\n').map(row => row.trim()) : [];
|
||||
menu.length > 0 ? menu.pop() : menu;
|
||||
@ -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<DoubanGameSubject> {
|
||||
@ -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<DoubanMovieSubject> {
|
||||
@ -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<DoubanMusicSubject> {
|
||||
@ -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<DoubanNoteSubject> {
|
||||
@ -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";
|
||||
|
||||
/**
|
||||
@ -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<void> {
|
||||
if (!searchExtract) {
|
||||
return;
|
||||
}
|
||||
@ -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<T extends DoubanSubject> {
|
||||
|
||||
@ -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";
|
||||
|
||||
/**
|
||||
0
src/douban/data/model/DoubanMovieSubject.ts → src/org/wanxp/douban/data/model/DoubanMovieSubject.ts
0
src/douban/data/model/DoubanMovieSubject.ts → src/org/wanxp/douban/data/model/DoubanMovieSubject.ts
0
src/douban/data/model/DoubanMusicSubject.ts → src/org/wanxp/douban/data/model/DoubanMusicSubject.ts
0
src/douban/data/model/DoubanMusicSubject.ts → src/org/wanxp/douban/data/model/DoubanMusicSubject.ts
@ -1,4 +1,4 @@
|
||||
import {UserStateSubject} from "@App/data/model/UserStateSubject";
|
||||
import {UserStateSubject} from "./UserStateSubject";
|
||||
|
||||
export default class DoubanSubject {
|
||||
id: string;
|
||||
20
src/org/wanxp/douban/data/model/HandleContext.ts
Normal file
20
src/org/wanxp/douban/data/model/HandleContext.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import {SearchHandleMode} from "../../../constant/Constsant";
|
||||
import {Editor} from "obsidian";
|
||||
import { DoubanPluginSetting } from "../../setting/model/DoubanPluginSetting";
|
||||
import UserComponent from "../../user/UserComponent";
|
||||
import NetFileHandler from "src/org/wanxp/net/NetFileHandler";
|
||||
import DoubanPlugin from "../../../main";
|
||||
import SyncStatusHolder from "../../sync/model/SyncStatusHolder";
|
||||
|
||||
export default interface HandleContext {
|
||||
plugin:DoubanPlugin;
|
||||
mode:SearchHandleMode;
|
||||
settings: DoubanPluginSetting;
|
||||
editor?:Editor;
|
||||
userComponent: UserComponent;
|
||||
netFileHandler: NetFileHandler;
|
||||
showAfterCreate?:boolean;
|
||||
syncStatusHolder?:SyncStatusHolder;
|
||||
action:string;
|
||||
outputFolder:string;
|
||||
}
|
||||
@ -1,4 +1,7 @@
|
||||
import DoubanSubject from "./DoubanSubject";
|
||||
|
||||
export default interface HandleResult {
|
||||
content:string
|
||||
fileName?:string
|
||||
subject?:DoubanSubject,
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
import { DoubanSubjectState } from "src/constant/DoubanUserState";
|
||||
import { DoubanSubjectState } from "src/org/wanxp/constant/DoubanUserState";
|
||||
|
||||
export interface UserStateSubject {
|
||||
tags: string[];
|
||||
@ -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<DoubanSearchResultSubject>
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
6
src/douban/data/search/DoubanSearchModal.ts → src/org/wanxp/douban/data/search/DoubanSearchModal.ts
6
src/douban/data/search/DoubanSearchModal.ts → 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;
|
||||
@ -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 {
|
||||
33
src/org/wanxp/douban/model/GlobalStatusHolder.ts
Normal file
33
src/org/wanxp/douban/model/GlobalStatusHolder.ts
Normal file
@ -0,0 +1,33 @@
|
||||
import GlobalSyncStatusHolder from "../sync/model/GlobalSyncStatusHolder";
|
||||
import {SyncConfig} from "../sync/model/SyncConfig";
|
||||
import {Notice} from "obsidian";
|
||||
import {i18nHelper} from "../../lang/helper";
|
||||
import {SyncTypeRecords} from "../../constant/Constsant";
|
||||
import {DoubanSubjectState} from "../../constant/DoubanUserState";
|
||||
|
||||
export default class GlobalStatusHolder {
|
||||
public syncStatus:GlobalSyncStatusHolder;
|
||||
|
||||
public completeSync() {
|
||||
this.syncStatus = null;
|
||||
}
|
||||
|
||||
public startSync(syncConfigOut: SyncConfig):boolean {
|
||||
if (this.syncStatus) {
|
||||
const {syncConfig} = this.syncStatus;
|
||||
// @ts-ignore
|
||||
new Notice(i18nHelper.getMessage('110008'), SyncTypeRecords[syncConfig.syncType], DoubanSubjectState[syncConfig.scope]);
|
||||
return false;
|
||||
}
|
||||
this.syncStatus = new GlobalSyncStatusHolder(syncConfigOut);
|
||||
return true;
|
||||
}
|
||||
|
||||
public stopSync() {
|
||||
this.syncStatus = null;
|
||||
}
|
||||
|
||||
public syncing() {
|
||||
return this.syncStatus;
|
||||
}
|
||||
}
|
||||
@ -1,11 +1,11 @@
|
||||
import {i18nHelper} from "../../lang/helper";
|
||||
import {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') });
|
||||
@ -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";
|
||||
|
||||
@ -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";
|
||||
|
||||
/**
|
||||
* 部分逻辑参考以下项目
|
||||
@ -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') });
|
||||
@ -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 {
|
||||
8
src/douban/setting/TemplateSettingHelper.ts → src/org/wanxp/douban/setting/TemplateSettingHelper.ts
8
src/douban/setting/TemplateSettingHelper.ts → 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) {
|
||||
@ -1,4 +1,4 @@
|
||||
import SettingsManager from "@App/setting/SettingsManager";
|
||||
import SettingsManager from "./SettingsManager";
|
||||
import {i18nHelper} from "../../lang/helper";
|
||||
import {Setting} from "obsidian";
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import SettingsManager from "@App/setting/SettingsManager";
|
||||
import SettingsManager from "../SettingsManager";
|
||||
import { DoubanPluginSetting } from "./DoubanPluginSetting";
|
||||
|
||||
export interface CreateTemplateSelectParams {
|
||||
@ -1,4 +1,4 @@
|
||||
import {CustomProperty} from "@App/setting/model/CustomProperty";
|
||||
import {CustomProperty} from "./CustomProperty";
|
||||
|
||||
export interface DoubanPluginSetting {
|
||||
movieTemplateFile: string,
|
||||
@ -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<TFile> {
|
||||
@ -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<TFolder> {
|
||||
@ -0,0 +1,80 @@
|
||||
import {CheerioAPI} from "cheerio";
|
||||
import DoubanSyncSubject from "../model/DoubanSyncSubject";
|
||||
import DoubanPlugin from "../../../main";
|
||||
import {BasicConst, SyncType} from "../../../constant/Constsant";
|
||||
import {DoubanSyncHandler} from "./DoubanSyncHandler";
|
||||
import { SyncConfig } from "../model/SyncConfig";
|
||||
import HandleContext from "../../data/model/HandleContext";
|
||||
import {SubjectListItem} from "../../data/model/SubjectListItem";
|
||||
import {sleepRange} from "../../../utils/TimeUtil";
|
||||
import DoubanSubjectLoadHandler from "../../data/handler/DoubanSubjectLoadHandler";
|
||||
import {DoubanListHandler} from "./list/DoubanListHandler";
|
||||
import DoubanSubject from "../../data/model/DoubanSubject";
|
||||
|
||||
export abstract class DoubanAbstractSyncHandler<T extends DoubanSubject> implements DoubanSyncHandler{
|
||||
|
||||
private plugin: DoubanPlugin;
|
||||
private doubanSubjectLoadHandler:DoubanSubjectLoadHandler<T>;
|
||||
private doubanListHandlers:DoubanListHandler[];
|
||||
|
||||
constructor(plugin: DoubanPlugin,
|
||||
doubanSubjectLoadHandler:DoubanSubjectLoadHandler<T>,
|
||||
doubanListHandlers:DoubanListHandler[]) {
|
||||
this.plugin = plugin;
|
||||
this.doubanSubjectLoadHandler = doubanSubjectLoadHandler;
|
||||
this.doubanListHandlers = doubanListHandlers;
|
||||
}
|
||||
|
||||
support(t: string): boolean {
|
||||
return this.getSyncType() == t;
|
||||
}
|
||||
|
||||
abstract getSyncType(): SyncType;
|
||||
|
||||
async sync(syncConfig: SyncConfig, context: HandleContext): Promise<void>{
|
||||
return Promise.resolve()
|
||||
.then(() => this.getItems(syncConfig, context))
|
||||
.then(items => this.removeExists(items , syncConfig, context))
|
||||
.then(items => this.handleItems(items, context));
|
||||
}
|
||||
|
||||
|
||||
private async getItems(syncConfig:SyncConfig, context:HandleContext):Promise<SubjectListItem[]> {
|
||||
const supportHandlers:DoubanListHandler[] = this.doubanListHandlers.filter((h) => h.support(syncConfig));
|
||||
let items:SubjectListItem[] = [];
|
||||
for(const handler of supportHandlers) {
|
||||
if (!context.plugin.statusHolder.syncing()) {
|
||||
return [];
|
||||
}
|
||||
const item = await handler.getAllPageList(context);
|
||||
if (item) {
|
||||
items = items.concat(item);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
private async removeExists(items:SubjectListItem[], syncConfig: SyncConfig, context: HandleContext):Promise<SubjectListItem[]> {
|
||||
if (!context.plugin.statusHolder.syncing()) {
|
||||
return [];
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
private async handleItems(items:SubjectListItem[], context:HandleContext):Promise<void> {
|
||||
if (!items || items.length == 0) {
|
||||
return ;
|
||||
}
|
||||
context.syncStatusHolder.setTotal(items.length);
|
||||
for (const item of items) {
|
||||
await sleepRange(BasicConst.CALL_DOUBAN_DELAY, BasicConst.CALL_DOUBAN_DELAY + BasicConst.CALL_DOUBAN_DELAY_RANGE);
|
||||
if (!context.plugin.statusHolder.syncing()) {
|
||||
return;
|
||||
}
|
||||
await this.doubanSubjectLoadHandler.handle(item.url, context);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
25
src/org/wanxp/douban/sync/handler/DoubanBookSyncHandler.ts
Normal file
25
src/org/wanxp/douban/sync/handler/DoubanBookSyncHandler.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
|
||||
import DoubanPlugin from "../../../main";
|
||||
import {SyncType} from "../../../constant/Constsant";
|
||||
import DoubanBookSubject from "../../data/model/DoubanBookSubject";
|
||||
import DoubanBookLoadHandler from "../../data/handler/DoubanBookLoadHandler";
|
||||
import DoubanBookWishListHandler from "./list/DoubanBookWishListHandler";
|
||||
import DoubanBookCollectListHandler from "./list/DoubanBookCollectListHandler";
|
||||
import DoubanBookDoListHandler from "./list/DoubanBookDoListHandler";
|
||||
|
||||
//TODO will support in future version
|
||||
export class DoubanBookSyncHandler extends DoubanAbstractSyncHandler<DoubanBookSubject> {
|
||||
|
||||
constructor(plugin:DoubanPlugin) {
|
||||
super(plugin, new DoubanBookLoadHandler(plugin),[
|
||||
new DoubanBookCollectListHandler(),
|
||||
new DoubanBookWishListHandler(),
|
||||
new DoubanBookDoListHandler()]);
|
||||
}
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.book;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,13 +1,14 @@
|
||||
import {CheerioAPI} from "cheerio";
|
||||
import {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<DoubanSubject> {
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.broadcast;
|
||||
35
src/org/wanxp/douban/sync/handler/DoubanMovieSyncHandler.ts
Normal file
35
src/org/wanxp/douban/sync/handler/DoubanMovieSyncHandler.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
|
||||
import {BasicConst, SyncType} from "../../../constant/Constsant";
|
||||
import {SyncConfig} from "../model/SyncConfig";
|
||||
import HandleContext from "../../data/model/HandleContext";
|
||||
import DoubanSubjectLoadHandler from "../../data/handler/DoubanSubjectLoadHandler";
|
||||
import DoubanMovieLoadHandler from "../../data/handler/DoubanMovieLoadHandler";
|
||||
import DoubanMovieSubject from "../../data/model/DoubanMovieSubject";
|
||||
import DoubanPlugin from "../../../main";
|
||||
import {SubjectListItem} from "../../data/model/SubjectListItem";
|
||||
import DoubanMovieCollectListHandler from "./list/DoubanMovieCollectListHandler";
|
||||
import {DoubanListHandler} from "./list/DoubanListHandler";
|
||||
import DoubanMovieWishListHandler from "./list/DoubanMovieWishListHandler";
|
||||
import DoubanMovieDoListHandler from "./list/DoubanMovieDoListHandler";
|
||||
import TimeUtil, {sleepRange} from "../../../utils/TimeUtil";
|
||||
import {log} from "../../../utils/Logutil";
|
||||
|
||||
//TODO will support in future version
|
||||
export class DoubanMovieSyncHandler extends DoubanAbstractSyncHandler<DoubanMovieSubject>{
|
||||
|
||||
constructor(plugin:DoubanPlugin) {
|
||||
super(plugin, new DoubanMovieLoadHandler(plugin),[
|
||||
new DoubanMovieCollectListHandler(),
|
||||
new DoubanMovieWishListHandler(),
|
||||
new DoubanMovieDoListHandler()]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.movie;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
25
src/org/wanxp/douban/sync/handler/DoubanMusicSyncHandler.ts
Normal file
25
src/org/wanxp/douban/sync/handler/DoubanMusicSyncHandler.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import {DoubanAbstractSyncHandler} from "./DoubanAbstractSyncHandler";
|
||||
import DoubanPlugin from "../../../main";
|
||||
import {SyncType} from "../../../constant/Constsant";
|
||||
import DoubanMusicSubject from "../../data/model/DoubanMusicSubject";
|
||||
import DoubanMusicCollectListHandler from "./list/DoubanMusicCollectListHandler";
|
||||
import DoubanMusicLoadHandler from "../../data/handler/DoubanMusicLoadHandler";
|
||||
import DoubanMusicWishListHandler from "./list/DoubanMusicWishListHandler";
|
||||
import DoubanMusicDoListHandler from "./list/DoubanMusicDoListHandler";
|
||||
|
||||
//TODO will support in future version
|
||||
export class DoubanMusicSyncHandler extends DoubanAbstractSyncHandler<DoubanMusicSubject> {
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.music;
|
||||
}
|
||||
|
||||
constructor(plugin: DoubanPlugin) {
|
||||
super(plugin, new DoubanMusicLoadHandler(plugin), [
|
||||
new DoubanMusicCollectListHandler(),
|
||||
new DoubanMusicWishListHandler(),
|
||||
new DoubanMusicDoListHandler()]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,13 +1,14 @@
|
||||
import {CheerioAPI} from "cheerio";
|
||||
import {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<DoubanNoteSubject> {
|
||||
|
||||
getSyncType(): SyncType {
|
||||
return SyncType.note;
|
||||
@ -1,13 +1,18 @@
|
||||
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<DoubanSubject> {
|
||||
|
||||
constructor(plugin:DoubanPlugin) {
|
||||
super(plugin, new DoubanOtherLoadHandler(plugin),[]);
|
||||
}
|
||||
|
||||
|
||||
getSyncType(): SyncType {
|
||||
throw new Error("暂不支持同步这类型的数据");
|
||||
@ -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
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
];
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import {DoubanBookListHandler} from "./DoubanBookListHandler";
|
||||
|
||||
|
||||
export default class DoubanBookCollectListHandler extends DoubanBookListHandler{
|
||||
getDoType(): string {
|
||||
return DoubanSubjectState.collect;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanBookListHandler } from "./DoubanBookListHandler";
|
||||
|
||||
|
||||
export default class DoubanBookDoListHandler extends DoubanBookListHandler{
|
||||
getDoType(): string {
|
||||
return DoubanSubjectState.do;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
import DoubanAbstractListHandler from "./DoubanAbstractListHandler";
|
||||
import { SyncType} from "../../../../constant/Constsant";
|
||||
|
||||
export abstract class DoubanBookListHandler extends DoubanAbstractListHandler {
|
||||
getSyncType(): string {
|
||||
return SyncType.book;
|
||||
}
|
||||
|
||||
abstract getDoType(): string;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanBookListHandler } from "./DoubanBookListHandler";
|
||||
|
||||
|
||||
export default class DoubanBookWishListHandler extends DoubanBookListHandler{
|
||||
getDoType(): string {
|
||||
return DoubanSubjectState.wish;
|
||||
}
|
||||
|
||||
}
|
||||
10
src/org/wanxp/douban/sync/handler/list/DoubanListHandler.ts
Normal file
10
src/org/wanxp/douban/sync/handler/list/DoubanListHandler.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import HandleContext from "../../../data/model/HandleContext";
|
||||
import {SubjectListItem} from "../../../data/model/SubjectListItem";
|
||||
import {SyncConfig} from "../../model/SyncConfig";
|
||||
|
||||
export interface DoubanListHandler {
|
||||
|
||||
getAllPageList(context: HandleContext):Promise<SubjectListItem[]>;
|
||||
|
||||
support(config:SyncConfig):boolean;
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
import { DoubanSubjectState} from "src/constant/DoubanUserState";
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanMovieListHandler } from "./DoubanMovieListHandler";
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { DoubanSubjectState} from "src/constant/DoubanUserState";
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanMovieListHandler } from "./DoubanMovieListHandler";
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import DoubanAbstractListHandler from "@App/sync/handler/list/DoubanAbstractListHandler";
|
||||
import DoubanAbstractListHandler from "./DoubanAbstractListHandler";
|
||||
import { SyncType} from "../../../../constant/Constsant";
|
||||
|
||||
export abstract class DoubanMovieListHandler extends DoubanAbstractListHandler {
|
||||
@ -1,4 +1,4 @@
|
||||
import { DoubanSubjectState} from "src/constant/DoubanUserState";
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanMovieListHandler } from "./DoubanMovieListHandler";
|
||||
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanMusicListHandler } from "./DoubanMusicListHandler";
|
||||
|
||||
|
||||
export default class DoubanMusicCollectListHandler extends DoubanMusicListHandler{
|
||||
getDoType(): string {
|
||||
return DoubanSubjectState.collect;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import { DoubanMusicListHandler } from "./DoubanMusicListHandler";
|
||||
|
||||
|
||||
export default class DoubanMusicDoListHandler extends DoubanMusicListHandler{
|
||||
getDoType(): string {
|
||||
return DoubanSubjectState.do;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
import DoubanAbstractListHandler from "./DoubanAbstractListHandler";
|
||||
import { SyncType} from "../../../../constant/Constsant";
|
||||
|
||||
export abstract class DoubanMusicListHandler extends DoubanAbstractListHandler {
|
||||
getSyncType(): string {
|
||||
return SyncType.music;
|
||||
}
|
||||
|
||||
abstract getDoType(): string;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
import { DoubanSubjectState} from "src/org/wanxp/constant/DoubanUserState";
|
||||
import {DoubanMusicListHandler} from "./DoubanMusicListHandler";
|
||||
|
||||
|
||||
export default class DoubanMusicWishListHandler extends DoubanMusicListHandler{
|
||||
getDoType(): string {
|
||||
return DoubanSubjectState.wish;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
import DoubanSubject from 'src/douban/data/model/DoubanSubject';
|
||||
import DoubanSubject from 'src/org/wanxp/douban/data/model/DoubanSubject';
|
||||
|
||||
export default class DoubanPageBroadcastSubject extends DoubanSubject {
|
||||
pageNumber: number;
|
||||
32
src/org/wanxp/douban/sync/model/GlobalSyncStatusHolder.ts
Normal file
32
src/org/wanxp/douban/sync/model/GlobalSyncStatusHolder.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import {SyncConfig} from "./SyncConfig";
|
||||
import {SyncItemStatus} from "../../../constant/Constsant";
|
||||
|
||||
export default class GlobalSyncStatusHolder {
|
||||
public syncConfig: SyncConfig;
|
||||
private total:number;
|
||||
private handle:number;
|
||||
private startTime:number;
|
||||
|
||||
constructor(syncConfig: SyncConfig) {
|
||||
this.syncConfig = syncConfig;
|
||||
this.startTime = new Date().getTime();
|
||||
this.total = 0;
|
||||
this.handle = 0;
|
||||
}
|
||||
|
||||
handled(num:number) {
|
||||
this.handle = this.handle + num;
|
||||
}
|
||||
|
||||
totalNum(num:number) {
|
||||
this.total = num ;
|
||||
}
|
||||
|
||||
getTotal():number {
|
||||
return this.total;
|
||||
}
|
||||
|
||||
getHandle():number {
|
||||
return this.handle;
|
||||
}
|
||||
}
|
||||
@ -2,4 +2,5 @@ export interface SyncConfig {
|
||||
syncType: string,
|
||||
scope: string,
|
||||
force:boolean,
|
||||
outputFolder:string;
|
||||
}
|
||||
7
src/org/wanxp/douban/sync/model/SyncItemResult.ts
Normal file
7
src/org/wanxp/douban/sync/model/SyncItemResult.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import {SyncItemStatus} from "../../../constant/Constsant";
|
||||
|
||||
export interface SyncItemResult {
|
||||
id:string,
|
||||
title:string,
|
||||
status:SyncItemStatus,
|
||||
}
|
||||
56
src/org/wanxp/douban/sync/model/SyncStatusHolder.ts
Normal file
56
src/org/wanxp/douban/sync/model/SyncStatusHolder.ts
Normal file
@ -0,0 +1,56 @@
|
||||
import {SyncConfig} from "./SyncConfig";
|
||||
import GlobalSyncStatusHolder from "./GlobalSyncStatusHolder";
|
||||
import {SyncItemResult} from "./SyncItemResult";
|
||||
import {SyncItemStatus} from "../../../constant/Constsant";
|
||||
import GlobalStatusHolder from "../../model/GlobalStatusHolder";
|
||||
|
||||
export default class SyncStatusHolder extends GlobalSyncStatusHolder{
|
||||
|
||||
private syncResultMap: Map<string, SyncItemResult> = new Map();
|
||||
private statusHandleMap: Map<SyncItemStatus, number> = new Map([
|
||||
[SyncItemStatus.exists, 0],
|
||||
[SyncItemStatus.replace, 0],
|
||||
[SyncItemStatus.create, 0],
|
||||
[SyncItemStatus.fail, 0],
|
||||
]);
|
||||
private globalStatus:GlobalStatusHolder;
|
||||
|
||||
|
||||
constructor(syncConfig: SyncConfig, globalStatus: GlobalStatusHolder) {
|
||||
super(syncConfig)
|
||||
this.globalStatus = globalStatus;
|
||||
}
|
||||
|
||||
public replace(id:string, title:string) {
|
||||
this.updateResult(id, title, SyncItemStatus.replace);
|
||||
}
|
||||
|
||||
public exists(id:string, title:string) {
|
||||
this.updateResult(id, title, SyncItemStatus.exists);
|
||||
}
|
||||
|
||||
public create(id:string, title:string) {
|
||||
this.updateResult(id, title, SyncItemStatus.create);
|
||||
}
|
||||
|
||||
public fail(id:string, title:string) {
|
||||
this.updateResult(id, title, SyncItemStatus.fail);
|
||||
}
|
||||
|
||||
private updateResult(id:string, title:string, status:SyncItemStatus) {
|
||||
this.syncResultMap.set(id, {id: id,title:title,status:status});
|
||||
this.statusHandleMap.set(status, this.statusHandleMap.get(status) + 1);
|
||||
super.handled(1);
|
||||
if (this.globalStatus.syncing()) {
|
||||
this.globalStatus.syncStatus.handled(1);
|
||||
}
|
||||
}
|
||||
|
||||
public setTotal(total:number) {
|
||||
super.totalNum(total);
|
||||
this.globalStatus.syncStatus.totalNum(total);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -1,14 +1,14 @@
|
||||
import SettingsManager from "@App/setting/SettingsManager";
|
||||
import {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;
|
||||
@ -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,7 +120,6 @@ 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
|
||||
@ -135,9 +135,40 @@ export default class FileHandler {
|
||||
const leaf = this._app.workspace.splitLeafOrActive();
|
||||
await leaf.openFile(File);
|
||||
}
|
||||
} catch (error) {
|
||||
log.error(error.toString(), error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles creating the new note
|
||||
* A new markdown file will be created at the given file path (`input`)
|
||||
* in the specified parent folder (`this.folder`)
|
||||
* return ture if exists
|
||||
*/
|
||||
async createOrReplaceNewNoteWithData(originalFilePath: string, data:string, showAfterSuccess:boolean=false): Promise<boolean> {
|
||||
const {vault} = this._app;
|
||||
const {adapter} = vault;
|
||||
const prependDirInput = FileUtil.join("", originalFilePath);
|
||||
const {dir, name} = FileUtil.parse(prependDirInput);
|
||||
const filePath = FileUtil.join(dir, `${name}.md`);
|
||||
|
||||
const fileExists = await adapter.exists(filePath);
|
||||
let File:TFile = null;
|
||||
if (fileExists) {
|
||||
File = vault.getMarkdownFiles().find(f => f.path == filePath);
|
||||
await vault.modify(File, data);
|
||||
}else {
|
||||
if (dir !== '') {
|
||||
// If `input` includes a directory part, create it
|
||||
await this.createDirectory(dir);
|
||||
}
|
||||
File = await vault.create(filePath, data);
|
||||
}
|
||||
|
||||
// Create the file and open it in the active leaf
|
||||
if (showAfterSuccess) {
|
||||
const leaf = this._app.workspace.splitLeafOrActive();
|
||||
await leaf.openFile(File);
|
||||
}
|
||||
return fileExists;
|
||||
}
|
||||
|
||||
async getFileContent(filePath: string | undefined): Promise<string> {
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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`,
|
||||
|
||||
|
||||
@ -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': `电影`,
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user