diff --git a/manifest.json b/manifest.json index 6f533ed..f662352 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-douban-plugin", "name": "Douban", - "version": "v1.6.0", + "version": "v1.6.1", "minAppVersion": "0.12.0", "description": "This is a plugin that can import movies/books/musics/notes/games info data from Douban for Obsidian .", "author": "Wanxp", diff --git a/package.json b/package.json index 00d3012..ea8214b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-douban-plugin", - "version": "v1.6.0", + "version": "v1.6.1", "description": "This is a plugin for Obsidian (https://obsidian.md) that can import data from Douban (https://www.douban.com/).", "main": "main.js", "scripts": { diff --git a/src/constant/DefaultSettings.ts b/src/constant/DefaultSettings.ts index 79b2653..0a7a146 100644 --- a/src/constant/DefaultSettings.ts +++ b/src/constant/DefaultSettings.ts @@ -3,7 +3,6 @@ import {PersonNameMode, SupportType} from "./Constsant"; import {doubanHeaders} from "./Douban"; export const DEFAULT_SETTINGS: DoubanPluginSetting = { - //以后会被移除 movieTemplateFile: ``, bookTemplateFile: ``, musicTemplateFile: ``, @@ -27,4 +26,5 @@ export const DEFAULT_SETTINGS: DoubanPluginSetting = { {name: 'myType', value: 'game', field: SupportType.GAME}, {name: 'myType', value: 'teleplay', field: SupportType.TELEPLAY}, ], + loginCookiesContent: '', } diff --git a/src/douban/component/DoubanLoginModel.ts b/src/douban/component/DoubanLoginModel.ts new file mode 100644 index 0000000..c35d1c1 --- /dev/null +++ b/src/douban/component/DoubanLoginModel.ts @@ -0,0 +1,67 @@ +import { Notice } from 'obsidian'; +import { log } from 'src/utils/Logutil'; +import {i18nHelper} from "../../lang/helper"; +import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; +import SettingsManager from "@App/setting/SettingsManager"; +import {constructDoubanTokenSettingsUI, constructLoginSettingsUI} from "@App/setting/BasicSettingsHelper"; + +// Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin + + +export default class DoubanLoginModel { + private modal: any; + private containerEl: HTMLElement; + private settingsManager: SettingsManager; + constructor(containerEl: HTMLElement, settingsManager: SettingsManager) { + this.containerEl = containerEl; + this.settingsManager = settingsManager; + log.info('初始化登录页面'); + + 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('100101')); + this.modal.show(); + }); + + const session = this.modal.webContents.session; + const filter = { + urls: ['https://www.douban.com/'] + }; + session.webRequest.onSendHeaders(filter, (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.settingsManager.updateSetting('loginCookiesContent', cookieArr); + constructDoubanTokenSettingsUI(containerEl, settingsManager); + this.modal.close(); + } else { + this.modal.reload(); + } + }); + } + + private parseCookies(cookies: any) { + return cookies; + } + + async doLogin() { + try { + await this.modal.loadURL('https://accounts.douban.com/passport/login'); + } catch (error) { + log.error('加载豆瓣登录页面失败') + } + } + + onClose() { + this.modal.close(); + } +} diff --git a/src/douban/component/DoubanLogoutModel.ts b/src/douban/component/DoubanLogoutModel.ts new file mode 100644 index 0000000..5da6c04 --- /dev/null +++ b/src/douban/component/DoubanLogoutModel.ts @@ -0,0 +1,48 @@ +import {DoubanSettingTab} from "@App/setting/DoubanSettingTab"; +import {i18nHelper} from "../../lang/helper"; +import SettingsManager from "@App/setting/SettingsManager"; +import {constructDoubanTokenSettingsUI, constructLoginSettingsUI} from "@App/setting/BasicSettingsHelper"; +import {log} from "../../utils/Logutil"; + +// Credits go to zhaohongxuan's Weread Plugin : https://github.com/zhaohongxuan/obsidian-weread-plugin + + +export default class DoubanLogoutModel { + private modal: any; + private containerEl: HTMLElement; + private settingsManager: SettingsManager; + constructor(containerEl: HTMLElement, settingsManager: SettingsManager) { + 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('100101')); + this.modal.show(); + }); + const session = this.modal.webContents.session; + const filter = { + urls: ['https://www.douban.com/accounts/logout'] + }; + session.webRequest.onCompleted(filter, (details:any) => { + log.info('已请求登出成功:'); + if (details.statusCode == 200) { + this.settingsManager.updateSetting('loginCookiesContent', ''); + constructDoubanTokenSettingsUI(containerEl, settingsManager); + this.modal.close(); + } + }); + } + + async doLogout() { + await this.modal.loadURL('https://www.douban.com/logout'); + } + + onClose() { + this.modal.close(); + } +} diff --git a/src/douban/data/search/Search.ts b/src/douban/data/search/Search.ts index a3b52c8..3b5ce3c 100644 --- a/src/douban/data/search/Search.ts +++ b/src/douban/data/search/Search.ts @@ -6,11 +6,12 @@ import {request, RequestUrlParam} from "obsidian"; import {i18nHelper} from "../../../lang/helper"; import {load} from 'cheerio'; import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; +import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; export default class Searcher { static search(searchItem: string, doubanSettings: DoubanPluginSetting): Promise { let requestUrlParam: RequestUrlParam = { - url: doubanSettings.searchUrl + searchItem, + url: DEFAULT_SETTINGS.searchUrl + searchItem, method: "GET", headers: JSON.parse(doubanSettings.searchHeaders), throw: true diff --git a/src/douban/setting/BasicSettingsHelper.ts b/src/douban/setting/BasicSettingsHelper.ts index ab1b3cb..e81eed3 100644 --- a/src/douban/setting/BasicSettingsHelper.ts +++ b/src/douban/setting/BasicSettingsHelper.ts @@ -1,48 +1,16 @@ import {i18nHelper} from "../../lang/helper"; -import {Setting} from "obsidian"; +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 { log } from "src/utils/Logutil"; export function constructBasicUI(containerEl: HTMLElement, manager: SettingsManager) { containerEl.createEl('h3', { text: i18nHelper.getMessage('1210') }); - new Setting(containerEl).setName(i18nHelper.getMessage('120001')) - .then((setting) => { - setting.addText((textField) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('120002')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('120003')); - frag.createEl( - 'a', - { - text: i18nHelper.getMessage('120901'), - href: 'https://www.douban.com', - }, - (a) => { - a.setAttr('target', '_blank'); - } - ); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('120004')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('120005')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('120006')); - frag.createEl('br'); - }) - ); - textField.inputEl.addClass("obsidian_douban_settings_textField"); - textField - .setPlaceholder(DEFAULT_SETTINGS.searchUrl) - .setValue(manager.plugin.settings.searchUrl) - .onChange(async (value) => { - manager.plugin.settings.searchUrl = value; - await manager.plugin.saveSettings(); - }); - - }); - }); + // containerEl.createDiv('login-setting', (loginSettingEl) => { + // constructDoubanTokenSettingsUI(loginSettingEl, manager); + // }); new Setting(containerEl).setName(i18nHelper.getMessage('120501')).then((setting) => { setting.addMomentFormat((mf) => { @@ -127,3 +95,76 @@ export function constructBasicUI(containerEl: HTMLElement, manager: SettingsMana }); }); } + +export function constructDoubanTokenSettingsUI(containerEl: HTMLElement, manager: SettingsManager) { + let cookie = manager.getSetting('loginCookiesContent'); + containerEl.empty(); + if (Platform.isDesktopApp) { + if(cookie) { + constructHasLoginSettingsUI(containerEl, manager); + }else { + constructLoginSettingsUI(containerEl, manager); + } + } else { + if(cookie) { + showMobileLogout(containerEl, manager); + }else { + showMobileLogin(containerEl, manager); + } + } + + +} + + +export function constructLoginSettingsUI(containerEl: HTMLElement, manager: SettingsManager) { + new Setting(containerEl).setName('登录豆瓣').addButton((button) => { + return button + .setButtonText('登录') + .setCta() + .onClick(async () => { + button.setDisabled(true); + const loginModel = new DoubanLoginModel(containerEl, manager); + await loginModel.doLogin(); + }); + }); +} + +export function constructHasLoginSettingsUI(containerEl: HTMLElement, manager: SettingsManager) { + new Setting(containerEl) + .setName('豆瓣用户信息') + .setDesc('已登录') + .addButton((button) => { + return button + .setButtonText('登出') + .setCta() + .onClick(async () => { + button.setDisabled(true); + const loginModel = new DoubanLogoutModel(containerEl, manager); + await loginModel.doLogout(); + // manager.updateSetting('loginCookiesContent', ''); + }); + }); +} + +function showMobileLogin(containerEl: HTMLElement, manager: SettingsManager) { + new Setting(containerEl) + .setName('豆瓣用户信息') + .setDesc('豆瓣未登录,请先在电脑端登录!') +} + +function showMobileLogout(containerEl: HTMLElement, manager: SettingsManager) { + new Setting(containerEl) + .setName('豆瓣用户信息') + .setDesc('已登录') + .addButton((button) => { + return button + .setButtonText('登出') + .setCta() + .onClick(async () => { + manager.updateSetting('loginCookiesContent', ''); + constructDoubanTokenSettingsUI(containerEl, manager); + }); + }); +} + diff --git a/src/douban/setting/SettingsManager.ts b/src/douban/setting/SettingsManager.ts index 284dfe9..7f44173 100644 --- a/src/douban/setting/SettingsManager.ts +++ b/src/douban/setting/SettingsManager.ts @@ -2,10 +2,6 @@ import {App, Setting} from "obsidian"; import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; import DoubanPlugin from "../../../main"; import { DoubanPluginSetting } from "./model/DoubanPluginSetting"; -import {createFileSelectionSetting, createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper"; -import {i18nHelper} from "../../lang/helper"; -import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant"; -import {constructBasicUI} from "@App/setting/BasicSettingsHelper"; export default class SettingsManager { app: App; @@ -19,11 +15,16 @@ export default class SettingsManager { this.settings = plugin.settings; } - getSetting(key: keyof DoubanPluginSetting) { + getSettingWithDefault(key: keyof DoubanPluginSetting) { return [this.settings[key], DEFAULT_SETTINGS[key]]; } + getSetting(key: keyof DoubanPluginSetting) { + + return this.settings[key]; + } + async updateSetting(key: keyof DoubanPluginSetting, value:any) { diff --git a/src/douban/setting/TemplateSettingHelper.ts b/src/douban/setting/TemplateSettingHelper.ts index 98a9b54..5492c6e 100644 --- a/src/douban/setting/TemplateSettingHelper.ts +++ b/src/douban/setting/TemplateSettingHelper.ts @@ -29,7 +29,7 @@ export function createFileSelectionSetting({name, desc, placeholder, key, manage // @ts-ignore setting.setDesc(i18nHelper.getMessage(desc)); setting.addSearch(async (search: SearchComponent) => { - const [oldValue, defaultVal] = manager.getSetting(key); + const [oldValue, defaultVal] = manager.getSettingWithDefault(key); let v = defaultVal; if (oldValue) { v = oldValue; @@ -65,7 +65,7 @@ export function createFolderSelectionSetting({ // @ts-ignore setting.setDesc( i18nHelper.getMessage(desc)); setting.addSearch(async (search: SearchComponent) => { - const [oldValue, defaultVal] = manager.getSetting(key); + const [oldValue, defaultVal] = manager.getSettingWithDefault(key); let v = defaultVal; if (oldValue) { v = oldValue; diff --git a/src/douban/setting/model/DoubanPluginSetting.ts b/src/douban/setting/model/DoubanPluginSetting.ts index c062e4a..adfba85 100644 --- a/src/douban/setting/model/DoubanPluginSetting.ts +++ b/src/douban/setting/model/DoubanPluginSetting.ts @@ -17,5 +17,6 @@ export interface DoubanPluginSetting { dataFileNamePath: string, statusBar: boolean, customProperties: CustomProperty[], + loginCookiesContent: string, } diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index c8e2f8b..3ba77ee 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -22,6 +22,9 @@ export default { '120005': `The redirected web page address is the search address,`, '120006': `Just copy the web address to the current input box.`, + '100101': `Login Douban`, + + '1210': `Basic Setting`, '1203': `Template Setting`, '1220': `Output Setting`, diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 99399bb..6b516d7 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -13,6 +13,7 @@ export default { '110201': `{0} 文件已经存在.`, '110202': `{0} 模板文件无法读取`, + '100101': `登录豆瓣`, //DoubanSettingTab '1201': `Obsidian-豆瓣`, diff --git a/src/utils/Logutil.ts b/src/utils/Logutil.ts index 93077e7..7713aac 100644 --- a/src/utils/Logutil.ts +++ b/src/utils/Logutil.ts @@ -16,7 +16,7 @@ class Logger { } public info(e: any): any { - // console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); return e; } diff --git a/versions.json b/versions.json index 2a2419c..bf9af63 100644 --- a/versions.json +++ b/versions.json @@ -11,5 +11,6 @@ "v1.5.0": "0.12.0", "v1.5.1": "0.12.0", "v1.5.2": "0.12.0", - "v1.6.0": "0.12.0" + "v1.6.0": "0.12.0", + "v1.6.1": "0.12.0" }