Implement duplicate resolution strategy by quality and enhance related documentation

- Updated `duplicate_resolve.py` to introduce a new strategy for keeping files based on quality, considering resolution, source, codec, and size.
- Enhanced `planner.py` to utilize the new quality-based strategy during plan generation, updating quarantine reasons accordingly.
- Modified `README.md` to document the new `plan.duplicate_keep` options, including `by_quality`, and provided detailed descriptions of each strategy.
- Added unit tests in `test_duplicate_resolve.py` to validate the new quality-based resolution logic.
- Updated `analysis.json` and `plan.json` with new timestamps and IDs to reflect recent changes.

These updates improve the Video Library Manager's ability to handle duplicate files more effectively, ensuring users retain the highest quality versions.
This commit is contained in:
windyboy
2026-02-11 08:44:48 +08:00
parent 79f5ddf1f5
commit 1f55eab304
9 changed files with 297 additions and 20 deletions
+48
View File
@@ -375,6 +375,54 @@ def test_generate_plan_summary(config):
assert plan.summary["quarantine"] == 0
def test_generate_plan_with_analysis_by_quality(config):
"""With analysis duplicates and by_quality, higher-quality file is kept."""
config.duplicate_keep = "by_quality"
p_720 = Path("/mnt/nas/videos/movie/Test.2020.720p.WEB-DL.mkv")
p_1080 = Path("/mnt/nas/videos/movie/Test.2020.1080p.BluRay.mkv")
vf_720 = VideoFile(
path=p_720,
filename="Test.2020.720p.WEB-DL.mkv",
size_bytes=1000000,
modified_timestamp=datetime.now(),
category="movie",
)
vf_1080 = VideoFile(
path=p_1080,
filename="Test.2020.1080p.BluRay.mkv",
size_bytes=2000000,
modified_timestamp=datetime.now(),
category="movie",
)
identity = MovieIdentity(
title="Test",
year=2020,
confidence=0.9,
needs_review=False,
original_filename="Test.2020.mkv",
)
identities = [(vf_720, identity), (vf_1080, identity)]
analysis_data = {
"metadata": {"source_identities": "identities.json"},
"completeness": [],
"duplicates": [
{
"identity": {"type": "movie", "title": "Test", "year": 2020},
"files": [str(p_720), str(p_1080)],
"quality_comparison": [
{"path": str(p_720), "resolution": "1280x720", "size_bytes": 1000000},
{"path": str(p_1080), "resolution": "1920x1080", "size_bytes": 2000000},
],
}
],
}
plan = generate_plan(identities, config, analysis_data=analysis_data)
assert plan.summary["quarantine"] == 1
assert plan.operations[0].operation_type == "quarantine" # 720p quarantined
assert plan.operations[1].operation_type == "move" # 1080p kept
assert "画质" in plan.operations[0].reason
def test_generate_plan_with_different_extensions(config):
"""Test plan generation preserves file extensions."""
extensions = [".mp4", ".mkv", ".avi"]