From ad76eaa56f74dcf79ad3be0ebad2f892ec6d06ee Mon Sep 17 00:00:00 2001 From: CI Bot Date: Thu, 3 Sep 2026 16:39:08 +0000 Subject: [PATCH] style: auto-format with black + isort + prettier [skip ci-format-check] --- apps/worker/video_processing/dedup.py | 14 +++++------ tests/unit/test_dedup_v2.py | 36 +++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/apps/worker/video_processing/dedup.py b/apps/worker/video_processing/dedup.py index 85cc07c6b..8cf2f2ef5 100755 --- a/apps/worker/video_processing/dedup.py +++ b/apps/worker/video_processing/dedup.py @@ -179,11 +179,11 @@ class VideoDeduplicator: """ # ── Issue #1658: 校准后的常量 ── - PHASH_THRESHOLD = 8 # 从 10 收紧到 8 - MATCH_RATIO_THRESHOLD = 0.7 # 至少 70% 帧匹配 - DUPLICATE_THRESHOLD = 0.70 # 融合后相似度阈值 - PHASH_WEIGHT = 0.7 # pHash 权重 - HISTOGRAM_WEIGHT = 0.3 # 直方图权重 + PHASH_THRESHOLD = 8 # 从 10 收紧到 8 + MATCH_RATIO_THRESHOLD = 0.7 # 至少 70% 帧匹配 + DUPLICATE_THRESHOLD = 0.70 # 融合后相似度阈值 + PHASH_WEIGHT = 0.7 # pHash 权重 + HISTOGRAM_WEIGHT = 0.3 # 直方图权重 def compute_fingerprint(self, video_path: str) -> VideoFingerprint: """Compute video fingerprint using MD5, pHash, and color histogram. @@ -373,9 +373,7 @@ class VideoDeduplicator: # 直方图相似度:任一方无数据时统一返回 0.0(无法判定),避免不对称 if existing_histograms and fingerprint.color_histograms: - hist_similarity = self._compute_histogram_similarity( - fingerprint.color_histograms, existing_histograms - ) + hist_similarity = self._compute_histogram_similarity(fingerprint.color_histograms, existing_histograms) else: hist_similarity = 0.0 combined_score = self.PHASH_WEIGHT * phash_similarity + self.HISTOGRAM_WEIGHT * hist_similarity diff --git a/tests/unit/test_dedup_v2.py b/tests/unit/test_dedup_v2.py index 2b2ee8b8f..91649a163 100644 --- a/tests/unit/test_dedup_v2.py +++ b/tests/unit/test_dedup_v2.py @@ -96,13 +96,14 @@ sys.modules["packages.adapters.sqlalchemy_impl.models"] = _mock_module( sys.modules["packages.shared.config"] = _mock_module(get_shared_settings=MagicMock(return_value=MagicMock())) sys.modules["packages.shared.storage"] = _mock_module() +import video_processing.dedup as _dedup_module # noqa: E402 + # Import while mocks active from video_processing.dedup import ( # noqa: E402 VideoDeduplicator, VideoFingerprint, hamming_distance, ) -import video_processing.dedup as _dedup_module # noqa: E402 # Restore sys.modules for _key in list(sys.modules.keys()): @@ -179,6 +180,7 @@ class TestMedianVsMean: def test_median_resists_outlier(self): """距离 [3, 3, 3, 3, 30]:均值=8.4,中位数=3。""" import statistics + distances = [3, 3, 3, 3, 30] mean_val = sum(distances) / len(distances) median_val = statistics.median(distances) @@ -620,7 +622,14 @@ class TestComputeDuplicateRate: with patch.object(_dedup_module, "SQLAlchemyGeneratedVideoRepository", return_value=mock_repo): with patch.object(d, "_get_existing_chunks", return_value=[]): # Patch the import inside the method - with patch.dict(sys.modules, {"packages.adapters.sqlalchemy_impl.models": _mock_module(GeneratedVideoModel=mock_generated_model)}): + with patch.dict( + sys.modules, + { + "packages.adapters.sqlalchemy_impl.models": _mock_module( + GeneratedVideoModel=mock_generated_model + ) + }, + ): # Need to patch session.query to return mock_query mock_session.query.return_value = mock_query result = d.compute_duplicate_rate(fp, "proj_1", None, mock_session) @@ -658,7 +667,14 @@ class TestComputeDuplicateRate: mock_generated_model = MagicMock() with patch.object(_dedup_module, "SQLAlchemyGeneratedVideoRepository", return_value=mock_repo): with patch.object(d, "_get_existing_chunks", return_value=[]): - with patch.dict(sys.modules, {"packages.adapters.sqlalchemy_impl.models": _mock_module(GeneratedVideoModel=mock_generated_model)}): + with patch.dict( + sys.modules, + { + "packages.adapters.sqlalchemy_impl.models": _mock_module( + GeneratedVideoModel=mock_generated_model + ) + }, + ): result = d.compute_duplicate_rate(fp, "proj_1", None, mock_session) # 完全相同 → similarity≈1.0 → rate≈100 @@ -698,7 +714,14 @@ class TestComputeDuplicateRate: mock_generated_model = MagicMock() with patch.object(_dedup_module, "SQLAlchemyGeneratedVideoRepository", return_value=mock_repo): with patch.object(d, "_get_existing_chunks", return_value=[]): - with patch.dict(sys.modules, {"packages.adapters.sqlalchemy_impl.models": _mock_module(GeneratedVideoModel=mock_generated_model)}): + with patch.dict( + sys.modules, + { + "packages.adapters.sqlalchemy_impl.models": _mock_module( + GeneratedVideoModel=mock_generated_model + ) + }, + ): result = d.compute_duplicate_rate(fp, "proj_1", None, mock_session) # phash 完全不同(0.0) + 直方图完全相同(1.0) → 0.7*0 + 0.3*1 = 0.3 → 30.0 @@ -720,7 +743,10 @@ class TestComputeDuplicateRate: mock_generated_model = MagicMock() with patch.object(_dedup_module, "SQLAlchemyGeneratedVideoRepository", return_value=mock_repo): - with patch.dict(sys.modules, {"packages.adapters.sqlalchemy_impl.models": _mock_module(GeneratedVideoModel=mock_generated_model)}): + with patch.dict( + sys.modules, + {"packages.adapters.sqlalchemy_impl.models": _mock_module(GeneratedVideoModel=mock_generated_model)}, + ): result = d.compute_duplicate_rate(fp, "proj_1", None, mock_session) assert result == 0.0