From 007e85556ed0be9e4ffae672a321e332f10e38bf Mon Sep 17 00:00:00 2001 From: Orphee Uroboros Date: Thu, 23 Apr 2026 02:21:14 +0800 Subject: [PATCH] fix book user state fields --- .../data/handler/DoubanAbstractLoadHandler.ts | 2 +- .../data/handler/DoubanBookLoadHandler.ts | 68 ++++++++++++++++++- .../douban/data/model/UserStateSubject.ts | 1 + 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts index 7f36ff7..251947a 100644 --- a/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -381,7 +381,7 @@ export default abstract class DoubanAbstractLoadHandler DoubanUserParameterName.MY_STATE, DataValueType.string, userState.state, - this.getUserStateName(userState.state) + userState.stateName || this.getUserStateName(userState.state) )); } if (userState.rate) { diff --git a/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts index 64e2a36..ed52f25 100644 --- a/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts @@ -46,11 +46,11 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler div.a_stars > span.mr10').text().trim(); const collectionDateStr = html('div#interest_sect_level > div.a_stars > span.mr10').next().text().trim(); const userState1 = DoubanAbstractLoadHandler.getUserState(stateWord); + const stateName = this.getBookStateName(stateWord); const comment = this.getComment(html); @@ -58,12 +58,49 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler html(span).text().trim()) + .find(text => /^标签[::]/.test(text)); + if (!tagsText) { + return null; + } + const tags = tagsText + .replace(/^标签[::]/, '') + .trim() + .split(/\s+/) + .filter(tag => tag); + return tags.length > 0 ? tags : null; + } + + private getBookStateName(stateWord: string): string { + // Keep the internal wish/do/collect enum, but expose book-specific Chinese + // wording for {{myState}} so it does not depend on the plugin locale. + if (!stateWord) { + return ''; + } + if (stateWord.indexOf('想读') >= 0) { + return '想读'; + } + if (stateWord.indexOf('在读') >= 0) { + return '在读'; + } + if (stateWord.indexOf('读过') >= 0) { + return '读过'; + } + return ''; + } + parseSubjectFromHtml(html: CheerioAPI, context: HandleContext): DoubanBookSubject { let desc = html(".intro p").text(); @@ -133,13 +170,38 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler html(span).text().trim()) + .filter(text => this.isCommentCandidate(text)) + .pop(); if (comment) { return comment; } return this.getPropertyValue(html, PropertyName.comment); } + private isCommentCandidate(text: string): boolean { + if (!text) { + return false; + } + if (/^\d{4}-\d{2}-\d{2}$/.test(text)) { + return false; + } + if (/^标签[::]/.test(text)) { + return false; + } + if (/^(我的)?评价[::]?$/.test(text)) { + return false; + } + if (text.indexOf('我读过这本书') >= 0 || text.indexOf('我想读这本书') >= 0 || text.indexOf('我在读这本书') >= 0) { + return false; + } + return true; + } + } diff --git a/src/org/wanxp/douban/data/model/UserStateSubject.ts b/src/org/wanxp/douban/data/model/UserStateSubject.ts index cd0919c..80ea569 100644 --- a/src/org/wanxp/douban/data/model/UserStateSubject.ts +++ b/src/org/wanxp/douban/data/model/UserStateSubject.ts @@ -4,6 +4,7 @@ export interface UserStateSubject { tags: string[]; rate: number; state: DoubanSubjectState; + stateName?: string; comment: string; collectionDate: Date; }