Commit Graph

23 Commits

Author SHA1 Message Date
38260a4c61 fix: full file playback resets all state to play to end of file
- Clear all marks (not just face marks)
- Reset playMode to 'continuous' to disable trace/segment limits
- Reset currentTraceIdx and currentSegmentIdx to 0
- Reset seekFrame to 0
- This ensures full file plays from start to end without restrictions
2026-10-21 01:47:20 +08:00
3b2c7c65ae feat: clickable file name in video player for full file playback
- File name in header is now clickable
- Click reloads video with full file range (startFrame=0, endFrame=999999)
- Added play icon and hover effect for visual feedback
2026-10-21 01:32:23 +08:00
8789770af2 fix: 移除 FaceFilterSettings 重复字段,与 Rust 端结构一致
问题修正:
- 移除 FaceFilterSettings 中的重复字段
- 简化为三段式结构(ui_filter_rules, processing_thresholds, trace_settings)
- 新增 version 字段用于版本控制
- 删除 useFaceFilter.ts 中的 rules 变量
- 重命名 faceFilterSettings 为 settings
- 更新所有访问方式为 settings.value.ui_filter_rules.*

变更内容:
1. src/types/faceFilter.ts
   - FaceFilterSettings 只保留三段式结构
   - fromLegacy() 和 defaults() 不再返回重复字段

2. src/composables/useFaceFilter.ts
   - 删除 rules 变量(不再需要)
   - 删除 defaultRules 常量
   - 重命名 faceFilterSettings 为 settings
   - 更新 localStorage 逻辑保存完整 settings
   - 所有访问改为 settings.value.ui_filter_rules.*

3. src/components/FaceFilterPanel.vue
   - 更新 v-model 绑定为 settings.trace_settings.*
   - 更新解构,删除 rules
   - 更新所有访问为 settings.ui_filter_rules.*

测试:
- ✅ TypeScript 编译通过
- ✅ Vite build 成功

对应 Core API: 86c776ce
修正文档: docs/FACE_FILTER_TYPES_FIX_REQUIRED.md
2026-10-09 15:55:30 +08:00
6423eeed77 feat: 更新 FaceFilterSettings TypeScript 类型定义为三段式统一结构
变更内容:
- 创建 src/types/faceFilter.ts 类型定义文件
- 新增 UiFilterRules, ProcessingThresholds, TraceSettings 三个子结构
- 更新 FaceFilterSettings 为三段式统一结构
- min_confidence 范围从 0-100 改为 0.0-1.0
- min_size 重命名为 min_bbox_size
- 新增字段: max_confidence, max_bbox_size, source, backend_status

向后兼容性:
- FaceFilterSettingsMigration.fromLegacy() 自动转换旧格式
- FaceFilterSettingsMigration.defaults() 提供默认值
- 保留向后兼容字段(deprecated 标记)

更新文件:
- src/composables/useFaceFilter.ts: 使用新类型,更新变量名
- src/components/FaceFilterPanel.vue: 更新导入和变量引用
- docs/FACE_FILTER_SETTINGS_MIGRATION_GUIDE.md: 完整迁移指南

测试:
- ✅ TypeScript 编译通过
- ✅ Vite build 成功

对应 Core API commit: 86c776ce
2026-10-09 15:13:50 +08:00
5928bc9404 feat: Face Filter 自動保存(500ms 防抖 + 離開頁面自動保存) 2026-10-07 23:27:37 +08:00
f3d75ebce8 feat: Library 批量注册 + PeopleView 修复 + 国际化
Library:
- 添加 checkbox 和鼠标框选功能
- Unregistered 卡片添加快速注册按钮
- 状态标签移至左下方,人脸图标移至左侧中间
- Deep Scan 改为 unregister -> register -> process
- 完整国际化(日语、繁体中文、英语)

PeopleView:
- 修复卡片不显示问题(使用 get_file_traces API)
- 移除对 identity_id 字段的依赖

其他:
- 添加日语语言包
- 添加 useDragSelect composable
- 新增文档:Face Bbox Null Bug Report
2026-10-01 00:42:13 +08:00
7b60ca3d2d feat: add face filter components and integration guide
- useFaceFilter composable: manages face filtering state and API calls
- FaceFilterPanel component: UI for filtering controls
- FaceCard component: text-only face display card
- Integration guide: step-by-step guide for integrating into PeopleView

Implements hybrid filtering mode with:
- Instant mode: client-side filtering (5-10ms)
- Backend mode: server-side complex filtering
- Hybrid mode: backend + instant filtering (AND)

Uses actual Core API endpoints:
- GET /file/{uuid}/faces
- POST /file/{uuid}/faces/filter
- GET /file/{uuid}/face/{faceId}/filter-report
- GET /file/{uuid}/filter-stats

Preferences stored in localStorage.
2026-08-09 21:24:52 +08:00
baa42fa625 feat: add build version display to all views
Add build version indicator to verify code updates:

1. Create BuildVersion.vue component:
   - Displays in top-right corner (fixed position)
   - Format: YYYYMMDDHHMMSS-gitHash
   - Example: 20260725133504-39ce37e

2. Update vite.config.ts:
   - Inject __BUILD_VERSION__ global variable
   - Generated from build time + git commit hash

3. Add to App.vue:
   - Shown on all views automatically
   - Z-index: 9999 (always visible)

4. Add vite-env.d.ts:
   - TypeScript declarations for __BUILD_VERSION__

Purpose:
- User can verify if browser loaded latest code
- Easy to confirm updates are deployed
- No need to check source code

Location: Top-right corner, fixed position
Format: Monospace font, small text, subtle styling
2026-07-25 13:35:41 +08:00
9f667cf174 fix: correct CSS syntax error in VideoPlayer
Fixed PostCSS parse error:
- Line 1452: Missing class selector before CSS rule
- Added .ms-mark-btn-wrap class selector
- Properly formatted CSS rule blocks
2026-07-24 23:35:05 +08:00
cb7e1ba0ba fix: resolve TypeScript compilation errors
Fixes:
- VideoPlayer.vue: restore allTags, filteredMarks, marksByTag (removed by mistake)
- PeopleView.vue: fix frameTime scope in playFaceDetailVideo catch block
- Both errors caused white screen on build failure

Root cause:
1. visibleTags duplicate declaration (old + new logic)
2. frameTime undefined in catch block (scope issue)

Solution:
1. Keep allTags/filteredMarks/marksByTag (needed in template)
2. Keep visibleTags (new logic for processor toggles)
3. Move frameTime calculation to correct scope in catch block
2026-07-24 23:33:40 +08:00
48975ef247 feat: add smart responsive design for VideoPlayer
Responsive Design:
- Mobile (<768px): 98% width, 50vh video height
- Tablet (769-1024px): 900px max, 65vh video
- Desktop (1025-1440px): 1000px max, 70vh video
- Large (1441px+): 1200px max, 75vh video (advanced)
- Ultra-wide (21:9 aspect): 60vh video height

Features:
- min() for max-width to prevent overflow
- min() for max-height to respect viewport
- calc() for dynamic height calculation
- Aspect ratio media query for ultra-wide screens
- Flexible toggle wrap on mobile
2026-07-24 23:27:51 +08:00
16fb1fd1ed feat: add processor toggles and enlarge video in advanced mode
Advanced Mode Enhancements:
- Processor visibility toggles (ASRX/OCR/Face/Pose)
- Toggle switches to show/hide each processor type
- Larger video size in advanced mode (1200px vs 720px)
- Video max-height increased to 75vh

Features:
- showAsrxInPlayer/showOcrInPlayer/showFaceInPlayer/showPoseInPlayer refs
- visibleTags computed respects toggle state
- ms-proc-toggles UI with colored labels
- ms-modal-video-advanced CSS class
2026-07-24 23:27:00 +08:00
6a34a862f4 feat: add Face bbox and Pose indicator to VideoPlayer
Features:
- Face bbox overlay with identity label
- Pose indicator (top-right corner)
- Extended loadProcessorMarks for all processors
- ASRX speaker:text format

Overlays:
- OCR: orange bbox + text label
- Face: blue bbox + identity name
- Pose: purple indicator badge

New props:
- showFace: boolean
- showPose: boolean

Data formats:
- Face: { frames: [{ frame, faces: [{ bbox, identity_name }] }] }
- Pose: { frames: [{ frame, pose }] }
- ASRX: { segments: [{ start_frame, end_frame, speaker, text }] }
2026-07-24 23:17:31 +08:00
b1a9c44778 feat: add ASRX subtitle and OCR bbox overlay to VideoPlayer
Features:
- ASRX subtitle bar (below video)
- OCR bbox overlay (on video frame)
- Multi-track timeline for asrx/ocr/face/pose
- Real-time mark matching (frame-based)

Implementation:
- Add showAsrx/showOcr props
- Add loadProcessorMarks() to fetch processor JSON
- Add currentAsrxMark/currentOcrMarks computed
- Add OCR bbox overlay with text label
- Add ASRX subtitle bar with frame range

Data format (expected):
- ASRX: { segments: [{ start_frame, end_frame, text }] }
- OCR: { frames: [{ frame, text, bbox }] }

Colors:
- face: #4285f4 (blue)
- asrx: #34a853 (green)
- ocr: #fbbc04 (orange)
- pose: #9c27b0 (purple)
2026-07-24 23:11:05 +08:00
c2901338e1 feat: enforce 100% frame-based positioning (no time)
Core Principle: Frame is the ONLY standard

Changes:
- VideoPlayer: Remove startTime/endTime props
- VideoPlayer: Add mandatory startFrame/endFrame check
- VideoPlayer: UI shows F123 (51.2s) format
- All Views: Only set startFrame/endFrame
- All Views: Only pass :start-frame/:end-frame
- Remove all startTime/endTime from currentVideo refs

Time is only used for display (auxiliary).
Frame is the source of truth for all positioning.
2026-07-24 22:49:35 +08:00
76c6ec183d fix: handle missing frame params in simple playback path
Problem: LibraryView calls VideoPlayer without frame params, causing:
- startFrame=0, endFrame=undefined passed to API
- Backend returns error or malformed stream
- Video playback error: MEDIA_ELEMENT_ERROR: Format error

Solution: Only pass frame params when both startFrame and endFrame are defined.
If missing, play full video (no frame params to API).

Fixes regression from commit 1fd6312 (frame-based positioning)
2026-07-24 22:00:35 +08:00
1fd6312f7e fix: enforce frame-based positioning across all video playback
Core Principle: Frame is the only standard

Changes:
- VideoPlayer: Add startFrame/endFrame props
- VideoPlayer: Use frame parameters in simple playback path
- SearchView: Remove frame/time conversion (stop using fps = 24)
- PeopleView: Pass frames directly instead of time
- PersonDetailView: Pass frames directly instead of time

All video streams now use startFrame/endFrame API parameters.
Time conversion only happens in VideoPlayer internals for UI display.

Ref: frame-based positioning standards research
2026-07-24 21:17:11 +08:00
5951aca086 feat: frame-based positioning and mark system foundation
Core Changes:
- Fix SearchView to use start_frame/end_frame directly (no time*fps conversion)
- Add hard_delete support to delete_trace API
- VideoPlayer: Main timeline + Mark system foundation
- Proxy: Add local routes for auth, media, identity-matches, cluster-results
- Add .gitignore to exclude build artifacts and dependencies

Design Documents:
- Multi-track Mark system design (.opencode/plans/)
- Video editing positioning standards research

Files Modified:
- src/views/SearchView.vue: Frame positioning, ensureMinDuration (240 frames)
- src/views/PeopleView.vue: batchDeleteGroups with hard_delete
- src/api/index.ts: delete_trace with hard_delete body
- src/components/VideoPlayer.vue: Timeline + Mark UI
- src-tauri/src/proxy.rs: New local routes
- AGENTS.md: Update documentation
2026-07-24 20:19:47 +08:00
f915aaf794 feat: pending identity sorting, face detail modal, video player fps, processor counts 2026-06-24 02:02:33 +08:00
7855983dc1 feat: bind/unbind by id, video streaming proxy, unmute default, library refresh, hamburger click-outside
- Core API: bind/unbind accept id (integer PK) when face_id is null
- Tauri proxy: stream video responses instead of buffering for seek bar
- VideoPlayer: remove muted attribute, unmute by default
- LibraryView: call invalidateFiles() before ensureFiles() on register/unregister
- PeopleView: close sort panel on click-outside, not just hamburger toggle
- bind_face: prefer face_id, fallback to id when face_id is null
2026-06-18 22:24:03 +08:00
dbcba0e2a9 feat: VideoPlayer loading state 2026-06-15 00:24:24 +08:00
3ba2120c8e All API through Rust proxy, fix unregistered files null uuid, People enhancements 2026-06-14 11:05:23 +08:00
79e0a862d4 Initial commit: Momentry Studio v0.1.0 2026-06-13 17:49:02 +08:00