From d212be5a757f3aee55947854cff991819372d4ba Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Tue, 8 Nov 2022 23:55:09 +0800 Subject: [PATCH] add subject user rate info --- src/constant/Constsant.ts | 8 +++ src/constant/Douban.ts | 3 - src/douban/component/DoubanLogoutModel.ts | 4 +- .../data/handler/DoubanAbstractLoadHandler.ts | 64 ++++++++++++++++++- src/douban/data/model/DoubanSubject.ts | 3 + src/douban/data/model/UserStateSubject.ts | 9 +++ src/douban/data/search/Search.ts | 2 +- src/douban/setting/BasicSettingsHelper.ts | 1 - src/douban/user/UserComponent.ts | 2 +- src/lang/locale/en.ts | 3 +- src/lang/locale/zh-cn.ts | 4 +- 11 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 src/douban/data/model/UserStateSubject.ts diff --git a/src/constant/Constsant.ts b/src/constant/Constsant.ts index c89bb37..6dc7ff5 100644 --- a/src/constant/Constsant.ts +++ b/src/constant/Constsant.ts @@ -71,3 +71,11 @@ export const PersonNameModeRecords: { [key in PersonNameMode]: string } = { [PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'), } +export enum DoubanSubjectState { + NOT = 'have_not_watched', + WANTED = 'wanted', + DOING = 'watching', + HAS = 'watched', + UNKNOWN = 'unknown', +} + diff --git a/src/constant/Douban.ts b/src/constant/Douban.ts index 3090d00..d637f14 100644 --- a/src/constant/Douban.ts +++ b/src/constant/Douban.ts @@ -1,6 +1,3 @@ -import {PersonNameMode} from "./Constsant"; -import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; - export const doubanHeaders = { diff --git a/src/douban/component/DoubanLogoutModel.ts b/src/douban/component/DoubanLogoutModel.ts index 63efde0..144666b 100644 --- a/src/douban/component/DoubanLogoutModel.ts +++ b/src/douban/component/DoubanLogoutModel.ts @@ -10,8 +10,10 @@ import {log} from "../../utils/Logutil"; export default class DoubanLogoutModel { private modal: any; private settingsManager: SettingsManager; + private containerEl: HTMLElement; constructor(containerEl: HTMLElement, settingsManager: SettingsManager) { this.settingsManager = settingsManager; + this.containerEl = containerEl; const { remote } = require('electron'); const { BrowserWindow: RemoteBrowserWindow } = remote; this.modal = new RemoteBrowserWindow({ @@ -31,7 +33,7 @@ export default class DoubanLogoutModel { session.webRequest.onCompleted(filter, (details:any) => { if (details.statusCode == 200) { this.settingsManager.plugin.userComponent.logout(); - constructDoubanTokenSettingsUI(containerEl, settingsManager); + constructDoubanTokenSettingsUI(this.containerEl, this.settingsManager); this.modal.close(); } }); diff --git a/src/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/douban/data/handler/DoubanAbstractLoadHandler.ts index d86af78..f5264de 100644 --- a/src/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -8,6 +8,7 @@ import {CheerioAPI, load} from "cheerio"; import YamlUtil from "../../../utils/YamlUtil"; import { BasicConst, + DoubanSubjectState, PersonNameMode, SearchHandleMode, SupportType, @@ -19,6 +20,7 @@ import HandleResult from "@App/data/model/HandleResult"; import {getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent"; import StringUtil from "../../../utils/StringUtil"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; +import {UserStateSubject} from "@App/data/model/UserStateSubject"; export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { @@ -128,22 +130,36 @@ export default abstract class DoubanAbstractLoadHandler abstract support(extract: DoubanSubject): boolean; handle(url: string, context: HandleContext): void { + let headers = JSON.parse(this.doubanPlugin.settings.searchHeaders); + headers.Cookie = this.doubanPlugin.settings.loginCookiesContent; + console.log(JSON.stringify(headers)) const requestUrlParam: RequestUrlParam = { url: url, method: "GET", - headers: JSON.parse(this.doubanPlugin.settings.searchHeaders), + headers: headers, throw: true }; request(requestUrlParam) + .then((response) => {console.log(response.toString());return response}) .then(load) - .then(this.parseSubjectFromHtml) + .then(this.analysisUserState) + .then(({data, userState}) => { + let sub = this.parseSubjectFromHtml(data); + sub.userState = userState; + return sub; + }) .then(content => this.toEditor(context, content)) // .then(content => content ? editor.replaceSelection(content) : content) - .catch(e => log.error(i18nHelper.getMessage('130101'))) + .catch(e => log + .error( + i18nHelper.getMessage('130101') + .replace('{0}', e.toString()) + )); ; } + abstract parseSubjectFromHtml(data: CheerioAPI): T | undefined; toEditor(context: HandleContext, extract: T): T { @@ -287,4 +303,46 @@ export default abstract class DoubanAbstractLoadHandler return val ? val : defaultContent; } } + + analysisUserState(html: CheerioAPI): {data:CheerioAPI , userState: UserStateSubject} { + if(!html('.nav-user-account')) { + return null; + } + let rate = html(html('input#n_rating').get(0)).val(); + let tagsStr = html(html('div#interest_sect_level > div.a_stars > span.color_gray').get(0)).text().trim(); + let tags = tagsStr.replace('标签:', '').split(' '); + let stateWord = html(html('div#interest_sect_level > div.a_stars > span.mr10').get(0)).text().trim(); + let collectionDateStr = html(html('div#interest_sect_level > div.a_stars > span.mr10 > span.collection_date').get(0)).text().trim(); + let userState1 = DoubanAbstractLoadHandler.getUserState(stateWord); + let component = html(html('div#interest_sect_level > div.a_stars > span.color_gray').get(0)).next().next().text().trim(); + + + const userState: UserStateSubject = { + tags: tags, + rate: rate?Number(rate):null, + state: userState1, + collectionDate: collectionDateStr?moment(collectionDateStr, 'YYYY-MM-DD').toDate():null, + comment: component + } + return {data: html, userState: userState}; + } + + + public static getUserState(stateWord:string):DoubanSubjectState { + let state:DoubanSubjectState; + if(!stateWord) { + return DoubanSubjectState.UNKNOWN; + } + if(stateWord.indexOf('想')>=0 ) { + state = DoubanSubjectState.WANTED; + }else if(stateWord.indexOf('在')>=0) { + state = DoubanSubjectState.DOING; + }else if(stateWord.indexOf('过')>=0) { + state = DoubanSubjectState.HAS; + }else { + state = DoubanSubjectState.NOT; + } + return state; + + } } diff --git a/src/douban/data/model/DoubanSubject.ts b/src/douban/data/model/DoubanSubject.ts index 6a64416..b8fa62d 100644 --- a/src/douban/data/model/DoubanSubject.ts +++ b/src/douban/data/model/DoubanSubject.ts @@ -1,3 +1,5 @@ +import {UserStateSubject} from "@App/data/model/UserStateSubject"; + export default class DoubanSubject { id: string; title: string; @@ -9,6 +11,7 @@ export default class DoubanSubject { publisher: string; datePublished: Date; genre: string[]; + userState?: UserStateSubject; } const ParameterMap: Map = new Map([ diff --git a/src/douban/data/model/UserStateSubject.ts b/src/douban/data/model/UserStateSubject.ts new file mode 100644 index 0000000..b00707d --- /dev/null +++ b/src/douban/data/model/UserStateSubject.ts @@ -0,0 +1,9 @@ +import {DoubanSubjectState} from "../../../constant/Constsant"; + +export interface UserStateSubject { + tags: string[]; + rate: number; + state: DoubanSubjectState; + comment: string; + collectionDate: Date; +} diff --git a/src/douban/data/search/Search.ts b/src/douban/data/search/Search.ts index 3b5ce3c..13b4aac 100644 --- a/src/douban/data/search/Search.ts +++ b/src/douban/data/search/Search.ts @@ -19,7 +19,7 @@ export default class Searcher { return request(requestUrlParam) .then(load) .then(SearchParserHandler.parseSearch) - .catch(e => log.error(i18nHelper.getMessage('130101'))) + .catch(e => log.error(i18nHelper.getMessage('130101').replace('{0}', e.toString()))); ; }; diff --git a/src/douban/setting/BasicSettingsHelper.ts b/src/douban/setting/BasicSettingsHelper.ts index d4b6e17..403693e 100644 --- a/src/douban/setting/BasicSettingsHelper.ts +++ b/src/douban/setting/BasicSettingsHelper.ts @@ -150,7 +150,6 @@ export function constructHasLoginSettingsUI(containerEl: HTMLElement, manager: S const loginModel = new DoubanLogoutModel(containerEl, manager); await loginModel.doLogout(); button.setDisabled(false); - // manager.updateSetting('loginCookiesContent', ''); }); }); } diff --git a/src/douban/user/UserComponent.ts b/src/douban/user/UserComponent.ts index a47b84e..8dbbc27 100644 --- a/src/douban/user/UserComponent.ts +++ b/src/douban/user/UserComponent.ts @@ -78,7 +78,7 @@ export default class UserComponent { return request(requestUrlParam) .then(load) .then(this.getUserInfo) - .catch(e => log.error(i18nHelper.getMessage('130101'))) + .catch(e => log.error(i18nHelper.getMessage('130101').replace('{0}', e.toString()))); ; }; diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index eb788b8..6c5ba84 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -23,6 +23,7 @@ export default { '120006': `Just copy the web address to the current input box.`, '100101': `Login Douban`, + '100111': `Douban login info Expired, please login again`, '1210': `Basic Setting`, @@ -134,7 +135,7 @@ export default { //error - '130101': `Fetch Data Error, You can go to Github add Issues`, + '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}'...`, diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 37e26ee..28d2f85 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -14,6 +14,8 @@ export default { '110202': `{0} 模板文件无法读取`, '100101': `登录豆瓣`, + '100111': `豆瓣登录信息过期,请至Douban插件重新登录`, + //DoubanSettingTab '1201': `Obsidian-豆瓣`, @@ -131,7 +133,7 @@ export default { '121901': `复制'默认'模板内容`, - '130101': `获取数据失败,您如有需要请至Github提交Issues`, + '130101': `获取数据失败,{0}`, '130102': `Obsidian Douban插件错误提示:`, '130103': `Obsidian Douban插件异常提示:`, '140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`,