refactor CLI command modules and synchronize docs

This commit is contained in:
windyboy
2026-02-16 12:31:26 +08:00
parent 0be802eac5
commit 2dd329cba9
41 changed files with 1066 additions and 753 deletions
+29 -29
View File
@@ -5,7 +5,7 @@ Tests series completeness analysis, duplicate detection, and quality comparison.
import pytest
from pathlib import Path
from datetime import datetime
from datetime import datetime, timezone
from vlm.models import SeriesIdentity, SeasonCompleteness, MovieIdentity, VideoFile, DuplicateGroup
from vlm.analysis import analyze_series_completeness, detect_duplicates, compare_quality
@@ -193,7 +193,7 @@ class TestDuplicateDetection:
Path("/movies/The.Matrix.1999.1080p.mkv"),
"The.Matrix.1999.1080p.mkv",
2000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1920x1080",
codec="h264"
@@ -202,7 +202,7 @@ class TestDuplicateDetection:
Path("/movies/The.Matrix.1999.720p.mkv"),
"The.Matrix.1999.720p.mkv",
1000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1280x720",
codec="h264"
@@ -211,7 +211,7 @@ class TestDuplicateDetection:
Path("/movies/Inception.2010.mkv"),
"Inception.2010.mkv",
1500000000,
datetime.now(),
datetime.now(timezone.utc),
"movie"
),
]
@@ -239,7 +239,7 @@ class TestDuplicateDetection:
Path("/series/Breaking.Bad.S01E01.1080p.mkv"),
"Breaking.Bad.S01E01.1080p.mkv",
1500000000,
datetime.now(),
datetime.now(timezone.utc),
"series",
resolution="1920x1080"
),
@@ -247,7 +247,7 @@ class TestDuplicateDetection:
Path("/series/Breaking.Bad.S01E01.720p.mkv"),
"Breaking.Bad.S01E01.720p.mkv",
800000000,
datetime.now(),
datetime.now(timezone.utc),
"series",
resolution="1280x720"
),
@@ -255,7 +255,7 @@ class TestDuplicateDetection:
Path("/series/Breaking.Bad.S01E02.mkv"),
"Breaking.Bad.S01E02.mkv",
1200000000,
datetime.now(),
datetime.now(timezone.utc),
"series"
),
]
@@ -278,8 +278,8 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/movies/Movie.A.2020.mkv"), "Movie.A.2020.mkv", 1000000000, datetime.now(), "movie"),
VideoFile(Path("/movies/Movie.B.2021.mkv"), "Movie.B.2021.mkv", 1000000000, datetime.now(), "movie"),
VideoFile(Path("/movies/Movie.A.2020.mkv"), "Movie.A.2020.mkv", 1000000000, datetime.now(timezone.utc), "movie"),
VideoFile(Path("/movies/Movie.B.2021.mkv"), "Movie.B.2021.mkv", 1000000000, datetime.now(timezone.utc), "movie"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -294,8 +294,8 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/movies/Unknown.Movie.mkv"), "Unknown.Movie.mkv", 1000000000, datetime.now(), "movie"),
VideoFile(Path("/movies/Unknown.Movie.2.mkv"), "Unknown.Movie.2.mkv", 1000000000, datetime.now(), "movie"),
VideoFile(Path("/movies/Unknown.Movie.mkv"), "Unknown.Movie.mkv", 1000000000, datetime.now(timezone.utc), "movie"),
VideoFile(Path("/movies/Unknown.Movie.2.mkv"), "Unknown.Movie.2.mkv", 1000000000, datetime.now(timezone.utc), "movie"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -311,8 +311,8 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/series/Unknown.Show.E01.mkv"), "Unknown.Show.E01.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Unknown.Show.Episode.1.mkv"), "Unknown.Show.Episode.1.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Unknown.Show.E01.mkv"), "Unknown.Show.E01.mkv", 1000000000, datetime.now(timezone.utc), "series"),
VideoFile(Path("/series/Unknown.Show.Episode.1.mkv"), "Unknown.Show.Episode.1.mkv", 1000000000, datetime.now(timezone.utc), "series"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -327,8 +327,8 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/series/Show.Name.S01.mkv"), "Show.Name.S01.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.Name.Season.1.mkv"), "Show.Name.Season.1.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.Name.S01.mkv"), "Show.Name.S01.mkv", 1000000000, datetime.now(timezone.utc), "series"),
VideoFile(Path("/series/Show.Name.Season.1.mkv"), "Show.Name.Season.1.mkv", 1000000000, datetime.now(timezone.utc), "series"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -347,7 +347,7 @@ class TestDuplicateDetection:
Path("/movies/Test.Movie.2020.1080p.mkv"),
"Test.Movie.2020.1080p.mkv",
2000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1920x1080",
codec="h264",
@@ -358,7 +358,7 @@ class TestDuplicateDetection:
Path("/movies/Test.Movie.2020.720p.mkv"),
"Test.Movie.2020.720p.mkv",
1000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1280x720",
codec="h264",
@@ -395,9 +395,9 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/series/Show.S01E01-E02.mkv"), "Show.S01E01-E02.mkv", 2000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.S01E01.mkv"), "Show.S01E01.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.S01E02.mkv"), "Show.S01E02.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.S01E01-E02.mkv"), "Show.S01E01-E02.mkv", 2000000000, datetime.now(timezone.utc), "series"),
VideoFile(Path("/series/Show.S01E01.mkv"), "Show.S01E01.mkv", 1000000000, datetime.now(timezone.utc), "series"),
VideoFile(Path("/series/Show.S01E02.mkv"), "Show.S01E02.mkv", 1000000000, datetime.now(timezone.utc), "series"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -413,8 +413,8 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/movies/The.Thing.1982.mkv"), "The.Thing.1982.mkv", 1000000000, datetime.now(), "movie"),
VideoFile(Path("/movies/The.Thing.2011.mkv"), "The.Thing.2011.mkv", 1000000000, datetime.now(), "movie"),
VideoFile(Path("/movies/The.Thing.1982.mkv"), "The.Thing.1982.mkv", 1000000000, datetime.now(timezone.utc), "movie"),
VideoFile(Path("/movies/The.Thing.2011.mkv"), "The.Thing.2011.mkv", 1000000000, datetime.now(timezone.utc), "movie"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -429,8 +429,8 @@ class TestDuplicateDetection:
]
files = [
VideoFile(Path("/series/Show.S01E01.mkv"), "Show.S01E01.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.S02E01.mkv"), "Show.S02E01.mkv", 1000000000, datetime.now(), "series"),
VideoFile(Path("/series/Show.S01E01.mkv"), "Show.S01E01.mkv", 1000000000, datetime.now(timezone.utc), "series"),
VideoFile(Path("/series/Show.S02E01.mkv"), "Show.S02E01.mkv", 1000000000, datetime.now(timezone.utc), "series"),
]
result = detect_duplicates(list(zip(identities, files)))
@@ -448,7 +448,7 @@ class TestQualityComparison:
Path("/test/file1.mkv"),
"file1.mkv",
2000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1920x1080",
codec="h264",
@@ -459,7 +459,7 @@ class TestQualityComparison:
Path("/test/file2.mkv"),
"file2.mkv",
1000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1280x720",
codec="h265",
@@ -490,7 +490,7 @@ class TestQualityComparison:
Path("/test/file1.mkv"),
"file1.mkv",
2000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1920x1080"
# codec, duration, bitrate not available
@@ -499,7 +499,7 @@ class TestQualityComparison:
Path("/test/file2.mkv"),
"file2.mkv",
1000000000,
datetime.now(),
datetime.now(timezone.utc),
"movie"
# No optional metadata
),
@@ -532,7 +532,7 @@ class TestQualityComparison:
Path("/test/file.mkv"),
"file.mkv",
1500000000,
datetime.now(),
datetime.now(timezone.utc),
"movie",
resolution="1920x1080",
codec="h264"