Conversation
Implement a clean semantic-release configuration using dedicated branches for different release types: - main: stable releases (v1.0.0) - beta: beta prereleases (v1.0.0-beta.1) - alpha: alpha prereleases (v1.0.0-alpha.1) This replaces the complex environment variable approach with a simple and reliable branch-based strategy that eliminates configuration errors and makes the release process more predictable. Resolves the issue where specified version numbers like v1.0.0-alpha.1 were being ignored in favor of package.json versions.
# 1.0.0-alpha.1 (2025-09-08) ### Bug Fixes * **build:** correct alpha channel update file naming ([#79](#79)) ([95e2ed2](95e2ed2)) * **build:** 修复 Linux 构建产物架构命名转换问题 ([1f732ba](1f732ba)) * **ci:** resolve GitHub Release creation issue with always publish strategy ([#85](#85)) ([712f0e8](712f0e8)) * **ci:** resolve semantic-release configuration issues ([#88](#88)) ([0a9e4a3](0a9e4a3)) * **ci:** resolve Windows build shell syntax compatibility issue ([#84](#84)) ([59b8460](59b8460)) * fix type check ([eae1e37](eae1e37)) * Fix TypeScript build errors and improve type safety ([#77](#77)) ([7861279](7861279)) * **player:** integrate volume state in player engine context ([5ff32d9](5ff32d9)) * remove cheerio dependency to resolve Electron packaging issues - Remove cheerio and @types/cheerio from package.json dependencies - Replace cheerio-based HTML parsing with native regex implementation - Refactor parseEudicHtml() to parseEudicHtmlWithRegex() in dictionaryHandlers.ts - Support multiple HTML formats: list items, phonetics, examples, translations - Delete related test files that depend on cheerio - Fix TypeScript type errors for regex variables - Improve Electron runtime compatibility and reduce bundle size Fixes [#50](#50) ([b01fe4e](b01fe4e)) * **renderer:** resolve subsrt dynamic require issue in production build ([#78](#78)) ([028a8fb](028a8fb)) * resolve dead links in documentation and add missing pages ([fc36263](fc36263)) * **test:** resolve SubtitleLibraryDAO schema validation and test framework improvements ([#80](#80)) ([4be2b8a](4be2b8a)) * **titlebar:** keep title bar fixed at top during page scroll ([b3ff5c2](b3ff5c2)) * 优化文件路径处理逻辑以支持不同平台 ([dc4e1e3](dc4e1e3)) * 修复 settings 相关组件找不到的问题 ([08f88ba](08f88ba)) * 修复全屏模式下速度选择窗口溢出的问题 ([6309046](6309046)) * 修复在 Windows 上的 FFmpeg 文件下载和 ZIP 解压 ([6347b4e](6347b4e)) * 修复在启用单句循环模式下,无法调整到下一句的问题 ([ec479be](ec479be)) * 修复文件路径处理逻辑以支持不同的 file URL 前缀 ([740015d](740015d)) * 修复方向键冲突检测问题 ([4a466c7](4a466c7)) * 修复无法通过按钮退出全屏模式的问题 ([e69562b](e69562b)) * 修复构建产物架构冲突问题 ([2398bd7](2398bd7)) * 修复组件导出语句和优化字幕加载逻辑,移除未使用的状态 ([39708ce](39708ce)) * 删除上传到 cos 的步骤,因为网络波动问题上传失败 ([1cac918](1cac918)) * 在 UpdateNotification 组件中添加关闭对话框的逻辑,确保用户在操作后能够顺利关闭对话框 ([845a070](845a070)) * 始终在脚本直接执行时运行主函数,确保功能正常 ([a15378a](a15378a)) * 忽略依赖项警告 ([fc3f038](fc3f038)) * 更新主题样式,使用 token 中的 zIndex 替代硬编码值 ([3940caf](3940caf)) * 更新测试文件中的 useTheme 和 useVideoPlaybackHooks 的路径 ([4fa9758](4fa9758)) * 移除构建和发布工作流中的空选项,始终将草稿发布设置为 true,以确保发布过程的一致性 ([171028a](171028a)) ### Features * add API communication type definitions and unified export ([ea9f1c0](ea9f1c0)) * add common base type definitions and interfaces for application ([73bd604](73bd604)) * add debounce hooks and corresponding tests ([7646088](7646088)) * add domain type definitions and constants for video, subtitle, playback, and UI ([a1c3209](a1c3209)) * add git hooks with lint-staged for automated code quality checks ([1311af9](1311af9)) * add handler to read directory contents ([6ce1d9e](6ce1d9e)) * add IPC Client Service implementation with integration tests ([fe4400f](fe4400f)) * add performance optimization hooks and corresponding tests ([d7e1d0f](d7e1d0f)) * add selectors for subtitle, UI, and video states with computed properties and hooks ([c64f41d](c64f41d)) * Add service layer type definitions for storage, video, subtitle, and dictionary services ([c658217](c658217)) * add subtitle, UI, and video state actions for V2 ([1a4042a](1a4042a)) * add unified export for V2 infrastructure layer type system ([ad94ea8](ad94ea8)) * add V2 state stores with type-safe validation and comprehensive documentation ([264cc66](264cc66)) * **api:** add request and response type definitions for video, subtitle, file operations, and playback settings ([c0e9324](c0e9324)) * **AutoResumeCountdown:** add auto-dismissal when playback manually resumed ([3852bca](3852bca)) * **ci:** implement semantic-release with three-branch strategy ([#89](#89)) ([c39da6e](c39da6e)) * **ci:** integrate semantic-release automation with GitHub workflow ([#87](#87)) ([874bd5a](874bd5a)) * **ci:** migrate from action-gh-release to native electron-builder publishing ([#82](#82)) ([eab9ba1](eab9ba1)) * comprehensive auto-update system implementation ([#73](#73)) ([0dac065](0dac065)) * **ControllerPanel:** add disabled state for Loop and AutoPause controls when subtitles are empty ([a35f3e6](a35f3e6)) * **ControllerPanel:** implement centralized menu management system for player controls ([1523758](1523758)) * **db:** implement complete SQLite3 database layer with migrations and DAOs ([0a8a7dd](0a8a7dd)) * **db:** migrate from Dexie to Kysely with better-sqlite3 backend ([6b75cd8](6b75cd8)) * define domain types for video, subtitle, and UI, and refactor RecentPlayItem interface imports ([f632beb](f632beb)) * enhance macOS build configuration with additional entitlements and notarization support ([d6e8ced](d6e8ced)) * **home:** implement empty state with video file selection integration ([b6f6e40](b6f6e40)) * Implement dictionary engine framework ([0d74a83](0d74a83)) * implement useThrottle hooks and corresponding tests ([da30344](da30344)) * implement version parsing and channel mapping logic ([8c95a2f](8c95a2f)) * **infrastructure:** add entry points for constants and shared modules, and refine video playback rate type ([94da255](94da255)) * **logger:** export logger instance for easier access in modules ([5328152](5328152)) * **persistence:** add V2 state persistence manager and configuration files ([a545020](a545020)) * **playback:** update playback rate label for clarity and add storage type definitions ([5c40b98](5c40b98)) * player page ([aa79279](aa79279)) * **player,logging,state:** orchestrated player engine with intent strategies and new controller panel ([73d7cfd](73d7cfd)) * **player:** add Ctrl+] shortcut for subtitle panel toggle ([#69](#69)) ([e1628f2](e1628f2)) * **player:** hide sidebar and optimize navbar for player page ([#70](#70)) ([5bb71e4](5bb71e4)) * **player:** implement auto-resume countdown with UI notification ([5468f65](5468f65)) * **player:** reposition progress bar between video and controls ([#71](#71)) ([248feed](248feed)) * refine RecentPlayItem interface with detailed video info and playback metrics ([81679b6](81679b6)) * setup GitHub Pages deployment for documentation ([b8a42b9](b8a42b9)) * **sidebar:** 禁用收藏按钮并添加开发中提示 ([#81](#81)) ([76e9b54](76e9b54)) * **SplashScreen:** add animated splash screen with typewriter effect and smooth transitions ([31cfeca](31cfeca)) * **state.store:** 新增多个 store ([54e7ff5](54e7ff5)) * **state:** implement V2 state management infrastructure with storage engine, middleware, and utility functions ([e225746](e225746)) * **storage:** implement application configuration storage service ([1209b56](1209b56)) * **subtitle-library:** Add subtitle data caching for improved loading performance ([#86](#86)) ([40be325](40be325)) * **SubtitleContent:** implement word-level tokenization and interactive text selection ([10c0cdf](10c0cdf)) * **types:** add Serializable interface for flexible data structures ([32981df](32981df)) * update macOS notarization configuration to enable automatic notarization ([6630e79](6630e79)) * **video.store:** add format property to CurrentVideoState and update video loading simulation ([0349a63](0349a63)) * **VolumeControl:** change volume popup from horizontal to vertical layout ([d4d435b](d4d435b)) * **wsl:** add WSL detection and hardware acceleration optimization ([c99403e](c99403e)) * 为字幕组件新增右键菜单功能 ([62334d5](62334d5)) * 为音量控制组件添加音量调节快捷键 ([144d49c](144d49c)) * 优化 PlayPage 组件性能,减少不必要的重新渲染;重构播放状态管理逻辑,提升用户体验 ([24a2ebc](24a2ebc)) * 优化最近观看记录加载状态显示 ([e5f7e11](e5f7e11)) * 优化单词查询逻辑,增加超时处理和取消请求功能,提升用户体验和性能 ([c98dc4b](c98dc4b)) * 优化字幕列表滚动体验 ([63807c5](63807c5)) * 优化字幕控制功能,新增字幕模式选择器,提升用户交互体验;重构相关组件,移除不必要的代码,简化逻辑 ([559aada](559aada)) * 优化字幕文本分段逻辑 ([33e591c](33e591c)) * 优化字幕模式选择器组件,增强用户体验和视觉一致性,添加响应式设计和毛玻璃效果 ([4b59a1b](4b59a1b)) * 优化快捷键设置界面,增强输入状态反馈,更新样式以提升用户体验和一致性 ([64db31c](64db31c)) * 优化日志记录功能,新增组件渲染节流和数据简化处理,提升性能和可读性 ([a6e8480](a6e8480)) * 优化标题栏平台信息处理 ([fb5a470](fb5a470)) * 优化视频卡片和视频网格组件的样式与布局 ([af59b44](af59b44)) * 优化词典查询逻辑,增加未找到释义时的警告提示,并调整相关代码结构 ([9f528bd](9f528bd)) * 优化进度条handler显示和对齐 ([77d0496](77d0496)) * 在 FullscreenTestInfo 组件中新增折叠功能 ([b2eac46](b2eac46)) * 在 HomePage 组件中新增音频兼容性诊断功能,优化视频播放体验;更新视频兼容性报告以支持音频编解码器检测;重构相关逻辑以提升代码可读性和维护性 ([3cac307](3cac307)) * 在 SubtitleListContent 组件中引入 rc-virtual-list 以优化字幕列表渲染性能,增强自动滚动功能 ([30165dc](30165dc)) * 在 UpdatePromptDialog 组件中添加内容展开/折叠功能 ([96d9b1f](96d9b1f)) * 在构建和发布工作流中添加Windows、Mac和Linux平台的上传步骤,优化版本变量设置和上传路径逻辑 ([3cfacb9](3cfacb9)) * 在构建和发布工作流中添加更新 package.json 版本的步骤,确保版本号自动更新;优化草稿发布条件以支持预发布版本 ([a78fbc7](a78fbc7)) * 在构建和发布工作流中添加测试构建选项,更新版本变量设置和上传路径逻辑 ([2848f92](2848f92)) * 在视频上传时重置字幕控制状态,新增重置状态功能;更新快捷键设置以支持单句循环功能,优化用户体验 ([688dcd6](688dcd6)) * 增强全屏模式下的样式支持 ([94a77b1](94a77b1)) * 增强全屏模式的快捷键支持 ([218882c](218882c)) * 增强字幕显示组件,新增中文字符检测和智能文本分割功能,优化用户交互体验 ([8cd50d9](8cd50d9)) * 增强字幕空状态组件,支持拖拽文件导入 ([db1f608](db1f608)) * 增强字幕组件交互功能 ([3e7e8c7](3e7e8c7)) * 增强字幕组件和文本选择功能 ([36c44aa](36c44aa)) * 增强快捷键设置功能,新增快捷键冲突检查和平台特定符号显示,优化用户输入体验和界面样式 ([bde034b](bde034b)) * 增强更新通知系统,添加红点提示和用户交互逻辑 ([fdf4c81](fdf4c81)) * 增强版本比较逻辑,优化更新通知系统 ([f29a25f](f29a25f)) * 增强视频兼容性模态框功能,支持初始步骤和分析结果 ([3aba45c](3aba45c)) * 多平台构建和发布 ([cc521ea](cc521ea)) * 实现动态 electron-updater 渠道配置 ([28d2836](28d2836)), closes [#3](#3) * 将发布提供者从 generic 更改为 github,更新仓库和所有者信息,以支持自动更新功能 ([b6d4076](b6d4076)) * 引入常量以支持视频容器格式检查 ([da68183](da68183)) * 新增 AimButton 组件以支持手动定位当前字幕并启用自动滚动;更新 SubtitleListContent 组件以集成 AimButton,优化用户滚动体验与字幕自动滚动逻辑 ([3c8a092](3c8a092)) * 新增 AppHeader 组件并更新样式,调整导航菜单布局以提升用户体验 ([94e35c3](94e35c3)) * 新增 cmd-reason.mdc 文件并更新 cmd-refactor-theme.mdc 规则 ([43d2222](43d2222)) * 新增 E2E 测试用例和文件选择器助手 ([9928349](9928349)) * 新增 git commit 内容生成规则文件 ([6e0ee23](6e0ee23)) * 新增主题系统 ([369d828](369d828)) * 新增全屏模式支持 ([e8c9542](e8c9542)) * 新增全屏视频进度条组件并重构视频控制逻辑 ([7fc587f](7fc587f)) * 新增划词选中和快捷复制功能 ([9e22b44](9e22b44)) * 新增单词卡片组件,支持单词点击后显示详细信息和发音功能;优化字幕显示样式,提升用户交互体验 ([c6a4ab6](c6a4ab6)) * 新增字幕列表上下文及相关钩子,重构播放页面以使用新的字幕管理逻辑,提升代码可读性与功能性 ([7766b74](7766b74)) * 新增字幕列表项样式并禁用焦点样式 ([654a0d1](654a0d1)) * 新增字幕布局锁定功能 ([82e75dc](82e75dc)) * 新增字幕模式覆盖层组件及相关逻辑 ([e75740c](e75740c)) * 新增字幕空状态组件和外部链接打开功能 ([5bd4bd6](5bd4bd6)) * 新增字幕组件样式,重构相关组件以支持主题系统,提升视觉一致性和用户体验 ([822cb74](822cb74)) * 新增字幕重置功能,优化字幕设置管理;重构相关组件以提升用户体验和代码可维护性 ([f4702a5](f4702a5)) * 新增存储管理功能,添加最近播放项的增删改查接口,优化用户体验;重构相关组件,提升代码结构与可维护性 ([a746ed3](a746ed3)) * 新增当前字幕显示上下文管理,优化字幕点击交互逻辑,确保用户体验流畅;重构相关组件以提升代码可维护性 ([91a215d](91a215d)) * 新增快捷键设置模态框和快捷键显示组件,优化用户输入体验 ([b605257](b605257)) * 新增控制弹窗样式并优化字幕模式选择器的交互体验;重构相关组件以提升代码可读性和用户体验 ([79eabdf](79eabdf)) * 新增播放设置上下文,重构相关组件以支持播放设置的管理;更新播放页面以使用新的播放设置上下文,提升代码可读性与功能性 ([6fe8b4f](6fe8b4f)) * 新增播放速度覆盖层和相关功能 [#1](#1) ([d8637eb](d8637eb)) * 新增数据清理功能,优化日志记录中的数据序列化,确保记录的日志信息更为准确和安全 ([8ada21a](8ada21a)) * 新增数据目录管理功能 ([2c93e19](2c93e19)) * 新增日志系统,集成 electron-log 以支持主进程和渲染进程的日志记录;更新相关 API 以便于日志管理和调试 ([1f621d4](1f621d4)) * 新增智能分段功能及相关测试 ([f5b8f5c](f5b8f5c)) * 新增视频UI配置管理功能 ([eaf7e41](eaf7e41)) * 新增视频管理组件和确认模态框 ([4263c67](4263c67)) * 新增视频转码功能及兼容性警告模态框 ([4fc86a2](4fc86a2)) * 新增第三方服务配置组件,整合 OpenAI 和词典服务设置,优化用户界面和交互体验;引入模块化样式,提升整体一致性 ([3e45359](3e45359)) * 新增获取所有字幕的功能,优化字幕查找逻辑以支持根据当前时间查找上下句字幕,提升用户体验 ([04c5155](04c5155)) * 新增词典服务相关的 IPC 处理器,支持有道和欧陆词典的 API 请求;实现 SHA256 哈希计算功能,增强应用的词典查询能力 ([707ee97](707ee97)) * 新增边距验证逻辑,优化字幕拖拽和调整大小功能,确保字幕区域不超出容器边界 ([2294bcf](2294bcf)) * 更新 AppHeader 组件,增加背景装饰、应用图标和名称,优化导航按钮和辅助功能按钮的样式,提升用户体验 ([651c8d7](651c8d7)) * 更新 AppHeader 组件,调整文本样式和名称,提升视觉效果 ([f208d66](f208d66)) * 更新 GitHub Actions 工作流和文档,支持更多发布文件 ([c4bf6f7](c4bf6f7)) * 更新 index.html 文件,修改内容安全策略以支持新的脚本源,添加本地开发服务器的支持,优化页面加载逻辑 ([8c11edf](8c11edf)) * 更新 PlaybackRateSelector 组件样式和文本 ([034e758](034e758)) * 更新 SubtitleListContent 组件,替换 rc-virtual-list 为 react-virtualized,优化字幕列表渲染性能与用户体验;调整样式以适配虚拟列表,增强滚动效果与响应式设计 ([63d9ef4](63d9ef4)) * 更新 SubtitleListContent 组件,添加激活字幕索引状态以优化渲染逻辑;重构字幕项组件以减少不必要的重渲染并提升性能;增强自动滚动逻辑,确保用户体验流畅 ([c997109](c997109)) * 更新E2E测试,移除冗余测试用例并优化测试ID使用 ([51fd721](51fd721)) * 更新E2E测试配置,添加Linux虚拟显示器支持并检查构建输出 ([ac1999f](ac1999f)) * 更新主题系统,新增字体粗细、间距、圆角等设计令牌,优化组件样式一致性 ([62f87dd](62f87dd)) * 更新侧边栏导航功能和禁用状态提示 ([d41b25f](d41b25f)) * 更新最近播放项管理,使用文件ID替代原有ID,新增根据文件ID获取最近播放项的功能,优化播放设置管理,提升代码可维护性 ([920856c](920856c)) * 更新图标文件,替换Mac和Windows平台的图标,优化SVG图标文件结构 ([bfe456f](bfe456f)) * 更新图标资源,替换 PNG 格式图标并新增 SVG 格式图标,提升图标的可扩展性与清晰度 ([8eaf560](8eaf560)) * 更新字典引擎设置,默认选择为 'eudic-html',提升用户体验 ([ebaa5d2](ebaa5d2)) * 更新字幕上下文菜单,优化重置按钮状态和样式 ([cc542f2](cc542f2)) * 更新字幕列表项组件,添加注释以说明仅展示学习语言,优化双语字幕显示逻辑 ([89e2b33](89e2b33)) * 更新字幕加载功能,新增对 ASS/SSA 格式的支持;优化字幕文件扩展名和解析逻辑,提升用户体验 ([9cab843](9cab843)) * 更新字幕加载模态框样式,新增加载状态提示与取消功能;重构相关逻辑以提升用户体验与代码可读性 ([1f8442a](1f8442a)) * 更新字幕展示组件样式,添加浮动控制按钮及其样式,优化响应式设计 ([ac586e2](ac586e2)) * 更新字幕控制功能,添加自动暂停选项,修改快捷键设置,优化相关逻辑和组件交互 ([428e4cf](428e4cf)) * 更新字幕模式选择器,整合字幕显示模式的获取逻辑,优化状态管理,增强调试信息 ([c2d3c90](c2d3c90)) * 更新循环播放设置,支持无限循环和自定义次数 ([e6c5d2e](e6c5d2e)) * 更新快捷键设置,修改单句循环和字幕导航的快捷键,优化用户体验 ([ce66e62](ce66e62)) * 更新总结规则,启用始终应用选项;新增指令处理逻辑以提取项目开发指导内容并编写开发文档,确保文档规范性 ([d627e2e](d627e2e)) * 更新构建产物处理逻辑,支持多架构文件重命名和 YAML 文件引用更新 ([e206e1d](e206e1d)) * 更新构建配置,支持多架构构建和文件重命名 ([17b862d](17b862d)) * 更新样式文件,优化警告框和卡片组件的视觉效果,增强响应式设计支持 ([ea6b4ab](ea6b4ab)) * 更新滚动条样式以支持 WebKit 规范 ([224f41d](224f41d)) * 更新视频上传钩子,使用日志系统记录视频DAR信息和错误警告,提升调试能力 ([2392b38](2392b38)) * 更新视频兼容性模态框样式,提升用户体验 ([f5c1ba5](f5c1ba5)) * 更新视频播放器和播放状态管理逻辑,重构字幕处理方式,统一使用 subtitleItems 以提升代码一致性与可读性;优化播放状态保存与恢复机制,确保更流畅的用户体验 ([0cbe11d](0cbe11d)) * 更新视频播放器的时间跳转逻辑,支持来源标记 ([f170ff1](f170ff1)) * 更新视频文件信息样式,添加文件名截断功能,优化头部布局以提升用户体验 ([a6639f1](a6639f1)) * 更新窗口管理和标题栏组件,优化样式和功能 ([a1b50f6](a1b50f6)) * 更新窗口管理器的窗口尺寸和最小尺寸,优化用户界面;移除不必要的响应式设计样式,简化 CSS 结构 ([dd561cf](dd561cf)) * 更新第三方服务配置组件,修改标签和提示文本为中文,增强用户友好性;新增申请应用ID和密钥的链接提示,提升信息获取便利性 ([5e68e85](5e68e85)) * 更新设置导航组件样式和功能 ([535f267](535f267)) * 更新设置页面,移除视频转换相关功能 ([0d96fac](0d96fac)) * 更新设置页面,简化快捷键和数据管理部分的渲染逻辑,新增存储设置选项,优化用户界面和交互体验 ([9942740](9942740)) * 更新设置页面样式和主题支持 ([816ca6d](816ca6d)) * 更新设置页面的按钮样式和移除音频兼容性警告 ([f0be1e2](f0be1e2)) * 更新通知系统优化,增强用户交互体验 ([6df4374](6df4374)) * 更新页面渲染逻辑,添加页面冻结功能,确保首页始终挂载并优化其他页面的条件渲染,提升用户体验 ([7a4b2ba](7a4b2ba)) * 替换应用头部为侧边栏组件 ([0e621fc](0e621fc)) * 沉浸式标题栏 ([9c7c7d9](9c7c7d9)) * 添加 @ant-design/v5-patch-for-react-19 支持 React19 ([95d1019](95d1019)) * 添加 Stagewise 工具栏支持,仅在开发模式下初始化,更新 CSP 设置以允许外部样式源 ([ededb64](ededb64)) * 添加Codecov配置文件,更新测试配置以支持覆盖率报告上传 ([d9ec00d](d9ec00d)) * 添加E2E测试支持,更新Playwright配置和相关脚本 ([247b851](247b851)) * 添加全屏功能支持,优化视频播放器组件,更新样式以移除不必要的自定义样式,提升用户体验 ([a7d4b1c](a7d4b1c)) * 添加字幕控制组件,支持单句循环和自动循环功能,更新快捷键设置,优化样式和响应式设计 ([2902f2d](2902f2d)) * 添加应用图标 ([b86e142](b86e142)) * 添加应用图标并优化代码中的事件监听和清理逻辑 ([c39da08](c39da08)) * 添加当前字幕展示组件,支持多种字幕显示模式及单词hover交互,优化视频控制区样式和响应式设计 ([df4b74a](df4b74a)) * 添加循环播放功能,支持自定义循环次数设置 ([1dbccfa](1dbccfa)) * 添加文件系统相关的 IPC 处理器,支持文件存在性检查、读取文件内容、获取文件 URL、文件信息获取及文件完整性验证;更新 preload 和 renderer 逻辑以支持视频和字幕文件的选择与恢复功能,优化用户体验 ([6d361eb](6d361eb)) * 添加更新通知和提示对话框组件 ([38df4d2](38df4d2)) * 添加更新通知跳过版本功能,优化用户体验 ([165adb6](165adb6)) * 添加本地更新测试环境脚本和相关功能 ([00aa019](00aa019)) * 添加构建产物重命名和验证脚本 - 新增 rename-artifacts.ts 用于重命名构建产物以符合发布要求 - 新增 verify-build-artifacts.ts 用于验证构建产物的存在性和完整性 ([696cedc](696cedc)) * 添加构建和发布工作流,更新测试和发布脚本 ([2744005](2744005)) * 添加欧陆词典HTML解析服务和单元测试框架 ([52ace3e](52ace3e)) * 添加测试Electron CDP连接的脚本 ([9982514](9982514)) * 添加版本管理脚本,支持版本类型检测和版本号递增功能;更新构建和发布工作流,优化版本变量设置和上传路径逻辑;新增发布指南文档,详细说明版本管理和发布流程 ([282bde8](282bde8)) * 添加视频播放器点击事件处理,优化用户交互体验 ([69c378f](69c378f)) * 添加视频文件选择加载状态和清空确认模态框 ([ca95a7d](ca95a7d)) * 添加视频格式转换功能,新增视频兼容性检测与转换指南,优化视频播放器与文件上传逻辑,提升用户体验;重构相关组件,简化代码结构 ([5fd89fe](5fd89fe)) * 添加腾讯云COS上传功能,支持发布文件和自动更新文件的上传 ([e79e5a9](e79e5a9)) * 添加自动更新功能,整合更新处理器,更新设置界面,支持版本检查和下载 ([5e5a03e](5e5a03e)) * 添加页面切换过渡效果,优化播放页面与性能监控功能;重构相关组件,提升用户交互体验与代码结构 ([e583ecc](e583ecc)) * 添加页面导航功能,重构 App 组件以支持多页面切换,新增关于、收藏、设置等页面,优化样式和用户体验 ([51f4263](51f4263)) * 添加高效测试标识符管理指南及相关工具函数,优化E2E测试中的测试ID使用 ([2dcfe5e](2dcfe5e)) * 现代化视频控制组件,优化样式和交互逻辑,增强用户体验;添加音量和设置控制,支持自动隐藏功能 ([dc45b83](dc45b83)) * 移除 HomePage 组件中的 subtitleIndex 属性,优化视频播放状态管理逻辑;调整视频网格布局以提升用户界面的一致性与可读性 ([8f54e7f](8f54e7f)) * 移除 PlayPageHeader 的 CSS 模块,改为使用主题系统样式管理,提升组件的可维护性和一致性 ([52cedbc](52cedbc)) * 移除 useSidebarResize 钩子及相关样式,改用 Ant Design 的 Splitter 组件实现侧边栏调整功能,优化播放页面布局与用户体验 ([bead645](bead645)) * 移除字幕位置控制相关组件及其逻辑,简化视频控制界面以提升用户体验 ([1edc857](1edc857)) * 移除字幕设置相关功能和组件 ([32f0138](32f0138)) * 移除推荐视频假数据,更新欢迎信息,优化首页布局和用户体验 ([78b000f](78b000f)) * 移除视频播放器和播放控制钩子,简化代码结构以提升可维护性 ([513ba3c](513ba3c)) * 移除视频播放器的响应式设计中不必要的内边距,简化 CSS 结构 ([f8c8c28](f8c8c28)) * 调整 HomePage 组件的响应式布局,优化列宽设置以提升用户体验 ([3c435bf](3c435bf)) * 调整主题样式宽度 ([2fe9ff2](2fe9ff2)) * 调整全屏视频控制组件的进度条位置和样式 ([679521f](679521f)) * 调整字幕覆盖层样式,修改底部位置为0%,移除移动端特定样式,简化 CSS 结构 ([515151d](515151d)) * 重命名视频控制组件为 VideoControlsFullScreen,更新相关导入,提升代码可读性 ([0fe7954](0fe7954)) * 重构 SidebarSection 和 SubtitleListContent 组件,简化属性传递,增强字幕索引处理逻辑,优化自动滚动功能;新增获取指定时间点字幕索引的功能,提升用户体验与代码可读性 ([dabcbeb](dabcbeb)) * 重构字幕控制组件样式,使用主题系统优化按钮和图标样式,提升视觉一致性和用户体验 ([12e38f2](12e38f2)) * 重构字幕状态管理,新增视频特定字幕设置 ([ff5b5de](ff5b5de)) * 重构字幕组件,新增字幕覆盖层和文本组件,优化字幕显示逻辑和性能;移除旧版字幕组件,提升代码可维护性 ([4fbef84](4fbef84)) * 重构存储处理器模块,优化应用配置和通用存储功能 ([065c30d](065c30d)) * 重构存储管理功能,更新最近播放项的类型定义,优化播放设置管理,增强用户体验;新增播放设置的深度合并逻辑,提升代码可维护性 ([3f928d4](3f928d4)) * 重构应用布局与样式,新增主页与播放页面组件,优化用户交互体验;整合最近文件管理功能,提升视频文件选择与加载逻辑 ([f3fefad](f3fefad)) * 重构循环切换功能,简化状态管理和播放逻辑 ([fe11037](fe11037)) * 重构播放状态管理,替换为使用最近播放列表钩子,简化参数传递并优化代码逻辑;新增最近播放列表钩子以支持播放项的增删改查功能 ([1ec2cac](1ec2cac)) * 重构播放页面,整合视频播放器与字幕控制逻辑,新增 VideoPlayerProvider 以管理视频播放状态,优化组件结构与性能;移除不再使用的 SubtitleControls 组件,简化属性传递,提升代码可读性 ([e4111c9](e4111c9)) * 重构视频控制组件,新增全屏控制样式与逻辑,优化播放控制体验;更新相关类型定义,提升代码可读性与功能性 ([5c72a1b](5c72a1b)) * 重构视频播放上下文,新增视频文件上传和选择功能;更新相关组件以支持新的上下文逻辑,提升代码可读性与功能性 ([37e128e](37e128e)) * 重构视频播放器组件,移除 CSS Modules,采用主题系统样式管理,提升代码可维护性和一致性 ([b3981bc](b3981bc)) * 重构视频播放器逻辑,整合视频播放状态管理,优化组件结构;移除不再使用的 usePlayingVideoContext 钩子,新增多个视频控制钩子以提升性能与可读性 ([b1a6dc2](b1a6dc2)) * 重构视频播放设置管理,整合字幕显示设置,优化状态管理逻辑,提升用户体验和代码可维护性 ([6c3d852](6c3d852)) * 重构设置页面,新增快捷键、数据管理和占位符组件,优化用户界面和交互体验;引入快捷键上下文管理,支持自定义快捷键功能 ([a498905](a498905)) ### Reverts * Revert "build: 在构建和发布工作流中添加调试步骤,列出下载的文件并检查Windows、Mac和Linux平台的自动更新配置文件是否存在" ([d0f8fc4](d0f8fc4)) * Revert "chore: 更新 Linux 构建环境配置" ([cc179a0](cc179a0)) * Revert "feat: 在构建和发布工作流中添加更新 package.json 版本的步骤,确保版本号自动更新;优化草稿发布条件以支持预发布版本" ([be1cf26](be1cf26)) ### BREAKING CHANGES * **player,logging,state:** - Removed TransportBar and deprecated hooks (usePlayerControls/useVideoEvents/useSubtitleSync). Migrate to ControllerPanel with usePlayerEngine/usePlayerCommandsOrchestrated. - Player store control actions are engine-only; components should send commands via the orchestrator instead of mutating store directly.
* fix(ci): resolve duplicate GitHub releases issue - Remove duplicate release creation by electron-builder - Let semantic-release handle single release creation with proper descriptions - Configure semantic-release to upload artifacts from electron-builder - Ensure single release with semantic description and electron artifacts * feat(ci): optimize release workflow trigger options - Limit manual force_version_type to dev/test only - Auto-determine version type based on branch: - main branch → stable - beta branch → beta - alpha branch → alpha - Fallback to version string detection for edge cases - Improve workflow clarity and prevent manual errors
* refactor(ci): simplify release workflow by removing force version type
Remove force_version_type input parameter and related logic from release workflow.
Version type is now determined solely by branch name (main=stable, beta=beta, alpha=alpha).
This simplifies the workflow and removes the manual override option that was only intended for dev/test.
* fix(build): correct releaseName variable interpolation in electron-builder
Remove single quotes around releaseName to allow proper ${version} variable
interpolation. This fixes the issue where releaseName was showing literal
'EchoPlayer v${version}' instead of the actual version number.
- Replace custom labels with original artifact filenames for consistency - Simplify asset configuration from object format to string format - Remove platform-specific labels that obscured actual file names - Update Windows portable archive pattern from *-win.zip to *.zip - Remove macOS zip assets to match actual build output This change ensures GitHub Release asset names match the actual filenames generated by electron-builder, providing clearer identification of downloadable artifacts without confusing custom labels.
- Add defaultValues object to centralize all configuration default values - Replace inline default values in all getter methods with references to defaultValues - Improve get() method to use defaultValues as fallback when defaultValue param is not provided - Enhance maintainability and consistency of default value management
- Add alpha and beta branches to pull request triggers - Ensures CI tests run on all main development branches
- Remove WatchedIndicator component and its associated CheckIcon - Clean up unused styled-components for watched status display - Simplify video thumbnail overlay by removing watch completion visual feedback - Remove conditional rendering logic for watchProgress >= 1 state This refactoring removes the green checkmark indicator that previously showed on video thumbnails when watch progress reached 100%, streamlining the video card interface and reducing visual complexity.
…tion (#97) * refactor(db-migrate): Remove old db migrations dir * fix: remove path unique constraint to allow duplicate video file addition - Create database migration to remove UNIQUE constraint on files.path column - Simplify FileManager.addFile() to directly add files without duplicate checks - Update user feedback message to inform about duplicate file support - Add test case for duplicate file addition functionality - Update VideoAddButton test to use correct service method names This resolves the issue where adding the same video file twice would fail with a UNIQUE constraint violation. Users can now add the same video file multiple times as separate records in the database.
* feat: replace FFmpeg with MediaInfo for video metadata extraction - Add mediainfo.js WebAssembly support for lightweight video analysis - Create MediaInfoService with intelligent duration format detection - Update IPC channels and preload API for MediaInfo integration - Implement fallback strategy: MediaInfo (preferred) -> FFmpeg (backup) - Add comprehensive WASM file handling with vite-plugin-static-copy - Update test cases to cover MediaInfo priority and fallback scenarios - Improve duration parsing with smart milliseconds/seconds detection - Reduce dependency size from ~100MB+ (FFmpeg) to ~3MB (MediaInfo WASM) - Maintain full backward compatibility with existing FFmpegVideoInfo interface Performance improvements: - Faster video file processing with WebAssembly - No external process spawning overhead - Better error handling and detailed logging - Streaming file reading for memory efficiency This change addresses commercial licensing concerns with FFmpeg while providing superior performance and maintainability. * fix(build): resolve Windows build failure for MediaInfo WASM file - Simplify vite-plugin-static-copy path configuration for cross-platform compatibility - Add WASM files to electron-builder asarUnpack configuration - Enhance MediaInfoService WASM file path resolution with multiple fallback paths - Ensure MediaInfoModule.wasm is properly accessible at runtime on all platforms Fixes issue where Windows CI builds failed with "No file was found to copy" error for MediaInfoModule.wasm during vite-plugin-static-copy execution.
# [1.0.0-alpha.3](v1.0.0-alpha.2...v1.0.0-alpha.3) (2025-09-08) ### Bug Fixes * **release:** remove custom labels from GitHub release assets ([#92](#92)) ([f066209](f066209)) * remove path unique constraint to allow duplicate video file addition ([#97](#97)) ([237dd30](237dd30)) ### Features * **ci:** add alpha and beta branch support to test workflow ([#94](#94)) ([a47466b](a47466b)) * replace FFmpeg with MediaInfo for video metadata extraction ([#95](#95)) ([2f64029](2f64029))
…test defaults (#98) - Fix AppUpdater to respect specified channel instead of forcing LATEST channel - Add dynamic test channel defaults based on application version (alpha/beta detection) - Update ConfigManager with version-aware default configuration logic - Enhance i18n translations for auto-update and test plan settings across languages Changes: - AppUpdater.ts: Remove hardcoded LATEST channel override, use specified channel - ConfigManager.ts: Add getVersionBasedDefaults() for dynamic test configuration - package.json: Version rollback for testing purposes - i18n locales: Updated translations for auto-update and beta testing program This fix ensures proper channel handling for alpha/beta releases and provides appropriate default test settings based on the application version identifier
#99) - Add useHoverMenu hook with configurable delays and event handling - Integrate hover menu functionality across all control components (CaptionsButton, LoopControl, PauseControl, PlaybackRateControl, VolumeControl) - Update CaptionsButton with internationalized UI text and improved accessibility - Enhance FullscreenButton with proper i18n key paths - Refactor control components to use ControlContainer for consistent layout - Add comprehensive hover interaction patterns with 200ms open delay and 100ms close delay - Maintain backward compatibility with existing click-to-toggle behavior - Improve user experience with seamless hover-to-reveal menu functionality Changes: - Add useHoverMenu.ts: Generic hover menu hook with timeout management - Update all control components to integrate hover menu behavior - Reorganize i18n structure for better player control translations - Enhance control styles for consistent hover menu presentation This implementation provides a more intuitive user experience where users can hover over control buttons to quickly access settings without requiring clicks, while preserving the existing click behavior for primary actions.
# [1.0.0-alpha.4](v1.0.0-alpha.3...v1.0.0-alpha.4) (2025-09-08) ### Bug Fixes * **updater:** resolve auto-update channel handling and version-based test defaults ([#98](#98)) ([e30213b](e30213b)) ### Features * **player:** implement hover menu system for control panel components ([#99](#99)) ([526e71a](526e71a))
#100) * feat(player): implement favorite playback rates with hover menu system - Add favorite rates database schema and migration with JSON storage - Implement favorite rates selection in PlaybackSettings with multi-select - Add PlaybackRateControl hover menu with favorite rate toggling (Ctrl+click) - Integrate keyboard shortcuts (Shift+[ / Shift+]) for rate cycling - Add comprehensive i18n support for selectedItems and favorite rates - Extend player store with favorite rate management and persistence - Update settings store with defaultFavoriteRates configuration Database changes: - Add favoriteRates column to playerSettings table (JSON array string) - Add migration with proper rollback for SQLite compatibility - Update schemas with JsonStringSchema validation UI improvements: - Visual indicators for favorite rates (warning color theme) - Context menu and keyboard shortcuts for rate management - Multi-select dropdown for settings configuration - Hover menu system integration with existing controls State management: - Add favorite rate cycling logic with index tracking - Persist favorite rates per video with global defaults fallback - Integrate with existing player commands and shortcuts system This implementation provides a complete favorite playback rates feature allowing users to customize frequently used rates both globally and per-video, with intuitive UI controls and keyboard shortcuts for efficient rate switching * refactor(player): improve type safety and code maintainability - Add explicit number type conversion for favoriteRates array elements in player store - Refactor shortcut key mapping to use dynamic generation from key array - Update PLAYBACK_RATE_PRESETS to explicit number[] type annotation - Simplify PlayerSettingsSaver to use full state instead of manual slicing Changes: - player.store.ts: Wrap favoriteRates array access with Number() conversion to ensure type safety - label.ts: Replace static shortcutKeyMap object with dynamic generation using reduce() - playback.const.ts: Add explicit number[] type annotation for better type inference - PlayerSettingsSaver.ts: Remove manual property selection in favor of full state casting This refactoring improves type safety, reduces code duplication, and enhances maintainability while preserving existing functionality. The dynamic key mapping approach eliminates manual repetition and ensures consistency across i18n keys.
* feat(ui): enhance video selection clarity in library view - Add currently playing indicator with visual feedback on video cards - Implement blue border and shadow effects for active video - Add subtitle information showing file directory and size - Integrate with player session store to track current playing video - Improve video differentiation for similar titles Resolves user confusion when multiple similar videos exist in library * fix: implement persistent current video tracking - Add currentVideoId to settings store with persistence - Replace temporary player session store usage with persistent tracking - Update video selection to persist across page navigation - Set currentVideoId both on player page load and video card click Fixes issue where "currently playing" indicator disappears when navigating back from player page to library view * refactor: remove playing indicator overlay from video cards - Remove text "正在播放" and play icon overlay from video thumbnails - Keep blue border and shadow effects for selected video identification - Simplify visual design while maintaining clear selection feedback - Clean up unused styled components (CurrentPlayingIndicator, PlayingIcon, PlayingText) * feat: remove current video display functionality - Remove currentVideoId field from settings store - Remove video selection highlighting and blue border effects - Remove persistent current video tracking across navigation - Clean up related code in HomePage and PlayerPage components - Return to simple video library display without selection state This simplifies the UI by removing the complexity of tracking and displaying which video is currently selected/playing.
…ectly (#102) - Add AppLifecycleService for proper resource cleanup on app exit - Implement force pause state synchronization in VideoSurface - Ensure video element and player engine state consistency - Add autoPlay={false} attribute to prevent browser auto-play behavior - Fix play/pause button icon state sync issue when re-entering video Resolves issue where returning from homepage during playback would show incorrect play button icon despite video being properly paused. Changes: - Add AppLifecycleService.ts for comprehensive resource management - Enhance VideoSurface with multiple pause state enforcement points - Update WindowService to notify renderer process on app quit - Integrate lifecycle service in App.tsx and PlayerPage.tsx
- Remove mediainfo.js dependency and complex WASM handling - Add @remotion/media-parser for lighter, more modern media parsing - Replace MediaInfoService with MediaParserService - Maintain API compatibility with existing FFmpegVideoInfo interface - Remove WASM file copying from build configuration - Update electron-builder to exclude unnecessary WASM patterns - All tests pass and build succeeds with new implementation
…ptimization (#104) * feat(startup): implement configurable startup intro with preloading optimization - Add StartupLoadingState component with modern design and animations - Add showStartupIntro setting to control startup intro visibility - Implement HomePage data preloading during startup intro for better UX - Add LoadingState component for HomePage initial loading state - Refactor App.tsx with simplified state management and async data flow - Extend video-list store with initialization tracking and data caching - Add localization support for startup intro setting Technical improvements: - Replace deprecated SplashScreen with modern StartupLoadingState component - Implement intelligent caching to avoid duplicate data loading - Add proper loading states and initialization tracking - Use stable useCallback references to prevent rendering loops - Support reduced motion preferences for accessibility This enhancement provides users with a polished startup experience while optimizing data loading performance through strategic preloading and caching. * chore: Reformat code
…ation (#105) - Add useVolumeWheelControl hook for smooth volume adjustment via mouse wheel - Integrate wheel control with existing hover menu system in VolumeControl component - Implement intelligent acceleration based on scroll velocity and intensity - Support configurable step sizes (min: 1%, default: 2%, max: 8%) - Add comprehensive logging for debugging wheel control behavior - Sync container refs between menu manager and wheel control systems - Update volume icon logic to show mute state when volume is 0 Changes: - VolumeControl.tsx: Integrate wheel control hook with hover menu system - useVolumeWheelControl.ts: New hook with velocity-based smart acceleration - Enhanced UX with immediate response and smooth volume transitions This feature provides intuitive volume control when hovering over the volume button, delivering a professional media player experience with fine-grained control and intelligent acceleration for both precise and rapid adjustments.
…ll management (#106) - Replace scattered state management with centralized state machine approach - Add comprehensive state machine with 4 clear states: DISABLED, LOCKED_TO_CURRENT, USER_BROWSING, TRANSITIONING - Implement 6 event triggers for predictable state transitions - Remove complex manual scroll logic with 100+ lines of imperative code - Simplify SubtitleListPanel component by extracting scroll behavior to dedicated hook - Add intelligent timer management with 3-second auto-return to current subtitle - Improve maintainability with clear separation of concerns and type safety Changes: - Add useSubtitleScrollStateMachine: Complete state machine implementation with transition rules - Refactor SubtitleListPanel: Remove userScrolled, showBackToCurrent, and complex scroll logic - Remove BackToCurrentWrapper: Temporarily simplified UI (can be re-added with state machine integration) - Add SCROLL_CONFIG: Centralized configuration for timing and behavior parameters - Replace imperative scroll handling with declarative state transitions This refactor transforms complex, bug-prone scroll management into a predictable, maintainable state machine that follows YouTube-like interaction patterns and provides clear mental model for subtitle list behavior.
…views (#108) - Add base_branches configuration to auto-review PRs targeting alpha, beta, and main branches - Enable assertive review profile for detailed feedback - Configure code quality tools (ESLint, Ruff, Gitleaks, Hadolint) - Include code guidelines from .cursorrules files - Maintain existing filters for WIP and draft PRs
…endencies (#109) - Remove useTranslation dependency from SubtitleContent component - Replace internationalized empty state messages with fixed '--Empty--' text - Remove unnecessary aria attributes and CSS color variables for consistency - Optimize SubtitleOverlay double-click expansion logic with centered positioning - Simplify positioning calculation for better maintainability Changes improve subtitle display consistency and fix positioning behavior during double-click expansion interactions
# [1.0.0-alpha.5](v1.0.0-alpha.4...v1.0.0-alpha.5) (2025-09-10) ### Bug Fixes * **player:** ensure video always starts paused and sync UI state correctly ([#102](#102)) ([c6c8909](c6c8909)) * **player:** improve subtitle overlay positioning and remove i18n dependencies ([#109](#109)) ([bd7f5c3](bd7f5c3)) ### Features * **ci:** configure CodeRabbit for alpha, beta, and main branch PR reviews ([#108](#108)) ([4f5bad2](4f5bad2)) * **player:** implement favorite playback rates with hover menu system ([#100](#100)) ([df83095](df83095)) * **player:** implement volume wheel control with intelligent acceleration ([#105](#105)) ([b675150](b675150)) * **startup:** implement configurable startup intro with preloading optimization ([#104](#104)) ([e5f4109](e5f4109)) * **ui:** enhance video selection clarity and simplify display ([#101](#101)) ([a951877](a951877))
…hlighting (#110) - Add VideoSearchService with fuzzy matching and relevance scoring - Create VideoSearchResult component with thumbnail, progress, and text highlighting - Implement live search with 300ms debounce and loading states - Add comprehensive i18n support for search UI text - Enhance SearchOverlay with unified design and scrollable results - Move SearchOverlay from App to Router for proper global positioning - Update search.store with results state and async operation support Features: - Real-time search across video titles and subtitles - Keyword highlighting with styled matches - Relevance-based sorting with title priority and recency fallback - Responsive design with hover states and smooth transitions - Progress bar integration for partially watched videos - Click-to-play navigation with search overlay auto-hide This implementation provides a complete video search experience with intelligent matching, visual feedback, and seamless navigation flow.
* fix(subtitle): improve ASS subtitle parsing for bilingual text
- Fix stripAssTags method to properly handle complex ASS style markers like {\3c&HFF8000&\fnKaiTi}{\an8}
- Add support for \h (hard space) and \n (lowercase newline) ASS markers
- Adjust script priority in splitBilingualText to correctly identify English as original text and Chinese as translated text
- Improve bilingual text splitting logic to handle ASS \N line breaks properly
- All existing tests pass, ensuring backward compatibility
Fixes the issue where ASS subtitle style markers were not properly stripped and original/translated text were incorrectly assigned.
* fix(subtitle): handle partially processed ASS style markers from subsrt library
- Add regex patterns to handle ASS style markers that are missing opening braces like \3c&HFF8000&\fnKaiTi}
- Fix issue where subsrt library partially processes ASS content but leaves style marker remnants
- Add comprehensive regex to clean up various ASS marker patterns:
- Complete markers: {\3c&HFF8000&\fnKaiTi}
- Partial markers: \3c&HFF8000&\fnKaiTi}
- Orphaned markers: \fnKaiTi without closing brace
- All tests pass, ensuring backward compatibility
This fixes the remaining ASS subtitle display issue where style markers were still visible in the UI.
* test(subtitle): add comprehensive tests for ASS subtitle parsing fixes
- Add regression tests for ASS style marker cleaning issues
- Test partial ASS style markers left by subsrt library (\3c&HFF8000&\fnKaiTi})
- Test complete ASS style markers ({\3c&HFF8000&\fnKaiTi})
- Test script detection for bilingual text parsing
- Test format detection for ASS files
- Test error handling for empty files and read failures
- Ensure 449 tests pass including 7 new ASS parsing tests
These tests prevent regressions of the issues encountered with Forrest Gump ASS subtitles where style markers were not properly cleaned from displayed text.
# [1.0.0-alpha.6](v1.0.0-alpha.5...v1.0.0-alpha.6) (2025-09-10) ### Bug Fixes * **subtitle:** improve ASS subtitle parsing for bilingual text ([#111](#111)) ([444476b](444476b)) ### Features * **search:** implement video search engine with live results and highlighting ([#110](#110)) ([bb2ac30](bb2ac30))
* feat(player): implement comprehensive video error recovery with file relocation - Add VideoErrorRecovery modal component with smart error categorization and recovery options - Implement file existence checking via new IPC bridge (fs.checkFileExists) - Enhance VideoSurface error handling with detailed error type detection (file-missing, unsupported-format, decode-error, network-error) - Add file relocation workflow allowing users to reselect missing video files - Add remove from library option for permanently unavailable videos - Implement modal with forced interaction (no dismiss) to ensure user handles critical errors - Improve dangerous button styling consistency across light/dark themes Changes: - Add VideoErrorRecovery: Modal-based error recovery interface with file browser integration - Enhance VideoSurface: Smart error detection with file existence validation - Add IPC bridge: fs.checkFileExists for file system validation from renderer process - Update PlayerPage: Integrate error recovery workflow with database operations - Fix ant.scss: Ensure dangerous button text visibility in all themes This implementation provides a robust solution for handling missing video files, allowing users to either relocate files or clean up their library when content is no longer accessible, preventing broken player states and improving UX. * feat(i18n): implement internationalization for VideoErrorRecovery component - Add comprehensive Chinese translations for video error recovery dialogs - Replace hardcoded Chinese strings with i18n keys in VideoErrorRecovery component - Support all error types: file-missing, unsupported-format, decode-error, network-error, unknown - Include translations for action buttons, dialog content, and file path labels - Maintain existing functionality while enabling future localization support
…ns list (#115) - Add run-name to release.yml to display version and branch info - Shows input version or auto-generated version number - Includes branch name for non-main branches - Improves workflow visibility and tracking
…138) - Add time boundary check in useSubtitleOverlay hook - Ensure overlay only displays when current time is within subtitle time range - Fixes issue where overlay showed previous subtitle content after its end time - Preserves SubtitleListPanel highlighting functionality by keeping useSubtitleEngine unchanged
* fix(player): improve play/pause button reliability Fix intermittent play/pause failures by implementing state synchronization, optimistic updates, and delayed verification mechanisms. ## Root Cause - requestTogglePlay relied on videoController.isPaused() which could be out of sync with internal state - Async play() operations could fail without proper error recovery - State inconsistencies between video element and orchestrator context ## Solution - Use internal context state as authoritative source for play/pause decisions - Add syncPlaybackState() method to detect and fix state mismatches - Implement optimistic updates with failure rollback - Add delayed verification and retry mechanisms - Enhance error handling for DOMExceptions ## Changes - PlayerOrchestrator: Add state sync, optimistic updates, retry logic - usePlayerCommands: Add detailed debugging logs and result verification - Tests: Add 19 comprehensive test cases covering all scenarios ## Test Coverage - 47 total test cases (100% pass rate) - State synchronization scenarios - Async operation handling - Error recovery mechanisms - Edge cases and boundary conditions - Real usage scenarios (shortcuts, browser limitations) Resolves the issue where play/pause would occasionally fail to resume playback via keyboard shortcuts, requiring mouse click to recover. * Update src/renderer/src/pages/player/engine/__tests__/PlayerOrchestrator.playback-reliability.test.ts
…prehensive tests (#143) - Add dictionary API to preload layer for frontend access - Create comprehensive test suite for DictionaryService with 18 test cases - Test coverage includes success scenarios, error handling, HTML parsing robustness, parameter processing, and edge cases - Verify API can handle various dictionary response formats and gracefully handle network errors - All tests pass, demonstrating production-ready robustness API Usage: ```typescript const result = await window.api.dictionary.queryEudic('hello', 'greeting context'); if (result.success) { console.log(result.data); // { word, phonetic, definitions, examples, translations } } ```
…ets (#145) * fix(build): fix FFmpeg cross-platform build on macOS for Windows targets - Add cross-env dependency for cross-platform environment variables - Update Windows build scripts to set BUILD_TARGET_PLATFORM and BUILD_TARGET_ARCH - Modify download-ffmpeg.ts to prioritize environment variables over command arguments - Update vite plugin to avoid duplicate FFmpeg downloads - Fix release scripts to download all platform FFmpeg binaries before building - Ensure correct FFmpeg binaries are included for each target platform Resolves issue where building Windows packages on macOS would include macOS FFmpeg binaries instead of Windows ones. * fix(build): improve FFmpeg download in CI environments - Replace direct tsx command with npm run for better CI compatibility - Add CI-specific handling with proper environment variable passing - Convert hard failures to warnings to prevent CI build blocking - Improve error messages and debugging information Fixes Windows CI build failure: spawn tsx ENOENT * fix(build): ensure FFmpeg is properly downloaded in Windows CI - Use npm run ffmpeg:download on Windows for better compatibility - Pass environment variables to ensure correct platform detection - Throw errors on download failure to prevent incomplete builds - Keep direct tsx usage on Unix systems for performance This ensures CI builds never skip FFmpeg download and always include the correct FFmpeg binaries for the target platform.
…ion (#140) * feat(player): add subtitle copy shortcut with Ctrl+C - Add copy_subtitle shortcut to constants with CommandOrControl+C - Implement copy functionality in usePlayerShortcuts hook - Support copying selected text or current subtitle based on display mode - Add success/error notifications for copy operations - Remove obsolete keyboard handling from SubtitleContent component - Add i18n label support for copy_subtitle shortcut * fix(player): enable text selection in subtitle tokens for copy functionality - Change WordToken user-select from 'none' to 'text' to allow native text selection - Add debug logging to copy function to help diagnose selection issues - This enables Ctrl+C to copy selected subtitle text properly * fix(player): use custom subtitle selection for copy functionality - Use selectedText from useSubtitleOverlayUI instead of window.getSelection() - Integrate with custom selection system used by SubtitleContent component - Restore WordToken user-select: none to maintain custom selection behavior - Update copy logic to properly detect custom selected text vs full subtitle - Remove window.getSelection() debugging code as it's no longer used * debug: add logging to copy function to diagnose selectedText state * feat(player): add DOM-based selected text detection for copy - Add fallback to DOM query when selectedText state is empty - Check for selected tokens by background color style - Maintains both state-based and DOM-based selection detection - This should fix the issue where selectedText state gets cleared before copy * simplify: remove word selection feature, keep only full subtitle copy - Remove all selected text detection logic (selectedText state and DOM queries) - Simplify copy function to only copy current subtitle based on display mode - Remove dependency on useSubtitleOverlayUI hook - Clean up notification message to show copied character count - This makes the copy functionality simple and reliable * feat(player): add lightweight toast notifications for subtitle copy - Add Ctrl+C shortcut to copy current subtitle based on display mode - Replace intrusive NotificationService with lightweight toast positioned above subtitle overlay - Implement custom event system for decoupled toast communication between components - Add i18n support for copy success/failure messages in zh-cn.json - Toast automatically hides after 2 seconds with smooth fade transition - Support copying original, translated, or bilingual subtitle content based on current display mode - Position toast relative to subtitle overlay for better UX during immersive video watching This improves user experience by providing non-intrusive feedback while maintaining clean component architecture and supporting internationalization. * Update src/renderer/src/pages/player/components/SubtitleOverlay.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update src/renderer/src/pages/player/components/SubtitleOverlay.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update src/renderer/src/pages/player/components/SubtitleOverlay.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * 📝 Add docstrings to `copy-subtitle-shortcut` (#142) Docstrings generation was requested by @mkdir700. * #140 (comment) The following files were modified: * `src/renderer/src/pages/player/hooks/usePlayerShortcuts.ts` Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update * refactor: use design tokens in Toast components and add theming best practices - Replace hardcoded values with design tokens in ToastContainer and ToastContent - Use ANIMATION_DURATION, EASING, FONT_SIZES, FONT_WEIGHTS, SPACING, Z_INDEX, GLASS_EFFECT tokens - Reduce toast display duration from 2000ms to 800ms for better UX - Add comprehensive theming best practices to CLAUDE.md - Document mixed approach: CSS variables for theme-related properties, JS variables for design constants --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
# [1.0.0-alpha.9](v1.0.0-alpha.8...v1.0.0-alpha.9) (2025-09-13) ### Bug Fixes * **build:** Fix FFmpeg cross-platform build on macOS for Windows targets ([#145](#145)) ([e2857e9](e2857e9)) * **ci:** Failed to get next version ([8a94ceb](8a94ceb)) * **homepage:** Fix UI desynchronization issue after deleting video records + i18n support ([#120](#120)) ([7879ef4](7879ef4)) * **player:** Fix subtitle navigation when activeCueIndex is -1 ([#119](#119)) ([b4ad16f](b4ad16f)) * **player:** Fix subtitle overlay dragging to bottom and improve responsive design ([#122](#122)) ([d563c92](d563c92)) * **player:** improve play/pause button reliability ([#141](#141)) ([805e774](805e774)) * **player:** Prevent subtitle overlay interactions from triggering video play/pause ([#128](#128)) ([9730ba1](9730ba1)) * **subtitle:** prevent overlay showing content during subtitle gaps ([#138](#138)) ([0eb4697](0eb4697)) * **ui:** Remove white border shadow from modal buttons in dark mode ([#124](#124)) ([29f70f6](29f70f6)) * **windows:** resolve file extension validation requiring double dots (.mp4 vs ..mp4) ([#126](#126)) ([eadebcf](eadebcf)), closes [#118](#118) [#118](#118) ### Features * **dictionary:** expose DictionaryService API in preload and add comprehensive tests ([#143](#143)) ([70d289d](70d289d)) * implement Ctrl+C subtitle copy with lightweight toast notification ([#140](#140)) ([22005bb](22005bb)), closes [#142](#142) * **performance:** implement video import performance optimization with parallel processing and warmup strategies ([#121](#121)) ([2c65f5a](2c65f5a)) * **player:** Implement fullscreen toggle functionality with keyboard shortcuts ([#127](#127)) ([78d3629](78d3629)) * **scripts:** optimize FFmpeg download progress display ([#125](#125)) ([be33316](be33316)) ### Reverts * Revert "ci(sync): add workflow to sync main to beta ([#132](#132))" ([93ac160](93ac160))
…#152) - Remove detail parameter from system MessageBox to prevent window overflow - Display only essential update information with version number - Direct users to Settings > About page for full release notes - Remove unused formatReleaseNotes method and ReleaseNoteInfo interface Fixes issue where long release notes caused system dialog to overflow screen height, hiding the Install button.
Remove all keyboard shortcuts for subtitle display modes: - subtitle_mode_none (Cmd/Ctrl+1) - subtitle_mode_original (Cmd/Ctrl+2) - subtitle_mode_translated (Cmd/Ctrl+3) - subtitle_mode_bilingual (Cmd/Ctrl+4) Changes: - Remove shortcut configurations from DEFAULT_SHORTCUTS - Remove shortcut handlers from usePlayerShortcuts hook - Remove i18n label references - Clean up unused imports and fix formatting Users can still change subtitle display modes through the UI interface.
…ncy logging (#156) - Reduce Logger export history from 10k to 1k entries and add automatic cleanup - Implement lightweight serialization to replace deep serialization - Add sampling strategy for high-frequency logs (time_update, MediaClock events) - Disable export history completely in production environment - Optimize MediaClock logging with 5-10% sampling for duplicates and debug messages - Reduce PlayerOrchestrator trace buffer from 200 to 50 entries - Remove high-frequency onTimeUpdate silly logs - Implement stricter production log levels (WARN+ for renderer, ERROR+ for main process) This should significantly reduce memory pressure from logger-related objects as identified in Chrome DevTools memory analysis.
…e state sync (#153) * fix(subtitle): resolve overlay pause/seek update delays with immediate state sync - Add immediate store updates in PlayerOrchestrator during seek/jumpToCue - Implement UserSeeking state in PlayerSettingsSaver to prevent conflicts - Ensure subtitle overlay UI responds instantly to user interactions - Maintain data consistency during user-initiated time changes * Update src/renderer/src/pages/player/engine/PlayerOrchestrator.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update src/renderer/src/services/PlayerSettingsSaver.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix(player): resolve seeking event mismatch causing duplicate subtitle jumps - Add missing mediaClock.startSeeking() call in PlayerOrchestrator.onSeeking() - Fix SeekEventCoordinator state inconsistency between start/end seeking events - Eliminate 'Ignoring seeked without active seeking' warnings in console - Ensure proper event sequence for both paused and playing states - All 66 player engine tests pass with TypeScript and lint validation Resolves issue where users needed to press subtitle buttons twice in paused state. * refactor(player): Use destroyOnHidden instead of destoryOnClose. * fix(player): prevent SubtitleSyncStrategy from overriding user subtitle jumps - Lock subtitle state machine for 2 seconds after user subtitle jump - Prevent SubtitleSyncStrategy from immediately overriding user selection - Add automatic unlock mechanism to restore normal subtitle sync behavior - Ensure 'goToNextSubtitle' respects user intent in paused state - Fix seeking event coordination in PlayerOrchestrator.onSeeking() Resolves the core issue where clicking to jump to a subtitle would be immediately overridden by the subtitle sync strategy, requiring users to click twice to achieve their intended jump. * fix(subtitle): eliminate subtitle content flickering during jumps - Add activeCueIndex to PlayerState and StateUpdater interface - Sync PlayerOrchestrator's activeCueIndex to store on updates - Modify useSubtitleEngine to prioritize store's activeCueIndex over time-based calculation - Ensure SubtitleContent component uses authoritative subtitle index - Fix initial activeCueIndex synchronization on StateUpdater connection Resolves flickering where subtitle content would briefly show wrong subtitle before displaying the correct one during user-initiated subtitle jumps. * fix(subtitle): eliminate subtitle overlay flickering during jumps - Add smart tolerance mechanism to useSubtitleOverlay shouldShow calculation - Display overlay when currentTime is within 2 seconds of subtitle start time - Handles user jump delays while preserving smooth normal playback behavior - Fixes flickering issue where overlay would briefly hide during subtitle navigation Closes final flickering issue in subtitle navigation system. * fix(subtitle): resolve overlay flickering through index priority and data stabilization - Add stable subtitle data memoization in useSubtitleOverlay to prevent unnecessary re-renders - Prioritize currentIndex over time-based checks in shouldShow calculation - Reorder PlayerOrchestrator lock sequence to ensure SubtitleLockFSM is active during updateContext - Implement granular dependency tracking for subtitle content changes --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…anagement (#155) * feat(ffmpeg): implement dynamic FFmpeg download system with runtime management - Remove static FFmpeg bundling from build configuration - Add FFmpegDownloadService for cross-platform binary management - Implement automatic platform detection (Windows/macOS/Linux, x64/ARM64) - Add IPC channels for download progress monitoring and control - Integrate download service with existing FFmpegService architecture - Update build scripts to remove prebuild FFmpeg requirements - Add comprehensive test coverage for download functionality Changes: - electron-builder.yml: Remove extraResources FFmpeg bundling - package.json: Remove prebuild FFmpeg download from release scripts - FFmpegDownloadService.ts: New service with download/extract/management capabilities - FFmpegService.ts: Enhanced with download service integration and fallback logic - IpcChannel.ts: Add 9 new channels for download operations - ipc.ts: Register download service handlers for renderer communication - preload/index.ts: Expose download APIs to renderer process - useVideoFileSelect.ts: Updated to work with dynamic FFmpeg detection This implementation enables on-demand FFmpeg installation, reducing app bundle size by ~200MB while maintaining cross-platform compatibility and user experience. The system gracefully falls back to bundled → downloaded → system FFmpeg. * feat(settings): implement FFmpeg settings UI with download management - Add new FFmpegSettings component with status indicator and download controls - Remove deprecated FFmpeg build plugin from electron.vite.config.ts - Enhance IndicatorLight component with proper CSS-in-JS animation syntax - Add comprehensive i18n support for FFmpeg management (en-us, zh-cn) - Remove box-shadow from ant-btn components for cleaner UI appearance - Integrate FFmpeg settings into main SettingsPage navigation Changes: - FFmpegSettings.tsx: Complete UI implementation with download progress, path validation, and status management - electron.vite.config.ts: Remove build-time FFmpeg download plugin (shift to runtime approach) - IndicatorLight.tsx: Fix styled-components animation with proper css helper - i18n locales: Add 61 new translation keys for FFmpeg settings UI - ant.scss: Remove button shadows for consistent design system - SettingsPage.tsx: Add FFmpeg settings tab integration This implements the frontend interface for the dynamic FFmpeg download system, providing users with a comprehensive management UI for FFmpeg installation, status monitoring, and path configuration. * feat(ffmpeg): implement FFmpeg guidance dialog for enhanced user experience Add comprehensive FFmpeg download guidance system that transforms technical errors into user-friendly guidance with seamless navigation to settings and auto-download. **Components Added:** - FFmpegDownloadPrompt: Full-featured guidance dialog with benefits, effort info, and actions - Comprehensive internationalization support (zh-CN, en-US) **Hook Enhancements:** - useVideoFileSelect: Extended with FFmpeg prompt state management - Replaced technical error throwing with guided dialog display - Enhanced error detection for FFmpeg missing scenarios **Integration Updates:** - HomePage: State management for prompt visibility and component integration - EmptyState/VideoAddButton: Bidirectional state communication with parent - HeaderNavbar: Props forwarding for prompt handler **Features:** - Benefits explanation (compatibility, performance, reliability) - Installation effort communication - Auto-navigation to settings with download trigger - Seamless integration with existing video file selection workflow - Graceful error handling with user-centric messaging **Technical Details:** - Styled-components with theme variables and CSS custom properties - Modal-based UI with responsive design and accessibility - State management across component hierarchy - URL parameter-based auto-download triggering - Comprehensive TypeScript interfaces Transforms "视频处理组件未安装" technical errors into guided user experience that educates users about FFmpeg benefits and provides immediate resolution path. * test: fix FFmpegService mock for dynamic download system - Add getDownloadService method to FFmpegService mock - Include all FFmpegDownloadService interface methods in mock - Fix 43 failing test cases caused by missing mock method - All 554 test cases now pass successfully Resolves test failures introduced by FFmpeg dynamic download system implementation. * test: fix cross-platform FFmpeg executable name test - Update test to handle platform-specific executable names (ffmpeg vs ffmpeg.exe) - Fix Windows CI test failure where test expected 'ffmpeg' but got 'ffmpeg.exe' - Test now correctly validates system FFmpeg fallback behavior on all platforms - Maintains test coverage while supporting cross-platform compatibility Resolves Windows CI test failure in FFmpegService integration tests.
- Add arm64 architecture support for Windows NSIS installer target - Add arm64 architecture support for Windows Portable target - Align Windows build targets with existing macOS and Linux ARM64 support - Enable native ARM64 builds for Windows on ARM devices This change allows the application to run natively on Windows ARM64 devices, providing better performance and compatibility for users with ARM-based Windows machines.
- Configure Windows and Linux to use native system title bars instead of custom titleBarOverlay - Remove excessive padding-right in Navbar component (140px for Windows, 120px for Linux) - Maintain custom title bar for macOS with traffic light buttons integration - Update ThemeService to only apply titleBarOverlay changes to macOS windows - Simplify Navbar styling to use consistent 12px padding across all platforms This change eliminates the spacing issue in the Windows header area and provides a more native user experience on Windows and Linux platforms. Fixes the header spacing issue reported for Windows platform.
# [1.0.0-alpha.10](v1.0.0-alpha.9...v1.0.0-alpha.10) (2025-09-13) ### Bug Fixes * **logger:** optimize logger memory management and reduce high-frequency logging ([#156](#156)) ([2462964](2462964)) * **subtitle:** resolve overlay pause/seek update delays with immediate state sync ([#153](#153)) ([cbd9432](cbd9432)) * **ui:** use system title bar for Windows and Linux platforms ([#158](#158)) ([0ddb189](0ddb189)) * **updater:** remove detailed release notes from system update dialog ([#152](#152)) ([9fea0be](9fea0be)) ### Features * add Windows ARM64 architecture support ([#157](#157)) ([4106908](4106908)) * **ffmpeg:** implement dynamic FFmpeg download system with runtime management ([#155](#155)) ([2c03521](2c03521))
…elease (#160) - Remove pre-release-check.ts script with version validation and Git status checks - Remove release.ts script with interactive version selection and build automation - Remove rename-artifacts.ts script with platform-specific file renaming logic - Remove version-manager.ts script with semver version bumping functionality - Clean up package.json scripts: remove version:*, release:*, and related commands - Retain semantic-release configuration and migrate:* database commands - Transition from custom release tooling to standardized semantic-release workflow The removed scripts provided manual release management including: - Interactive version type selection (patch/minor/major/prerelease/beta) - Git status validation and commit automation - Cross-platform artifact renaming (Windows/macOS/Linux) - Build orchestration and publishing workflows This refactoring simplifies the release process by adopting semantic-release as the single source of truth for version management and automated publishing, reducing maintenance overhead and improving consistency with modern CI/CD practices.
- Replace find() with filter() + sort() to get the latest matching release - Increase API request limit from 8 to 20 releases for better coverage - Add proper sorting by published_at timestamp to ensure latest version - Enhance logging for better debugging of version detection process Fixes issue where alpha.10 was not detected due to find() returning the first match instead of the latest published version.
When users relocate a missing video file through the error recovery dialog, the new file path is now properly saved to the database instead of only updating local state. This ensures the relocated path persists across app sessions, eliminating the need to relocate files repeatedly. Changes: - Update handleFileRelocate to fetch video record and file ID - Call db.files.updateFile() to persist new path to database - Maintain existing local state updates for immediate UI response - Add comprehensive error handling and logging Fixes issue where video file relocation was temporary and required repeated user action on subsequent app launches.
* feat(ffmpeg): add China mirror support for FFmpeg downloads - Add IP-based region detection using ipinfo.io API - Support China mainland, Hong Kong, Macau, Taiwan regions - Add dedicated China mirror URLs from gitcode.com - Implement automatic fallback from China to global mirrors - Add comprehensive test coverage for new functionality - Default to China mirror on detection failure for better UX Breaking change: Service now defaults to China mirror for better performance in Chinese regions * fix(test): remove unused parameter in FFmpegDownloadService test - Fix TypeScript error TS6133 for unused 'url' parameter - Replace unused 'url' with underscore in mock implementation
# [1.0.0-alpha.12](v1.0.0-alpha.11...v1.0.0-alpha.12) (2025-09-14) ### Features * **ffmpeg:** add China mirror support for FFmpeg downloads ([#164](#164)) ([f0473df](f0473df)) ### BREAKING CHANGES * **ffmpeg:** Service now defaults to China mirror for better performance in Chinese regions * fix(test): remove unused parameter in FFmpegDownloadService test - Fix TypeScript error TS6133 for unused 'url' parameter - Replace unused 'url' with underscore in mock implementation
…nderer processes (#176) * feat(player): comprehensive dictionary popover with pronunciation and theme support (#171) * feat(player): show inline dictionary popover * enhance(player): improve word lookup popup UI and functionality - Enhanced dictionary popover with better visual design - Added pronunciation button with speech synthesis - Improved loading and error states display - Limited definitions display to 6 items with more indicator - Added translation section with tags layout - Implemented responsive design and custom scrollbar - Enhanced fade-in animation for better UX - Fixed ResizeObserver compatibility in test environment - Updated tests to cover new features and error states Fixes: Improve word lookup popup appearance and functionality * refactor(player): optimize part-of-speech tags layout in dictionary popup - Changed definition layout from column to row for better space usage - Made part-of-speech tags more compact with inline layout - Reduced vertical space occupied by multiple definitions - Improved visual balance with fixed-width centered tags - Enhanced readability with better alignment and spacing Resolves space efficiency issues with multiple part-of-speech tags * refactor(player): extract DictionaryPopover as independent component - Created standalone DictionaryPopover component with complete UI - Moved all dictionary-related logic and styles to separate component - Simplified SubtitleOverlay by removing 200+ lines of dictionary code - Maintained all existing functionality (pronunciation, loading states, error handling) - Improved code organization and maintainability - Enhanced component reusability and testability Benefits: - Better separation of concerns - Easier to maintain and test dictionary functionality - Reduced SubtitleOverlay complexity - Improved code organization * fix(player): prevent DictionaryPopover overflow on screen edges - Added intelligent position calculation algorithm - Implemented 6 placement modes: top/bottom with left/right/center alignment - Automatic position adjustment based on viewport boundaries - Prevents horizontal overflow with 10px safety margin - Dynamic transform calculations for different placements - Maintains optimal positioning while avoiding screen edges - Enhanced user experience for edge-case word selections Benefits: - No more cutoff popover on right/left screen edges - Smart positioning adapts to available space - Consistent visual appearance across all positions - Improved accessibility and usability * feat(player): add comprehensive dictionary popover with theme support and pronunciation - Implement new DictionaryPopover component using Ant Design Popover for intelligent positioning - Add comprehensive pronunciation parsing with UK/US audio support and voice parameters - Enhance dictionary service parsing to handle complex HTML structures and <i> tag formats - Add theme compatibility using Ant Design CSS variables for light/dark mode adaptation - Implement internationalization support with loading/error state translations - Add robust test coverage for various dictionary HTML parsing scenarios Features: - Pronunciation: Extract audio URLs, phonetic symbols, and support both UK/US variants - Parsing: Handle mixed part-of-speech formats (tagged vs plain text) with comprehensive coverage - UI: Smart positioning, theme-aware styling, and accessibility improvements - Testing: Edge cases for "need", mixed formats, and complex part-of-speech structures This feature provides users with comprehensive word lookup functionality including native pronunciation support and seamless theme integration for enhanced subtitle reading experience. * test(DictionaryPopover): update tests to match current data structure and remove deprecated features - Remove phonetic field support in favor of pronunciations array structure - Update test mocks to use pronunciations with type and phonetic properties - Fix translation mocks to return actual Chinese translations instead of keys - Add data-testid to error content for proper test coverage - Remove definitions limitation logic and update test expectations accordingly - Change test from "limits to 6 definitions" to "displays all definitions" Changes: - DictionaryPopover: Remove phonetic field fallback, use only pronunciations array - Tests: Replace phonetic field with pronunciations array in mock data - Tests: Add proper Chinese translations for dictionary keys - Tests: Update definition display expectations to match unlimited display This ensures tests align with the current component implementation that uses the pronunciations array structure and displays all definitions without limitation * fix(dictionary): support pronunciation extraction without UK/US distinction (#172) * fix(dictionary): support pronunciation extraction without UK/US distinction - Update PronunciationInfo type to allow null type for unknown pronunciation - Enhance pronunciation parsing to handle cases without explicit UK/US labels - Add support for extracting pronunciation from `<span class="Phonitic">` without phontype - Update DictionaryPopover to display "通用" for unknown pronunciation types - Add comprehensive test cases for crystal-like pronunciation scenarios - Ensure backward compatibility with existing UK/US pronunciation formats Fixes pronunciation extraction for words like "crystal" where the HTML structure doesn't explicitly distinguish between UK and US pronunciation types. * refactor(dictionary): improve audio URL building and UI presentation - Simplify audio URL parameter building logic in buildAudioUrl - Remove voicename requirement check (only langid and txt are essential) - Simplify pronunciation type display in DictionaryPopover - Only show type label when type is explicitly known (uk/us) - Default to 'uk' when calling handlePronunciation for unknown types * fix(player): resolve focus loss after dictionary popup interaction (#173) * fix(player): resolve focus loss after dictionary popup interaction 修复点击查词后焦点丢失导致快捷键失效的问题 - 阻止 DictionaryPopover 中发音按钮获得焦点 - 添加弹窗关闭时的焦点恢复机制 - 确保快捷键(如空格播放/暂停)在查词后仍能正常工作 Changes: - 在发音按钮的 onClick 事件中调用 blur() 移除焦点 - 在发音按钮的 onMouseDown 事件中调用 preventDefault() 阻止默认焦点行为 - 在词典弹窗关闭时自动将焦点恢复到视频表面或字幕覆盖层 - 保持查词和发音功能的完整性 影响范围: - 修复播放器快捷键在查词后失效的问题 - 提升用户交互体验 - 保持现有功能不受影响 * fix: fix type error * fix(player): resolve shortcut pause failure caused by state oscillation (#174) * fix(player): resolve shortcut pause failure caused by state oscillation Remove problematic automatic retry mechanisms in PlayerOrchestrator that were causing infinite state oscillation loops between play and pause operations. **Problem**: - Shortcut pause commands (spacebar) would fail and immediately resume playback - Logs showed repeating "Video element still playing after pause() call" warnings - Root cause: setTimeout-based verification logic in requestPlay() and requestPause() created mutual triggering loops **Solution**: - Remove 150ms retry logic from requestPlay() (lines 283-297) - Remove 50ms retry logic from requestPause() (lines 320-333) - Remove verification timeouts from requestTogglePlay() (lines 345-360) - Trust browser's native play()/pause() API reliability **Impact**: - ✅ Shortcut pause now works immediately without interference - ✅ Eliminates state oscillation loop warnings from logs - ✅ Mouse click controls remain unaffected - ✅ All other player functionality preserved Fixes #170 * test: update PlayerOrchestrator tests to reflect removed retry mechanisms Update reliability tests that previously validated automatic retry behavior: - 'should detect play failure in delayed verification' → 'should only call play once without retry' - 'should detect pause failure in delayed verification' → 'should only call pause once without retry' These tests now correctly validate the simplified behavior where play() and pause() are called exactly once without automatic retry mechanisms, aligning with the fix that removes state oscillation loops. All 578 tests now pass ✅ * feat(telemetry): integrate Sentry error monitoring across main and renderer processes (#175) - Add @sentry/electron dependency for comprehensive error tracking and performance monitoring - Create shared TypeScript definitions for main and renderer Sentry configurations - Implement SentryService for main process with native crash reporting and breadcrumb collection - Implement SentryService for renderer process with web-specific error handling - Initialize Sentry in both main index and renderer init files for full coverage - Configure error boundaries, performance monitoring, and user context tracking - Add support for release tracking, environment detection, and custom integrations - Enable automatic breadcrumb collection and unhandled rejection capture This implementation provides: - Centralized error monitoring and crash reporting - Performance tracking and bottleneck identification - User session tracking with privacy-conscious defaults - Development/production environment separation - Comprehensive error context for debugging production issues
…xperience (#177) - Set PRODUCTION URL to China mirror (http://release.echoplayer.z2blog.com/api/releases) - Add CN_ALPHA and CN_BETA URLs for Chinese users' pre-release channels - Simplify AppUpdater logic to use PRODUCTION URL for all stable releases - Maintain GitHub URLs for non-CN users in test mode - Improve logging to distinguish China mirror usage
…gger without description (#179) - Add logic to automatically fetch release description from GitHub API when manual workflow trigger doesn't provide release_body - Fallback to informative default message if release not found or has no description - Maintain existing behavior when release_body is explicitly provided - Improve user experience by eliminating need to manually copy descriptions
|
Caution Review failedThe pull request is closed. WalkthroughAdds CI/release workflows and CodeRabbit config; switches license to AGPLv3; introduces FFmpeg runtime management (download service, IPC/preload API, UI prompt), MediaInfo-based parsing, Sentry integration, player UX refactors (hover menus, error recovery, fullscreen IPC), search overlay, home preload/cache, DB migrations, i18n expansions, branding/path updates, tests, and docs. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant Renderer as Renderer UI
participant Preload as Preload (contextBridge)
participant Main as Main IPC
participant FF as FFmpegService
participant DL as FFmpegDownloadService
User->>Renderer: Open video / parse request
Renderer->>Preload: ffmpeg.getInfo()
Preload->>Main: Ipc: Ffmpeg_GetInfo
Main->>FF: getFFmpegInfo()
FF-->>Main: {path, needsDownload, ...}
Main-->>Preload: info
Preload-->>Renderer: info
alt needsDownload
Renderer->>Preload: ffmpeg.download.download()
Preload->>Main: Ipc: ffmpeg-download:download
Main->>DL: downloadFFmpeg(platform, arch)
DL-->>Main: progress/status
Main-->>Preload: progress/events
Preload-->>Renderer: progress/status
end
Renderer->>Preload: mediainfo.getVideoInfoWithStrategy(path, strategy, timeout)
Preload->>Main: Ipc: mediainfo:get-video-info-with-strategy
Main->>Main: MediaParserService resolves strategy
Main->>FF: (if needed) warmup / getVideoInfo
Main-->>Preload: FFmpegVideoInfo | null
Preload-->>Renderer: result
sequenceDiagram
autonumber
participant GH as GitHub Push (main/beta/alpha)
participant GA as GitHub Actions
participant VA as version-analysis
participant REL as release (build)
participant SR as semantic-release
GH-->>GA: Trigger on push
GA->>VA: Determine channel/version (dry-run)
VA-->>GA: {next_version, channel, should_release}
alt should_release
GA->>REL: Build artifacts (win/mac/linux)
REL-->>GA: Artifacts uploaded
GA->>SR: semantic-release with assets
SR-->>GA: Release created/notes
else no release
GA-->>GH: Summary (no release)
end
sequenceDiagram
autonumber
participant Renderer
participant Preload
participant Main
participant Updater as AppUpdater
participant Geo as IP Geolocation
Renderer->>Preload: check for updates
Preload->>Main: invoke updater
Main->>Geo: fetch ip country
Geo-->>Main: country code
Main->>Updater: select feed (CN vs global, channel)
Updater-->>Main: latest release info
Main-->>Preload: result
Preload-->>Renderer: show update dialog
Estimated code review effort🎯 5 (Critical) | ⏱️ ~180+ minutes Possibly related PRs
Poem
✨ Finishing touches
🧪 Generate unit tests
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (99)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary by CodeRabbit
New Features
Improvements
Style
Documentation
Chores