From ce4319ec256276f7d76d9728b7d530110b8c8637 Mon Sep 17 00:00:00 2001 From: truewhile <62226914+truewhile@users.noreply.github.com> Date: Thu, 1 Oct 2026 21:57:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=98=85=E8=AF=BB=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/index.html | 26 + docs/reader-plan.md | 6 +- docs/reader-ui-spec.md | 38 +- internal/handler/handler.go | 12 + internal/handler/reader_browser_test.go | 247 +++ internal/handler/reader_local_audio_test.go | 174 +++ internal/handler/reader_routes.go | 302 +++- internal/helper/http.go | 64 +- internal/helper/http_test.go | 73 + internal/model/reader.go | 13 + internal/repository/reader_repository.go | 29 +- internal/service/filemanager.go | 8 + internal/service/filemanager_test.go | 31 + internal/service/reader/audio_config_test.go | 44 + internal/service/reader/audio_transcode.go | 368 +++++ .../service/reader/audio_transcode_test.go | 257 ++++ internal/service/reader/book_type_test.go | 91 ++ internal/service/reader/bookshelf_test.go | 147 ++ internal/service/reader/browser_panel.go | 824 ++++++++++ internal/service/reader/browser_panel_test.go | 392 +++++ internal/service/reader/http_encoding_test.go | 119 ++ internal/service/reader/local.go | 1332 +++++++++++++++++ internal/service/reader/local_test.go | 957 ++++++++++++ internal/service/reader/login.go | 35 +- internal/service/reader/login_test.go | 17 +- internal/service/reader/reader.go | 355 ++++- internal/service/reader/rule/analyzer.go | 64 +- internal/service/reader/rule/bridge.go | 75 +- internal/service/reader/rule/browser.go | 227 +++ internal/service/reader/rule/browser_test.go | 305 ++++ internal/service/reader/rule/datauri.go | 81 + internal/service/reader/rule/datauri_test.go | 108 ++ internal/service/reader/rule/errors.go | 2 - internal/service/reader/rule/goja.go | 173 ++- internal/service/reader/rule/js_scope_test.go | 98 ++ internal/service/reader/rule/jsobjects.go | 79 + .../service/reader/rule/sample_source_test.go | 8 +- internal/service/reader/rule/state.go | 52 + .../reader/rule/testdata/sample_loginUrl.js | 22 + internal/service/reader/rule/url.go | 52 +- .../service/reader/rule/url_binding_test.go | 149 ++ internal/service/reader/search_query_test.go | 139 ++ internal/service/reader/state.go | 33 +- web/src/api/reader.ts | 87 +- web/src/components/Layout.tsx | 8 +- web/src/components/LayoutHeaderSections.tsx | 199 ++- web/src/components/LayoutReaderModeToggle.tsx | 37 + web/src/pages/HomePage.tsx | 4 +- web/src/pages/reader/BrowserPanel.tsx | 231 +++ web/src/pages/reader/ReaderAudioPanel.tsx | 702 ++++++++- web/src/pages/reader/ReaderHomeContent.tsx | 315 +++- web/src/pages/reader/ReaderSearchPage.tsx | 27 +- web/src/pages/reader/ReaderViewPage.tsx | 310 +++- .../pages/reader/ServerFilePickerDialog.tsx | 212 +++ web/src/pages/reader/SourceLoginDialog.tsx | 80 +- web/src/stores/readerSettings.ts | 25 + 56 files changed, 9511 insertions(+), 354 deletions(-) create mode 100644 dist/index.html create mode 100644 internal/handler/reader_browser_test.go create mode 100644 internal/handler/reader_local_audio_test.go create mode 100644 internal/helper/http_test.go create mode 100644 internal/service/reader/audio_config_test.go create mode 100644 internal/service/reader/audio_transcode.go create mode 100644 internal/service/reader/audio_transcode_test.go create mode 100644 internal/service/reader/book_type_test.go create mode 100644 internal/service/reader/bookshelf_test.go create mode 100644 internal/service/reader/browser_panel.go create mode 100644 internal/service/reader/browser_panel_test.go create mode 100644 internal/service/reader/http_encoding_test.go create mode 100644 internal/service/reader/local.go create mode 100644 internal/service/reader/local_test.go create mode 100644 internal/service/reader/rule/browser.go create mode 100644 internal/service/reader/rule/browser_test.go create mode 100644 internal/service/reader/rule/datauri.go create mode 100644 internal/service/reader/rule/datauri_test.go create mode 100644 internal/service/reader/rule/js_scope_test.go create mode 100644 internal/service/reader/rule/url_binding_test.go create mode 100644 internal/service/reader/search_query_test.go create mode 100644 web/src/components/LayoutReaderModeToggle.tsx create mode 100644 web/src/pages/reader/BrowserPanel.tsx create mode 100644 web/src/pages/reader/ServerFilePickerDialog.tsx diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..232bbe8 --- /dev/null +++ b/dist/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + MeBox + + + + + + + + + + +
+ + diff --git a/docs/reader-plan.md b/docs/reader-plan.md index 74bed56..b65621e 100644 --- a/docs/reader-plan.md +++ b/docs/reader-plan.md @@ -95,6 +95,7 @@ web/src/ - 搜索:`POST /search {keyword}` → 后台聚合任务,结果经 WS `reader:search` 增量推送;结果可一键加入书架 - 发现:`GET /explore?source=&group=`(解析 exploreUrl 的 `分组名::url` 结构) - 书架:`GET/POST/DELETE /books`、`GET /books/:id/info`、`GET /books/:id/toc`、`POST /books/:id/refresh`(追更) +- 本地书籍:`POST /local/books`(multipart 上传 TXT/EPUB,导入即入书架) - 内容:`GET /books/:id/chapters/:idx/content` —— 按书籍类型返回: - 文本:`{type:"text", content:"..."}`(服务端已合并 nextContentUrl 翻页、已应用替换规则) - 音频:`{type:"audio", tracks:[{url,title}]}`(含代理路径与所需请求头) @@ -121,10 +122,11 @@ web/src/ | P0 引擎地基 ✅ | 规则引擎核心(四分析器 + 规则拆分/组合/变量)+ AnalyzeUrl v1(GET/POST/charset/headers/变量/页码模式)+ 表结构 + 书源导入/管理 API + 搜索/详情/目录/正文/书架/进度/调试 API | 已完成:`internal/service/reader/rule/`(规则引擎,~2800 行,对齐 AnalyzeRule/AnalyzeByJSoup/AnalyzeByJSonPath/AnalyzeByXPath/AnalyzeByRegex/AnalyzeUrl/RuleAnalyzer)+ 服务层 + `/api/reader/*` 路由 + 单测/端到端测试全绿 | | P1 文本源全链路 + 首页切换 | 搜索聚合(WS 进度)/详情/目录/正文(nextContentUrl 合并、缓存)+ 前端首页切换、书架、搜索、详情、文本阅读器 v1(阅读器样式仿 legado:9 宫格点击、主题、翻页动画) | 用纯规则型文本源完成「搜书→加入→阅读」全流程 | | P2 JS 与兼容率爬坡 ✅ | goja 接入 + `java.*` 桥(网络/编解码/摘要/对称加密全家桶/规则回调,函数名对齐 JsExtensions)+ URL 规则 JS(analyzeJs/{{}}/js/bodyJs)+ cookie jar + 用户替换净化规则(含正则超时保护)+ 替换净化页 + 结构化冒烟链路(SmokeChain)+ `cmd/reader-smoke` 冒烟 CLI | JS 源可用;冒烟 CLI 跑公开书源集出各阶段通过率报告 | -| P3 音频源 ✅ | 正文按音频类型返回播放列表(绝对化)+ `/api/reader/media` 签名媒体代理(HMAC 防滥用、Range 透传支持拖动、m3u8 分片/密钥地址重写)+ 阅读器音频面板(hls.js 播 m3u8、直链 `