fix(dedup): check_duplicate支持exclude_video_id,修复recompute自匹配duplicate_of指向自己 (Issue #1702连带修复)
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m3s
AI Code Review / AI Code Review (pull_request) Successful in 3m15s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m24s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m17s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m16s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m19s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m35s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m8s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 4m19s
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 11s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 23s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 270h1m6s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 270h1m6s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 270h1m6s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 270h1m11s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 269h56m40s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 269h56m40s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 269h56m45s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 269h56m45s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 270h0m53s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 270h0m56s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 270h1m1s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 270h1m5s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 270h0m53s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 270h1m6s
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 270h1m6s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 270h35m23s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 270h35m31s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 270h35m35s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 270h35m36s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 270h31m15s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 270h35m31s

recompute-dedup重算时视频记录已在库中(正常生成流程新视频未落库所以没暴露),
check_duplicate候选列表包含自身,自匹配汉明距离0融合分最高,导致
is_duplicate=true但duplicate_of指向视频自己。
check_batch_duplicate/compute_duplicate_rate本就有排除自身逻辑,
给check_duplicate补exclude_video_id参数,recompute任务与helpers均传入。
补回归单测。
This commit is contained in:
deploy-release-bot
2026-09-05 08:51:15 +08:00
committed by xiaoxia
parent 7a4aa27f71
commit 05f832a2eb
3 changed files with 48 additions and 0 deletions
+8
View File
@@ -782,6 +782,7 @@ class VideoDeduplicator:
scope: str = "project",
user_id: str = "",
duration_sec: float = 0,
exclude_video_id: str | None = None,
) -> Optional[dict]:
"""检查视频是否与已有视频重复。
@@ -798,6 +799,9 @@ class VideoDeduplicator:
scope: "project" 项目内查重(默认),"user" 跨项目全局查重
user_id: 用户 ID(scope="user" 时使用)
duration_sec: 视频时长(秒),用于时长预过滤 ±15%
exclude_video_id: 排除的视频 ID(查重自身时用)。recompute-dedup
重算时视频记录已存在,不排除会自匹配(距离 0 分最高)导致
duplicate_of 指向自己(Issue #1702 连带修复)。
Returns:
重复信息字典(含 duplicate, duplicate_of, reason, similarity, duplicate_segments),
@@ -815,6 +819,9 @@ class VideoDeduplicator:
best_result: Optional[dict] = None
for existing in existing_videos:
# 排除自身(recompute 时当前视频已在候选列表里,否则自匹配距离 0 必最高分)
if exclude_video_id and existing.id == exclude_video_id:
continue
if not existing.video_fingerprint:
continue
@@ -1240,6 +1247,7 @@ def check_duplicate_task(self: Task, generated_video_id: str) -> dict:
# Issue #1702: fingerprint.duration 单位已经是秒,旧代码 /1000 导致
# ±15% 时长预过滤窗口缩到 ~0.013s,scope=user 的跨项目查重永远返回 None。
duration_sec=fingerprint.duration if fingerprint.duration else 0,
exclude_video_id=generated_video_id,
)
video.video_fingerprint = fingerprint.to_dict()