Skip to content

MAGI v2.2.1

Choose a tag to compare

@github-actions github-actions released this 25 Oct 05:55
· 1 commit to main since this release

MAGI v2.2.1 — 把「视频没法看」修掉

2.2.0 有一个能把视频彻底变废的回归:鼠标指针在画面上划过就快进/倒退,靠左竖滑还会一路改亮度。 这一版修掉它,另外补了两处相关的东西。

根因

两个播放器(libVLC 覆盖层 VideoOverlay、libVLC 不可用时的内置 <video> 回退层 VideoPlayer)都犯同一个错:手势处理里没有判断「鼠标是否按下」。

React 的 onPointerMove 挂的是 pointermove,指针只是划过、没有任何按键时也会连续触发。而手势状态里 x0 / y0 初始值是 0,于是 dx = clientX - 0 直接等于屏幕横坐标——鼠标随便挪一下就是几百像素的「位移」,一超过 14px 阈值就被判成「拖动进度」。竖向同理,左侧三分之一的竖滑被判成调亮度。

更糟的是 pointerup 只在真正按下后才来,所以这个错误的 seek 模式会一直挂着,直到你点一下鼠标才把累积的 dx 一次性提交——就是你看到的「视频自己跳走」。

修法

  • 手势判定抽成纯模块 src/video/gestureCore.ts,两个播放器共用。第一条规则就写在函数第一行:if (!g.down) return { type: 'ignore' }。没按下 = 什么都不许改。
  • 起判阈值 8px,防手抖误触。
  • 方向判定改对:原来是「谁的位移先超过 14px 谁赢」,斜着划一下就被判成 seek;现在要求横向幅度 大于纵向的 1.2 倍 才算拖动进度。
  • 状态复位统一走 gestureUp(),pointerup / pointercancel 都覆盖,手势不会残留到下一次。
  • 删掉 onDoubleClick:它和 pointerup 里的双击分区逻辑重复,双击一次会跳两次。
  • 新增 npm run test:gesture:28 条断言,纯 node 跑(--experimental-strip-types),不需要 Electron 也不需要浏览器。CI 已接入,回归会当场变红。

顺带

  • 内核降级不再静默:libVLC 加载失败时会退回内置 <video> 播放器(画面、手势都不同),以前一点提示都没有,用户只会觉得播放器坏了。现在右下角有角标「未加载 libVLC · 已退回内置播放器」,悬停能看到该检查哪个路径。
  • 自己遇到这个问题时先看一眼:如果视频是内置播放器(能看到左上角标题栏是网页样式、底部控制条也不一样),说明 resources/vlc/libvlc.dll 或开发期的 vendor/vlc/ 不在。跑一次 node scripts/fetch-vlc.mjs 就回来了。

现在的鼠标行为

操作 结果
不按键,随便划过 什么都不发生(只会把控制条唤出来)
按下 + 横向拖 拖动进度,松手提交
按下 + 竖向拖(右侧) 音量
按下 + 竖向拖(左侧三分区) 亮度(仅内置播放器,libVLC 层没有这一项)
单击 显示 / 隐藏控制条
双击左 / 右三分区 −10s / +10s
双击中间 全屏切换
按住不动 600ms 2x 快进,松开恢复

验证

  • npm run test:gesture → 28 / 28 通过
  • npx tsc --noEmit → 0 error
  • vite build → 通过
  • 未做:Electron 内的端到端手势验收(本机沙箱里 GPU 进程起不来,CDP 连上后 renderer 立刻崩)。scripts/probe-gesture.mjs 已经写好,在有桌面会话的机器上 npm run probe:gesture 可以直接跑那套 AI 验收。