add subject user rate info

This commit is contained in:
wanxp 2022-11-08 23:55:09 +08:00
parent 1f30482542
commit d212be5a75
11 changed files with 91 additions and 12 deletions

@ -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',
}

@ -1,6 +1,3 @@
import {PersonNameMode} from "./Constsant";
import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting";
export const doubanHeaders = {

@ -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();
}
});

@ -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<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
@ -128,22 +130,36 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
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<T extends DoubanSubject>
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;
}
}

@ -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<string, string> = new Map([

@ -0,0 +1,9 @@
import {DoubanSubjectState} from "../../../constant/Constsant";
export interface UserStateSubject {
tags: string[];
rate: number;
state: DoubanSubjectState;
comment: string;
collectionDate: Date;
}

@ -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())));
;
};

@ -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', '');
});
});
}

@ -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())));
;
};

@ -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}'...`,

@ -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获取帮助`,