Commit Graph

500 Commits

Author SHA1 Message Date
huangjianwu
e21e329d42 chore(release): 2.4.4 2026-06-23 11:46:10 +08:00
huangjianwu
55946b82ec fix(deps): 升级 starlette 0.46.1→0.47.2 修复 CVE-2025-54121
starlette < 0.47.2 在解析 multipart 表单的大文件时,SpooledTemporaryFile
从内存溢写到磁盘的 rollover 是在事件循环线程内同步执行的,攻击者可借大文件
上传阻塞事件循环造成拒绝服务(GHSA-2c2j-9gv5-cj73)。0.47.2 把 rollover
写入移到线程池(UploadFile.write 命中 _will_roll 时走 run_in_threadpool)。

由于 FastAPI 0.115.12 的约束为 starlette<0.47.0,同步升级 FastAPI
0.115.12→0.116.2(约束放宽至 starlette<0.48.0/<0.49.0),与现有
pydantic 2.11.2 / anyio 4.9.0 / python-multipart 0.0.20 均兼容。

验证:pip check 无冲突;2MB multipart 上传走 rollover 路径正常;
docker 整套栈在新框架下 boot 健康(sys_health backend/db ok)。

Closes #411
Refs GHSA-2c2j-9gv5-cj73

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 11:45:28 +08:00
huangjianwu
5380f4c412 Merge branch 'hotfix/2.4.3' v2.4.3 2026-06-23 10:52:50 +08:00
huangjianwu
4ef3631712 chore(release): 2.4.3 2026-06-23 10:52:11 +08:00
huangjianwu
4a87c5b93b fix(transcriber): 下载失败时透传错误到前端并提示
issue #402 衍生问题:whisper 模型后台下载失败时,/transcriber_models_status
只回传 downloading/downloaded 两个布尔,failed 态被直接丢弃,于是前端表现为
「点了下载没反应、状态一直未下载、且无任何错误提示」。

后端:新增轻量模块 model_download_state 统一维护下载状态(downloading/done/
failed)与失败原因,config.py 的下载触发与状态查询共享同一份内存态;状态接口
新增 failed 字段,失败时附带 error(仓库 404、网络中断、本地路径缺 model.bin 等)。

前端:模型管理列表新增「下载失败」红色徽标 + 错误详情,按钮在失败后变为「重试」;
自定义模型项同样展示失败图标与原因;并对「本次新出现的失败」弹一次 toast 主动提示。

测试:新增 test_model_download_state 覆盖状态流转(downloading/done/failed、
失败原因透传、downloaded 覆盖 failed、重下清错、mlx key 隔离)。

已用 docker compose 启动整套栈验证:触发本地路径缺失与 HF 仓库 404 两种失败,
/transcriber_models_status 均正确回传 failed:true + error。

Refs #402

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 10:50:55 +08:00
huangjianwu
3841719d5a fix(transcriber): 修复 large-v3-turbo 因仓库 404 无法下载
Systran/faster-whisper-large-v3-turbo 已从 HuggingFace 下架(API 返回
401/404,仓库不存在)。用户点击下载后,后台 snapshot_download 立即抛错
被吞掉,_downloading 置为 failed 但状态接口只回传 downloading/downloaded
两个布尔,于是表现为:无进度转圈、状态一直「未下载」、前端无错误提示。

改用社区维护的 CT2 转换版 deepdml/faster-whisper-large-v3-turbo-ct2:
HF 直链可达(200,无重定向,保证缓存目录名与存在性检测一致),含
model.bin 等全部所需文件,与 faster-whisper 的 large-v3-turbo 等价。

附回归测试,断言 large-v3-turbo 解析到存活仓库而非已失效的 Systran 仓库。

Closes #402

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 10:50:55 +08:00
Jianwu Huang
f072996db5 Merge pull request #412 from JefferyHcool/add-claude-github-actions-1782179231594
Add claude GitHub actions 1782179231594
2026-06-23 09:52:52 +08:00
Jianwu Huang
9d424aef59 "Claude Code Review workflow" 2026-06-23 09:47:16 +08:00
Jianwu Huang
48568e52c6 "Claude PR Assistant workflow" 2026-06-23 09:47:14 +08:00
huangjianwu
7baaefd76e Merge branch 'hotfix/docker-nginx' v2.4.2 2026-06-17 11:29:02 +08:00
huangjianwu
3002e311ac chore(release): 2.4.2 2026-06-17 11:17:52 +08:00
huangjianwu
ad57bc5489 fix(docker): 修复 Docker 部署打开显示 nginx 欢迎页
nginx/default.conf 被 docker-compose(多容器)与 Dockerfile.complete(单镜像)
共用,但两种模式对 location / 的需求相反:多容器需反代独立的 frontend 容器,
单镜像需直接服务本地静态文件。此前共用一份配置,导致其中一种部署总会回退到
nginx 默认欢迎页(本次为 compose 入口 nginx 用了 root 但容器内无前端产物)。

拆分为两份配置,各司其职、互不干扰:
- nginx/default.conf:compose 版,location / 反代 http://frontend:80
- nginx/standalone.conf(新增):单镜像版,location / 服务 /usr/share/nginx/html,
  /api、/static 代理到本地 127.0.0.1:8483
- Dockerfile.complete 改用 standalone.conf,移除不再需要的 sed 改写

已用 nginx -t 校验 standalone.conf 语法通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:17:52 +08:00
huangjianwu
a7d8995f3a Merge branch 'release/2.4.1' v2.4.1 2026-06-17 10:20:57 +08:00
huangjianwu
67486c4d66 chore(release): 2.4.1 2026-06-17 10:00:34 +08:00
Jianwu Huang
54714faa73 Merge pull request #410 from JefferyHcool/fix/bilibili-412-dm-img-params
fix(bilibili): 注入 dm_img 风控参数修复 wbi/playurl 412
2026-06-17 09:58:37 +08:00
Jianwu Huang
f6ba347718 Merge pull request #409 from wmsdsb/fix/bilibili-multipart-p-number-clean
fix(bilibili): 修正分P视频字幕优先链路未传p参数导致取错集
2026-06-17 09:58:34 +08:00
Jianwu Huang
67253a1bf2 Merge pull request #381 from Loker-Choi/fix/youtube-shorts-url
fix(youtube): 支持 Shorts 链接
2026-06-17 09:58:30 +08:00
huangjianwu
f79dc612fb fix(bilibili): 注入 dm_img 风控参数修复 wbi/playurl 412
B 站 wbi/playurl 网关新增 dm_img_list/dm_img_str/dm_cover_img_str/
dm_img_inter + web_location 风控校验,缺失即返回 HTTP 412。对于网页不内嵌
playinfo、必须走 API 的视频(如 BV1X9L16oEgB),yt-dlp(含最新版)尚未适配,
导致下载失败,且刷新 cookie 无效。

通过猴补丁在 BilibiliBaseIE._download_playinfo 的 wbi 签名前注入哑值 dm_img
参数(取值形态对齐 yt-dlp 自身在 arc/search 端点的用法),即可恢复 200。
已验证补丁对固定版 2025.03.31 与最新 2026.06.09 签名一致、向前兼容;新增 4 个单元测试。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 09:55:54 +08:00
wmsdsb137
ab9ca6a026 fix: address Copilot review suggestions
- Remove unused Tuple import
- Validate /pN suffix p >= 1
- Reuse resolve_bilibili_short_url in fetch_subtitles
- Deduplicate short URL resolution
2026-06-16 21:01:27 +08:00
wmsdsb137
2ba409880e fix(bilibili): 修正分P视频字幕优先链路未传p参数导致取错集
问题:B站分P视频(如62集课程),提交?p=36链接时,
字幕优先链路通过x/web-interface/view API拿cid时未传p参数,
默认取第1集cid,导致生成的是第1集的笔记。
同时yt-dlp正确下载了p36音频,但被跳过。

修复:
- url_parser新增extract_bilibili_p_number()提取URL中的p参数
- bilibili_subtitle的_get_cid()接收p参数,从data.pages[p-1]取对应分P的cid
- fetch_subtitles()调用extract_bilibili_p_number()透传p
2026-06-16 20:54:36 +08:00
Jianwu Huang
16a0dd4aec Merge pull request #406 from fivedang/fix/nginx-default-page 2026-06-15 10:30:43 +08:00
fivedang
39d051cc36 fix: nginx default page hijacks port 80 in Docker image
Two issues in Dockerfile.complete caused the nginx welcome page to appear
instead of the BiliNote UI:

1. /etc/nginx/sites-enabled/default had `listen 80 default_server` which
   took priority over the custom config in conf.d/
2. The nginx config proxied / to frontend:80, but the Dockerfile sed
   replaced it with 127.0.0.1:8080 where no service was running. The
   frontend is built as static files in /usr/share/nginx/html/.

Fix:
- Remove /etc/nginx/sites-enabled/default in Dockerfile
- Change location / to serve static files directly instead of proxying
- Remove the frontend proxy sed (no longer needed)
2026-06-15 00:19:54 +08:00
huangjianwu
71c931be55 Merge branch 'master' into develop 2026-06-07 02:09:05 +08:00
huangjianwu
f5bfb43619 docs(readme): 群二维码改为关注公众号回复「交流群」获取
将 README 社区区块中 5 个会过期的微信群二维码,替换为公众号二维码,
关注后回复「交流群」获取最新群码,避免群码失效。与关于页保持一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:09:03 +08:00
huangjianwu
24b4d4c57c Merge branch 'release/2.4.0' into develop 2026-06-07 02:05:37 +08:00
huangjianwu
ddaa0eef92 Merge branch 'release/2.4.0' v2.4.0 2026-06-07 02:05:37 +08:00
huangjianwu
e41a3e27eb chore(release): 2.4.0
- 版本号 2.3.4 → 2.4.0(tauri.conf.json / README)
- CHANGELOG 补充 2.4.0、回填 2.3.4

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 02:05:30 +08:00
huangjianwu
fd18aa2955 Merge branch 'pr-383' into develop 2026-06-07 02:03:40 +08:00
huangjianwu
0a93911f3e Merge branch 'docs/gpu-deploy-notes' into develop 2026-06-07 02:03:40 +08:00
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
e78b687096 fix(extension): improve title display and mindmap export 2026-05-26 21:15:39 +08:00
Loker
7d4573f84e fix(youtube): support shorts urls 2026-05-26 17:13:28 +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
64a0400792 docs(readme): 补全 GPU/CUDA 部署说明
原 CUDA 段落只有一行链接。补上实操步骤与常见坑:
- 宿主机前提:NVIDIA 驱动 + NVIDIA Container Toolkit + --gpus all 验证命令
- 切换:先 docker-compose down(两套 compose 容器名相同)再 -f docker-compose.gpu.yml up --build -d
- 数据不丢(两套 compose 都绑挂 ./backend);首次构建大而慢
- 只有本地 Faster Whisper 吃 GPU(在线引擎无关);device 自动检测无需配置
- 确认走 GPU 的方法 + 没走 GPU 的排查清单 + 国内镜像 build-arg 提示
另:把 compose 块里 GPU 那行 up -d 改成 up --build -d(首次需构建)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 21:51:47 +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