From 5d288bda14f982908deecb839158401db0cedded Mon Sep 17 00:00:00 2001 From: HughWan <977741432@qq.com> Date: Thu, 21 Dec 2023 18:18:39 +0800 Subject: [PATCH] fix search by type error --- .../douban/data/search/DoubanSearchModal.ts | 8 ++-- ... => AllFirstPageSearchResultPageParser.ts} | 2 +- .../NotAllPageSearchResultPageParser.ts | 2 +- .../NoteFirstPageSearchResultPageParser.ts | 46 +++++++++++++++++++ .../search/parser/SearchResultPageParser.ts | 7 ++- .../searcher/AbstractSearchPageFetcher.ts | 2 +- .../searcher/BookPageSearchPageFetcher.ts | 2 +- .../searcher/GamePageSearchPageFetcher.ts | 13 ++++++ .../searcher/MusicPageSearchPageFetcher.ts | 13 ++++++ .../NoteFirstPageSearchPageFetcher.ts | 13 ++++++ .../searcher/NotePageSearchPageFetcher.ts | 15 ++++++ .../data/search/searcher/SearchPageFetcher.ts | 16 ++++++- .../searcher/SearchPageFetcherInterface.ts | 2 +- .../searcher/TheaterPageSearchPageFetcher.ts | 13 ++++++ src/org/wanxp/lang/locale/en.ts | 2 +- styles.css | 26 +++++++++-- 16 files changed, 164 insertions(+), 18 deletions(-) rename src/org/wanxp/douban/data/search/parser/{FistAllPageSearchResultPageParser.ts => AllFirstPageSearchResultPageParser.ts} (89%) create mode 100644 src/org/wanxp/douban/data/search/parser/NoteFirstPageSearchResultPageParser.ts create mode 100644 src/org/wanxp/douban/data/search/searcher/GamePageSearchPageFetcher.ts create mode 100644 src/org/wanxp/douban/data/search/searcher/MusicPageSearchPageFetcher.ts create mode 100644 src/org/wanxp/douban/data/search/searcher/NoteFirstPageSearchPageFetcher.ts create mode 100644 src/org/wanxp/douban/data/search/searcher/NotePageSearchPageFetcher.ts create mode 100644 src/org/wanxp/douban/data/search/searcher/TheaterPageSearchPageFetcher.ts diff --git a/src/org/wanxp/douban/data/search/DoubanSearchModal.ts b/src/org/wanxp/douban/data/search/DoubanSearchModal.ts index 6881fa3..8a5c2e4 100644 --- a/src/org/wanxp/douban/data/search/DoubanSearchModal.ts +++ b/src/org/wanxp/douban/data/search/DoubanSearchModal.ts @@ -27,7 +27,7 @@ export class DoubanSearchModal extends Modal { const searchInput = new TextComponent(inputs).onChange((searchTerm) => { this.searchTerm = searchTerm; }); - inputs.addClass("obsidian_douban_search_input"); + inputs.addClass("obsidian_douban_search_input_content"); searchInput.inputEl.size = 40; searchInput.inputEl.addEventListener("keydown", (event) => { @@ -35,6 +35,7 @@ export class DoubanSearchModal extends Modal { this.close(); } }); + inputs.addClass("obsidian_douban_search_input") const typeSelect = content.createDiv("type-select"); const typeSelectInput = new DropdownComponent(typeSelect) @@ -43,10 +44,11 @@ export class DoubanSearchModal extends Modal { .onChange((value:SupportType) => { this.searchType = value; }); - typeSelect.addClass('obsidian_douban_search_input'); + typeSelect.addClass('obsidian_douban_search_input_type'); const controls = contentEl.createDiv("controls"); + controls.addClass("obsidian_douban_search_controls") const searchButton = controls.createEl("button", { text: i18nHelper.getMessage('110004'), cls: "mod-cta", @@ -59,7 +61,7 @@ export class DoubanSearchModal extends Modal { searchButton.addEventListener("click", this.close.bind(this)); const cancelButton = controls.createEl("button", {text: i18nHelper.getMessage('110005')}); cancelButton.addEventListener("click", this.close.bind(this)); - cancelButton.addClass("obsidian_douban_search_button"); + cancelButton.addClass("obsidian_douban_cancel_button"); searchInput.inputEl.focus(); } diff --git a/src/org/wanxp/douban/data/search/parser/FistAllPageSearchResultPageParser.ts b/src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts similarity index 89% rename from src/org/wanxp/douban/data/search/parser/FistAllPageSearchResultPageParser.ts rename to src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts index 5a54364..2b6545a 100644 --- a/src/org/wanxp/douban/data/search/parser/FistAllPageSearchResultPageParser.ts +++ b/src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts @@ -3,7 +3,7 @@ import {SearchResultPageParserInterface} from "./SearchResultPageParserInterface import {SearchPage} from "../../model/SearchPage"; import SearchParserHandlerV2 from "../SearchParserV2"; -export class FistAllPageSearchResultPageParser implements SearchResultPageParserInterface { +export class AllFirstPageSearchResultPageParser implements SearchResultPageParserInterface { support(type:SupportType, pageNum:number):boolean { return pageNum == 1 && type == SupportType.ALL; } diff --git a/src/org/wanxp/douban/data/search/parser/NotAllPageSearchResultPageParser.ts b/src/org/wanxp/douban/data/search/parser/NotAllPageSearchResultPageParser.ts index d29c618..8b13a33 100644 --- a/src/org/wanxp/douban/data/search/parser/NotAllPageSearchResultPageParser.ts +++ b/src/org/wanxp/douban/data/search/parser/NotAllPageSearchResultPageParser.ts @@ -6,7 +6,7 @@ import SearchParserHandler from "../SearchParser"; export class NotAllPageSearchResultPageParser implements SearchResultPageParserInterface { support(type:SupportType, pageNum:number):boolean { - return type != SupportType.ALL; + return type != SupportType.ALL && !(pageNum ==1 && type == SupportType.NOTE); } parse(source:string, type:SupportType, pageNum:number, pageSize:number):SearchPage { log.debug("解析给多页面结果"); diff --git a/src/org/wanxp/douban/data/search/parser/NoteFirstPageSearchResultPageParser.ts b/src/org/wanxp/douban/data/search/parser/NoteFirstPageSearchResultPageParser.ts new file mode 100644 index 0000000..61cd897 --- /dev/null +++ b/src/org/wanxp/douban/data/search/parser/NoteFirstPageSearchResultPageParser.ts @@ -0,0 +1,46 @@ +import {SupportType} from "../../../../constant/Constsant"; +import {SearchResultPageParserInterface} from "./SearchResultPageParserInterface"; +import {SearchPage} from "../../model/SearchPage"; +import SearchParserHandlerV2 from "../SearchParserV2"; +import {load} from "cheerio"; +import DoubanSearchResultSubject from "../../model/DoubanSearchResultSubject"; + +export class NoteFirstPageSearchResultPageParser implements SearchResultPageParserInterface { + support(type:SupportType, pageNum:number):boolean { + return pageNum == 1 && type == SupportType.NOTE; + } + parse(source:string, type:SupportType, pageNum:number, pageSize:number):SearchPage { + const pageData = load(source); + if (!pageData) { + return SearchPage.empty(type); + } + const doubanSearchResultSubjects = pageData(".result") + .get() + .map(( item)=> { + const title = pageData(item).find("h3 a").text(); + const url = pageData(item).find("h3 a").attr("href"); + const id = url.match(/(\d){5,10}/g)[0] + const author = pageData(item).find(".info").text(); + const content = pageData(item).find("p").text(); + const data: DoubanSearchResultSubject = + { + id: id ??'', + title: title ? title.replaceAll('\n', '').replaceAll(/\s+/g, '') : '-', + score: null, + cast: author? author.replaceAll('\n', '').replaceAll(/\s+/g, '') : '', + type: '日记', + desc: content ? content.replaceAll('\n', '').replaceAll(/\s+/g, '') : '-', + url: url?? 'https://www.douban.com', + image: "", + imageUrl: "", + publisher: "", + datePublished: undefined, + genre: [] + } + return data; + }); + return new SearchPage(2000, pageNum, pageSize, type, doubanSearchResultSubjects); + } + + +} diff --git a/src/org/wanxp/douban/data/search/parser/SearchResultPageParser.ts b/src/org/wanxp/douban/data/search/parser/SearchResultPageParser.ts index 58ef663..df6b184 100644 --- a/src/org/wanxp/douban/data/search/parser/SearchResultPageParser.ts +++ b/src/org/wanxp/douban/data/search/parser/SearchResultPageParser.ts @@ -1,18 +1,21 @@ import {SearchResultPageParserInterface} from "./SearchResultPageParserInterface"; -import {FistAllPageSearchResultPageParser} from "./FistAllPageSearchResultPageParser"; +import {AllFirstPageSearchResultPageParser} from "./AllFirstPageSearchResultPageParser"; import {OtherAllPageSearchResultPageParser} from "./OtherAllPageSearchResultPageParser"; import {SearchPage} from "../../model/SearchPage"; import {SupportType} from "../../../../constant/Constsant"; import {NotAllPageSearchResultPageParser} from "./NotAllPageSearchResultPageParser"; +import {NoteFirstPageSearchResultPageParser} from "./NoteFirstPageSearchResultPageParser"; export class SearchResultPageParser { private parsers:SearchResultPageParserInterface[] = []; constructor() { - this.parsers.push(new FistAllPageSearchResultPageParser()); + this.parsers.push(new AllFirstPageSearchResultPageParser()); this.parsers.push(new OtherAllPageSearchResultPageParser()); this.parsers.push(new NotAllPageSearchResultPageParser()); + this.parsers.push(new NoteFirstPageSearchResultPageParser()); + } public parse(source:string, type:SupportType, pageNum:number, pageSize:number):SearchPage { diff --git a/src/org/wanxp/douban/data/search/searcher/AbstractSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/AbstractSearchPageFetcher.ts index 3755343..a60fe99 100644 --- a/src/org/wanxp/douban/data/search/searcher/AbstractSearchPageFetcher.ts +++ b/src/org/wanxp/douban/data/search/searcher/AbstractSearchPageFetcher.ts @@ -13,7 +13,7 @@ export abstract class AbstractSearchPageFetcher implements SearchPageFetcherInte this.settingsManager = settingsManager; } - support(type: SupportType): boolean { + support(type: SupportType, pageNum?:number): boolean { throw new Error("Method not implemented."); } fetch(keyword: string, pageNum: number, pageSize: number): Promise { diff --git a/src/org/wanxp/douban/data/search/searcher/BookPageSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/BookPageSearchPageFetcher.ts index 7e7bc41..8da1fbe 100644 --- a/src/org/wanxp/douban/data/search/searcher/BookPageSearchPageFetcher.ts +++ b/src/org/wanxp/douban/data/search/searcher/BookPageSearchPageFetcher.ts @@ -6,7 +6,7 @@ export class BookPageSearchPageFetcher extends AbstractSearchPageFetcher { return `https://www.douban.com/j/search?q=${keyword}&start=${start}&cat=1001`; } support(type: SupportType): boolean { - return type == SupportType.MOVIE; + return type == SupportType.BOOK; } diff --git a/src/org/wanxp/douban/data/search/searcher/GamePageSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/GamePageSearchPageFetcher.ts new file mode 100644 index 0000000..882f097 --- /dev/null +++ b/src/org/wanxp/douban/data/search/searcher/GamePageSearchPageFetcher.ts @@ -0,0 +1,13 @@ +import {AbstractSearchPageFetcher} from "./AbstractSearchPageFetcher"; +import { SupportType } from "src/org/wanxp/constant/Constsant"; + +export class GamePageSearchPageFetcher extends AbstractSearchPageFetcher { + getUrl(keyword: string, start: number, pageSize: number): string { + return `https://www.douban.com/j/search?q=${keyword}&start=${start}&cat=3114`; + } + support(type: SupportType): boolean { + return type == SupportType.GAME; + } + + +} diff --git a/src/org/wanxp/douban/data/search/searcher/MusicPageSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/MusicPageSearchPageFetcher.ts new file mode 100644 index 0000000..40a981b --- /dev/null +++ b/src/org/wanxp/douban/data/search/searcher/MusicPageSearchPageFetcher.ts @@ -0,0 +1,13 @@ +import {AbstractSearchPageFetcher} from "./AbstractSearchPageFetcher"; +import { SupportType } from "src/org/wanxp/constant/Constsant"; + +export class MusicPageSearchPageFetcher extends AbstractSearchPageFetcher { + getUrl(keyword: string, start: number, pageSize: number): string { + return `https://www.douban.com/j/search?q=${keyword}&start=${start}&cat=1003`; + } + support(type: SupportType): boolean { + return type == SupportType.MUSIC; + } + + +} diff --git a/src/org/wanxp/douban/data/search/searcher/NoteFirstPageSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/NoteFirstPageSearchPageFetcher.ts new file mode 100644 index 0000000..210de87 --- /dev/null +++ b/src/org/wanxp/douban/data/search/searcher/NoteFirstPageSearchPageFetcher.ts @@ -0,0 +1,13 @@ +import {AbstractSearchPageFetcher} from "./AbstractSearchPageFetcher"; +import { SupportType } from "src/org/wanxp/constant/Constsant"; + +export class NoteFirstPageSearchPageFetcher extends AbstractSearchPageFetcher { + getUrl(keyword: string, start: number, pageSize: number): string { + return `https://www.douban.com/search?cat=1015&q=${keyword}`; + } + support(type: SupportType, pageNum:number): boolean { + return type == SupportType.NOTE && pageNum == 1; + } + + +} diff --git a/src/org/wanxp/douban/data/search/searcher/NotePageSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/NotePageSearchPageFetcher.ts new file mode 100644 index 0000000..a3abbaa --- /dev/null +++ b/src/org/wanxp/douban/data/search/searcher/NotePageSearchPageFetcher.ts @@ -0,0 +1,15 @@ +import {AbstractSearchPageFetcher} from "./AbstractSearchPageFetcher"; +import { SupportType } from "src/org/wanxp/constant/Constsant"; + +export class NotePageSearchPageFetcher extends AbstractSearchPageFetcher { + getUrl(keyword: string, start: number, pageSize: number): string { + return `https://www.douban.com/j/search?q=${keyword}&start=${start}&cat=1015`; + } + support(type: SupportType, pageNum:number): boolean { + return type == SupportType.NOTE && pageNum > 1; + } + + + + +} diff --git a/src/org/wanxp/douban/data/search/searcher/SearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/SearchPageFetcher.ts index 3485e96..23998a4 100644 --- a/src/org/wanxp/douban/data/search/searcher/SearchPageFetcher.ts +++ b/src/org/wanxp/douban/data/search/searcher/SearchPageFetcher.ts @@ -4,6 +4,11 @@ import SettingsManager from "../../../setting/SettingsManager"; import {SupportType} from "../../../../constant/Constsant"; import {MoviePageSearchPageFetcher} from "./MoviePageSearchPageFetcher"; import {BookPageSearchPageFetcher} from "./BookPageSearchPageFetcher"; +import {GamePageSearchPageFetcher} from "./GamePageSearchPageFetcher"; +import {MusicPageSearchPageFetcher} from "./MusicPageSearchPageFetcher"; +import {TheaterPageSearchPageFetcher} from "./TheaterPageSearchPageFetcher"; +import {NotePageSearchPageFetcher} from "./NotePageSearchPageFetcher"; +import {NoteFirstPageSearchPageFetcher} from "./NoteFirstPageSearchPageFetcher"; export class SearchPageFetcher { @@ -12,12 +17,19 @@ export class SearchPageFetcher { constructor(settingsManager:SettingsManager) { this.fetchers.push(new AllPageSearchPageFetcher(settingsManager)); this.fetchers.push(new MoviePageSearchPageFetcher(settingsManager)); - this.fetchers.push(new BookPageSearchPageFetcher(settingsManager)) + this.fetchers.push(new BookPageSearchPageFetcher(settingsManager)); + this.fetchers.push(new GamePageSearchPageFetcher(settingsManager)); + this.fetchers.push(new MusicPageSearchPageFetcher(settingsManager)); + this.fetchers.push(new TheaterPageSearchPageFetcher(settingsManager)); + this.fetchers.push(new NotePageSearchPageFetcher(settingsManager)); + this.fetchers.push(new NoteFirstPageSearchPageFetcher(settingsManager)); + + } fetch(keyword:string, type:SupportType, pageNum:number, pageSize:number):Promise { for (const fetcher of this.fetchers) { - if (fetcher.support(type)) { + if (fetcher.support(type, pageNum)) { return fetcher.fetch(keyword, pageNum, pageSize); } } diff --git a/src/org/wanxp/douban/data/search/searcher/SearchPageFetcherInterface.ts b/src/org/wanxp/douban/data/search/searcher/SearchPageFetcherInterface.ts index 0d5dfdb..abf23be 100644 --- a/src/org/wanxp/douban/data/search/searcher/SearchPageFetcherInterface.ts +++ b/src/org/wanxp/douban/data/search/searcher/SearchPageFetcherInterface.ts @@ -2,7 +2,7 @@ import {SupportType} from "../../../../constant/Constsant"; export interface SearchPageFetcherInterface { - support(type:SupportType):boolean; + support(type:SupportType, pageNum?:number):boolean; fetch(keyword:string, pageNum:number, pageSize:number):Promise; diff --git a/src/org/wanxp/douban/data/search/searcher/TheaterPageSearchPageFetcher.ts b/src/org/wanxp/douban/data/search/searcher/TheaterPageSearchPageFetcher.ts new file mode 100644 index 0000000..3e863a8 --- /dev/null +++ b/src/org/wanxp/douban/data/search/searcher/TheaterPageSearchPageFetcher.ts @@ -0,0 +1,13 @@ +import {AbstractSearchPageFetcher} from "./AbstractSearchPageFetcher"; +import { SupportType } from "src/org/wanxp/constant/Constsant"; + +export class TheaterPageSearchPageFetcher extends AbstractSearchPageFetcher { + getUrl(keyword: string, start: number, pageSize: number): string { + return `https://www.douban.com/j/search?q=${keyword}&start=${start}&cat=3069`; + } + support(type: SupportType): boolean { + return type == SupportType.THEATER; + } + + +} diff --git a/src/org/wanxp/lang/locale/en.ts b/src/org/wanxp/lang/locale/en.ts index 7a95426..41dc896 100644 --- a/src/org/wanxp/lang/locale/en.ts +++ b/src/org/wanxp/lang/locale/en.ts @@ -561,7 +561,7 @@ PS: This file could be delete if you want to. 'TELEPLAY': `teleplay`, 'THEATER': `theater`, - 'MOVIE_AND_TELEPLAY': `movie&teleplay`, + 'MOVIE_AND_TELEPLAY': `movie&tv`, 'DAY': `D`, diff --git a/styles.css b/styles.css index eac4c72..25451c2 100644 --- a/styles.css +++ b/styles.css @@ -35,21 +35,37 @@ .obsidian_douban_search_input { margin-left: 5px; - float: left; +} + +.obsidian_douban_search_input_type { + margin-left: 5px; + float: right; } .obsidian_douban_search_input_content { margin-left: 5px; - margin-right: 5px; - width: 90%; + width: 80%; + float: left; + +} + +.obsidian_douban_search_controls { + margin-top: 20px; + margin-right: 5px; } .obsidian_douban_search_button { - margin-top: 30px; - margin-right: 10px; + margin-top: 20px; + margin-right: 5px; float:right; } +.obsidian_douban_cancel_button { + margin-top: 20px; + margin-right: 5px; + float: right; +} + .obsidian_douban_status_button { margin-top: 5px; margin-right: 10px;