Commit Graph

468 Commits

Author SHA1 Message Date
huangjianwu
d0760bcbbc Merge branch 'feat/configurable-whisper-models' into develop 2026-06-07 02:03:40 +08:00
huangjianwu
2fc558e00a Merge branch 'master' into develop 2026-06-07 02:01:09 +08:00
huangjianwu
a83642e602 feat(about): 群二维码改为扫描公众号回复「交流群」获取
关于页社区区块由直接展示会过期的微信群二维码,改为展示公众号二维码,
引导用户关注公众号后回复「交流群」获取最新群二维码,避免群码过期失效。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:00:56 +08:00
huangjianwu
9bc3b2960b Merge branch 'master' into develop 2026-05-27 02:52:11 +08:00
huangjianwu
095d772c7d Merge branch 'release/2.3.4' v2.3.4 2026-05-27 02:51:43 +08:00
huangjianwu
2e3fda7df4 feat: 新增 BiliNote AI笔记系统一对一搭建服务二维码(README + 关于页),bump 版本至 2.3.4
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 02:51:15 +08:00
Jianwu Huang
2ea95b2fad Merge pull request #382 from techotaku39/fix/frontend-about-version
fix(frontend): 同步关于页版本号
2026-05-27 02:37:03 +08:00
techotaku39
9d1a7cd699 fix(frontend): 同步关于页版本号 2026-05-26 15:54:05 +08:00
Jianwu Huang
f2d8ece0c1 Merge pull request #374 from techotaku39/fix/backend-api-key-mask-and-ffmpeg-path
fix(backend): 防御 API Key 掩码污染并修复 EXE 版 .env 加载路径
2026-05-25 13:21:38 +08:00
Jianwu Huang
7bc4b0114e Merge pull request #375 from techotaku39/feature/extension-show-title-instead-of-url
feat(extension): 侧边栏与 popup 用视频标题替代链接显示
2026-05-25 13:21:11 +08:00
Jianwu Huang
f7ea6f72d9 Merge pull request #377 from techotaku39/fix/markdown-anchor-navigation
fix(frontend): 修复 Markdown 目录锚点跳转与 Tauri 路由
2026-05-25 13:20:19 +08:00
techotaku39
905dbcce47 fix(frontend): 增强锚点链接模糊匹配,兼容 LLM 生成的不一致目录格式 2026-05-24 03:21:20 +08:00
techotaku39
ebdb254fc6 fix(frontend): 修复 Markdown 目录锚点跳转与 Tauri 路由
- 安装 rehype-slug 插件,自动为 heading 生成 id,解决目录链接无锚点目标的问题
- 自定义 <a> 组件处理内部锚点链接,阻止默认刷新行为并使用 scrollIntoView 平滑滚动
- Tauri 桌面端改用 HashRouter,避免刷新时 404 及错误打开外部浏览器

fixes #xxx

Co-Authored-By: HAPI <noreply@hapi.run>
2026-05-24 03:21:20 +08:00
techotaku39
1eb213e215 feat(extension): 侧边栏与 popup 用视频标题替代链接显示
在任务未完成的早期阶段(PENDING/DOWNLOADING 等),侧边栏和 popup
只能回退到 videoUrl,用户看到的是一长串链接,难以辨认。

改动:
- TaskRecord 新增 title 字段,用于存储浏览器标签页标题
- popup 创建任务时保存 tab.title
- background startTask 接收可选 title,右键菜单和悬浮按钮均传入
- 显示优先级:result.audio_meta.title > title > videoUrl
- 所有平台(Bilibili / YouTube / Douyin / Kuaishou)均受益

测试:
- pnpm typecheck 通过
- pnpm build 通过
- 在 B 站、YouTube 视频页提交任务,侧边栏和 popup 均显示标题而非链接
2026-05-24 00:06:21 +08:00
techotaku39
4425239717 fix(backend): 防御 API Key 掩码污染并修复 EXE 版 .env 加载路径
- provider.py: 更新供应商时,若 api_key 包含 '*'(掩码字符),
  跳过该字段,防止前端展示用的 mask_key() 值被误写入数据库。

- ffmpeg_helper.py: load_dotenv() 默认只从 CWD 查找 .env,
  PyInstaller 打包后 CWD 为 EXE 目录,导致 _internal/.env 被忽略。
  改为遍历多个候选路径(CWD、脚本目录、项目根目录、_internal/),
  确保源码和打包两种场景都能正确加载环境变量。
2026-05-23 22:49:56 +08:00
huangjianwu
58d992f28f feat(transcriber): 可配置 whisper 模型 + 名称映射(自定义 HF repo / 本地路径)
此前 fast-whisper 把「size → Systran/faster-whisper-{size}」的约定隐式散落在
加载/下载/检测三处,用户想用命名不符该约定的模型(社区微调版、或自己下到本地
的模型)接不上。本功能把映射显式化 + 可配置(对齐已有的 MLX_MODEL_MAP 模式)。

后端:
- 新增 app/transcriber/whisper_models.py 注册表:内置映射 + 用户自定义
  (config/whisper_models.json 持久化,Docker 下随 config 卷保留);resolve
  优先级 自定义 > 内置 > 直通(含 / 的 repo_id / 已存在本地目录)。
- whisper.py / config.py 的加载、下载、完整性检测统一走 resolve;HF cache 目录从
  任意 repo_id 推导(models--{org}--{name})不再写死 Systran;本地路径跳过下载,
  _purge_cache 绝不删用户本地模型。
- 新增 /whisper_models 增删查 API;/transcriber_config 返回内置+自定义列表;
  下载校验放开到「已登记/可解析」的模型。

前端:transcriber.tsx 新增「自定义模型」卡片(增删 + 下载状态),模型下拉自动含自定义。

Docker:自定义 HF 模型下到 /app/backend/models(v2.3.3 models 卷已持久化);本地模型
走挂载目录 + 配置路径,UI 已提示挂载。

测试:tests/test_whisper_models.py 13 个单测全过;并在 v2.3.3 镜像真实后端环境做了
import 链 + resolve + 真实模型检测的集成冒烟,均通过。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:09:06 +08:00
huangjianwu
db556b8991 Merge branch 'release/2.3.3'
v2.3.3:预构建镜像持久化数据库/笔记,修升级丢配置与历史。
v2.3.3
2026-05-22 14:07:00 +08:00
huangjianwu
717df2af7b Merge branch 'release/2.3.3' into develop
回合并 v2.3.3 版本号。
2026-05-22 14:07:00 +08:00
huangjianwu
b431db545a docs: v2.3.3 CHANGELOG + README + tauri 版本
Docker 镜像数据持久化修复版本。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:07:00 +08:00
huangjianwu
25face4b67 Merge branch 'fix/docker-data-persistence' into develop
v2.3.3:预构建镜像持久化数据库/笔记,修升级丢配置与历史。
2026-05-22 14:06:24 +08:00
huangjianwu
edfd6e4765 fix(docker): 预构建镜像持久化数据库/笔记,修升级丢配置与历史
README 的 docker run 只挂了 -v …:/app/backend/data(仅媒体缓存),但
SQLite 库在 /app/backend/bili_note.db、笔记在 /app/backend/note_results
都不在该卷下 → 用户删容器重建(如 docker pull 升级镜像)会丢失 LLM
供应商配置和全部笔记历史。

- Dockerfile.complete:DATABASE_URL 重定向到 /app/backend/data/bili_note.db、
  NOTE_OUTPUT_DIR 改到 data/note_results,并预建 /app/backend/data 目录;
  两条 supervisord environment 行同步(兜底默认值 + %(ENV_*)s 透传)。
- README:docker run 改挂 data(库+笔记)/ config(供应商·Cookie·转写配置)/
  static(截图)/ models(模型缓存,可选)四个数据卷,并警告不要挂整个
  /app/backend(命名卷会固化镜像内代码,导致 docker pull 升级不生效)。
- docker-build.yml:同步发布说明里 echo 的 run 命令。

截图仍留在 /app/backend/static(static_dir 硬编码服务,不能重定向),单独挂卷。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 13:30:42 +08:00
huangjianwu
b53cafda5a Merge branch 'release/2.3.2' into develop
回合并 v2.3.2 版本号。
2026-05-22 11:41:17 +08:00
huangjianwu
adda5fd240 Merge branch 'release/2.3.2'
v2.3.2:修后端启动崩溃(ctranslate2 4.6.0) + whisper 模型路径 + 桌面端版本号。
v2.3.2
2026-05-22 11:41:04 +08:00
huangjianwu
3e28f1fe38 docs: v2.3.2 CHANGELOG + README + tauri 版本
docker 启动崩溃 / whisper 模型路径 / 桌面端版本号 修复版本。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:40:55 +08:00
huangjianwu
bffa285cd0 Merge branch 'fix/docker-startup-and-qr' into develop
v2.3.2 修复集:
- ctranslate2 4.5.0→4.6.0 修后端启动崩溃(可执行栈 / glibc 2.41)
- whisper 模型下载/加载统一 HF cache 布局
- 桌面端构建版本号从 tag 注入(修产物恒为 2.0.0)
2026-05-22 11:40:21 +08:00
huangjianwu
b740e70068 fix(desktop): 构建时从 tag 注入版本号,修产物版本恒为 2.0.0
桌面端构建产物(.dmg/.msi 文件名 + app 内部版本)一直是 2.0.0:
Tauri 取 tauri.conf.json 的静态 version 字段作为产物版本,而 Release
工作流只把 tag 名用作 Release 标题,没同步到 conf → 产物版本与 Release
版本错位。

在 pnpm tauri build 前新增 Sync version 步骤,从 github.ref_name(形如
v2.3.2,去掉前缀 v)注入版本到 tauri.conf.json。以后每次 tag 发版自动
对齐;workflow_dispatch 手动构建无 tag 时跳过,保留静态值不破坏。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:40:04 +08:00
huangjianwu
261c95cf12 fix(transcriber): whisper 模型下载/加载统一走 HF cache 布局
此前用 modelscope 下到自定义目录 whisper-{size}/ 再把该路径传给
WhisperModel。但 faster-whisper 1.1.1 只要 path 含 '/' 就当成 HF
repo_id 处理,没有「本地目录直接返回」分支 → 在线请求失败后 fallback
local_files_only,又因 modelscope 布局命不中 HF cache → LocalEntryNotFound,
误导用户以为是「离线模式」。

改为下载与加载路径对齐:
- 下载:huggingface_hub.snapshot_download(cache_dir=model_dir),落到 HF
  cache 布局 models--Systran--faster-whisper-{size}/snapshots/<hash>/
- 加载:WhisperModel(model_size_or_path=size, download_root=model_dir),
  让 faster-whisper 自己映射到 Systran/faster-whisper-* 并命中同一 cache
- 完整性检测 / 损坏自愈(_purge_cache) 同步按 HF cache 布局,并兼容老
  modelscope 目录(向后兼容已下载的老用户)

HF_ENDPOINT 已在 Dockerfile 指向 hf-mirror.com,国内可用。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:27:03 +08:00
huangjianwu
1cc7f38e14 fix(backend): 升级 ctranslate2 4.5.0→4.6.0 修复后端启动崩溃
Docker 容器反复重启,启动即报:
  ImportError: libctranslate2-*.so.4.5.0: cannot enable executable
  stack as shared object requires: Invalid argument

根因:ctranslate2 4.5.0 预编译 wheel 把共享库标记为「需要可执行栈」,
新内核 / glibc 2.41+ 加载时拒绝并返回 EINVAL。faster-whisper 在
whisper.py 顶层 import,import 失败直接拖垮整个后端启动 → 重启死循环。

ctranslate2 4.6.0 加入 noexecstack 链接标志(OpenNMT/CTranslate2 #1852、
#1861)从 wheel 层根治。faster-whisper 1.1.1 依赖 ctranslate2<5,>=4.0,
4.6.0 兼容;同时覆盖 web / GPU / 桌面 三条构建链。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:26:49 +08:00
huangjianwu
7fffd6873b Merge branch 'release/2.3.1' into develop
回合并 v2.3.1 版本号(CHANGELOG + README)。
2026-05-22 10:51:49 +08:00
huangjianwu
7b927db363 Merge branch 'release/2.3.1'
v2.3.1:更新微信交流群二维码(群 1-5)。
v2.3.1
2026-05-22 10:51:39 +08:00
huangjianwu
c42ceaaa32 docs: v2.3.1 CHANGELOG + README 版本
二维码热修补丁版本。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:51:30 +08:00
huangjianwu
177ee4ba3a Merge branch 'fix/docker-startup-and-qr' into develop
更新微信交流群二维码(群 1-5,旧码即将失效)。
同步 master 上的二维码热修(README 二维码区块 + 5 张入群图)到 develop。
2026-05-22 10:51:05 +08:00
huangjianwu
aae17abf9a docs: 更新微信交流群二维码(群 1-5,有效期至 5/29)
旧二维码即将失效,替换 README 中 5 个交流群的入群二维码。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:42:12 +08:00
huangjianwu
33d44e32d2 docs: 突出 BiliNote Pro 在线版 + 更新微信交流群二维码
- README 顶部新增 BiliNote Pro 在线版推广区块(www.bilinote.app),
  项目简介后加引导提示,「在线使用」章节改为「在线使用(推荐)」
- 微信交流群二维码更新为 5 个群,doc/wechat-group-1~5.png

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 21:45:34 +08:00
Jianwu Huang
ce58cb9352 Merge pull request #369 from JefferyHcool/release/2.3.0
chore(release): merge release/2.3.0 back into develop
2026-05-14 21:09:55 +08:00
Jianwu Huang
2043d89288 Merge pull request #368 from JefferyHcool/release/2.3.0
chore(release): v2.3.0
v2.3.0
2026-05-14 21:09:30 +08:00
huangjianwu
56e075253a docs: v2.3.0 CHANGELOG + README 版本
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 19:05:46 +08:00
huangjianwu
f1b091b846 chore(deploy): docker 镜像源/restart 策略 + .env 修正 + 文档
- 所有 Dockerfile 加 BASE_REGISTRY build-arg,国内拉不到 docker.io
  时可换 daocloud 等镜像源;compose 透传该 arg
- docker-compose: restart 从 on-failure:3 改 unless-stopped(避免短暂
  崩溃后永久打死);gpu compose 补齐 healthcheck/restart/mem_limit
- Dockerfile.complete: supervisord 用 %(ENV_*)s 透传环境变量给 backend
  子进程(之前只白名单 2 个,docker run -e 配的变量后端看不到)
- .env.example: 修正 VITE_API_BASE_URL 端口(8000→8483)、
  WHISPER_MODEL_SIZE medium→tiny(首次启动不被大模型下载卡住)、
  补 Docker 部署说明注释
- README: 新增 Docker 部署常见问题 FAQ(镜像源/restart/数据持久化等)
- CLAUDE.md: 勘误(移除不存在的 messaging/i18n/worker_registry 描述,
  修正 events 路径),补 pytest/typecheck 命令

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 19:01:55 +08:00
huangjianwu
37f7ee6e15 feat(desktop): 后端健康监控韧性 + onboarding 修复 + 全局代理 UI
- useCheckBackend 重写:60s 总超时取代 while(true) 死轮询,订阅 Tauri
  backend-ready/terminated/startup-timeout 事件,裸 fetch 探测避免
  启动期 toast 叠堆
- Tauri lib.rs:spawn 后 HTTP 探针轮询 /api/sys_check 拿 200 才算就绪
  (之前 TCP connect 会被孤儿进程误判);RunEvent::Exit 钩子退出前
  kill sidecar,修孤儿进程占端口;restart 前发 backend-restarting
  让前端忽略主动 kill 引发的 terminated
- BackendInitDialog:失败态展示原因 + 最近 stderr + 重启/复制日志按钮
- StartupBanner:收到 restarted/ready 自动清「已退出」横幅
- BackendHealthIndicator:修 /api/api/sys_health 双前缀 404
- Onboarding:step1 后端连通改自动重试 + 事件触发 + 手动按钮;step2
  撞预置供应商名时改为更新已存在供应商;errText 统一错误文案
- 全局代理 UI:下载配置页新增代理卡片(services/proxy.ts + ProxyConfig)
- request.ts 加 suppressToast 配置位,预期失败不弹全局红 toast
- NoteForm/taskStore:捕获就绪门禁错误,引导去音频转写配置页下载
- providerCard:整行可点切换(之前只有 icon 区域响应)
- Monitor 页 Whisper 卡显示模型本地下载状态
- tauri/api 升级对齐 2.11,修 vite build 版本不匹配

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 19:01:37 +08:00
huangjianwu
41f17592c2 fix(backend): 部署韧性——模型自愈/就绪门禁/全局代理/启动诊断
- whisper: model.bin 截断/损坏时删目录重下重试一次,修「Unable to
  open file model.bin」死循环;mlx 同样按 config.json 判完整性
- /generate_note 加就绪门禁:本地转写引擎模型没下好直接拦截,返回
  reason=transcriber_model_not_ready,不让任务静默卡在首次下载
- 全局代理:新增 ProxyConfigManager(JSON 配置 + HTTP_PROXY env 兜底)
  + build_openai_client,统一注入代理到 LLM/Groq 客户端;yt-dlp 与
  youtube-transcript-api 也走代理
- build_openai_client 校验 api_key 非空,空 key 给「xxx 的 API Key
  未配置」而不是天书般的 Illegal header value b'Bearer '
- universal_gpt: 模型拒绝自定义 temperature(o1/o3/gpt-5 系列)时
  就地去掉参数重试,不消耗重试预算
- connect_test 改用真实 chat completion 而非 /v1/models 探测
- main.py: lifespan 拆 [startup 1/5..5/5] 分段日志 + 异常清晰定位
- /sys_health 重构为结构化返回 {backend,ffmpeg,db,whisper_model}

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 19:01:14 +08:00
Jianwu Huang
88d25f8cc1 Update README.md 2026-05-14 09:24:59 +08:00
huangjianwu
de630dadb3 chore(release): merge hotfix/tauri-api-dep into develop 2026-05-09 14:53:18 +08:00
huangjianwu
7b5e6099e8 chore(release): v2.2.3
补 P1/P2 用了 @tauri-apps/api 但没声明为直接依赖导致的 vite build CI 失败。
v2.2.3
2026-05-09 14:53:01 +08:00
huangjianwu
bb9a70eee2 fix(frontend): @tauri-apps/api 提升为直接依赖,修 vite build CI 失败
v2.2.0 加的 P1/P2 桌面端组件(StartupBanner / useBackendEvents)用了
'await import(\"@tauri-apps/api/event\")' 与 '@tauri-apps/api/core',但
@tauri-apps/api 只是 @tauri-apps/plugin-shell 的 transitive,没在
BillNote_frontend/package.json 直接声明。

本地开发能跑(pnpm 节点解析容忍 transitive),但 vite 6 的 production
rollup 静态分析时报:
  Rollup failed to resolve import "@tauri-apps/api/event"

之前我只跑了 typecheck 没跑 build,所以这个问题先在 v2.2.0 / v2.2.1 / v2.2.2
的 CI 上才暴露出来。本地 DOCKER_BUILD=1 pnpm run build 已复现并修复验证。

修:BillNote_frontend/package.json 把 '@tauri-apps/api' 加为直接依赖
(^2.10.1,与 lockfile 中已存在的 transitive 版本对齐),lockfile 同步更新。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 14:52:56 +08:00
huangjianwu
e9d4740cc7 chore(release): merge hotfix/desktop-pnpm-version into develop 2026-05-09 14:49:53 +08:00
huangjianwu
c5900a9026 chore(release): v2.2.2
补 v2.2.1 漏掉的桌面端 Tauri 构建 pnpm 版本 pin。
v2.2.2
2026-05-09 14:49:39 +08:00
huangjianwu
63577aa1aa fix(ci): pin pnpm 9.15.0 in main.yml,修 v2.2.0 桌面端 Tauri 构建失败
v2.2.1 hotfix 只 pin 了 Docker 那两个 Dockerfile 里的 pnpm,但 .github/workflows/main.yml
(Tauri 桌面端 macOS + Windows 构建)的 'pnpm/action-setup@v4 with: version: latest' 没改,
于是 v2.2.1 tag 触发的桌面端 build 仍然挂在 'Install frontend dependencies' 步:

  ERR_UNKNOWN_BUILTIN_MODULE: No such built-in module: node:sqlite
  Node.js v20.20.2

修:main.yml 的 pnpm version 'latest' → '9.15.0',与 Docker 侧 + extension workflow
保持一致(lockfile 是 pnpm 9 生成的)。

release-extension.yml 已经是 pinned 9,无需改。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 14:49:33 +08:00
huangjianwu
ec33ae35ed chore(release): merge hotfix/docker-pnpm-version into develop 2026-05-09 14:47:25 +08:00
huangjianwu
2e69d1179b chore(release): v2.2.1
补 v2.2.0 ghcr.io 镜像构建失败(pnpm 版本不兼容 Node 20)。
v2.2.1
2026-05-09 14:47:11 +08:00
huangjianwu
7e5be46cda fix(docker): pin pnpm 到 9.15.0,修复 v2.2.0 ghcr.io 镜像构建失败
v2.2.0 tag 触发的 ghcr.io 推送挂在 frontend-builder 第 5/7 步
'pnpm install --frozen-lockfile',错误:

  code: 'ERR_UNKNOWN_BUILTIN_MODULE'
  Node.js v20.20.2

根因:'corepack prepare pnpm@latest' 拉到 pnpm 11.0.9,pnpm 11+ 要求 Node 22+,
跟我们 node:20-alpine 不兼容。lockfile 本身是 lockfileVersion '9.0' 由 pnpm 9
生成,理应跟 pnpm 9 配。

修:Dockerfile.complete + BillNote_frontend/Dockerfile 都 pin 到 pnpm@9.15.0;
不再用 @latest,避免上游再次升级悄悄破坏 CI。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 14:47:06 +08:00