commit remaining modified project files

This commit is contained in:
windyboy
2026-04-07 08:07:18 +08:00
parent d010cf936c
commit fb128c70d6
28 changed files with 4140 additions and 19643 deletions
+20 -10
View File
@@ -13,7 +13,13 @@ from vlm.io import (
load_inventory_csv,
save_analysis_json,
)
from vlm.models import MovieIdentity, SeriesIdentity
from vlm.models import (
AnalysisCompletenessRecord,
AnalysisDuplicateIdentityRecord,
AnalysisDuplicateRecord,
MovieIdentity,
SeriesIdentity,
)
def analyze_cmd(
@@ -39,19 +45,16 @@ def analyze_cmd(
click.echo()
inventory_files = load_inventory_csv(inventory) if inventory else None
movie_identities, series_identities, video_files = identities_to_analysis_input(
movie_pairs, series_pairs = identities_to_analysis_input(
identities_data, inventory_files=inventory_files
)
series_identities = [identity for identity, _ in series_pairs]
click.echo("Analyzing series completeness...")
completeness_results = analyze_series_completeness(series_identities)
click.echo("Detecting duplicates...")
n_movies = len(movie_identities)
identity_file_pairs = (
list(zip(movie_identities, video_files[:n_movies]))
+ list(zip(series_identities, video_files[n_movies:]))
)
identity_file_pairs = movie_pairs + series_pairs
duplicate_groups = detect_duplicates(identity_file_pairs)
click.echo()
@@ -71,7 +74,7 @@ def analyze_cmd(
click.echo(f"Saving analysis results to: {output}")
output.parent.mkdir(parents=True, exist_ok=True)
completeness_list = [
completeness_list: list[AnalysisCompletenessRecord] = [
{
"series_title": c.series_title,
"season": c.season,
@@ -80,14 +83,21 @@ def analyze_cmd(
}
for c in completeness_results
]
duplicates_list = []
duplicates_list: list[AnalysisDuplicateRecord] = []
for d in duplicate_groups:
if isinstance(d.identity, MovieIdentity):
identity_info = {"type": "movie", "title": d.identity.title, "year": d.identity.year}
identity_info: AnalysisDuplicateIdentityRecord = {
"type": "movie",
"title": d.identity.title,
"year": d.identity.year,
"season": None,
"episodes": [],
}
else:
identity_info = {
"type": "series",
"title": d.identity.title,
"year": None,
"season": d.identity.season,
"episodes": d.identity.episodes,
}
+8 -7
View File
@@ -9,6 +9,7 @@ import click
from vlm.context import CLIContext
from vlm.io import load_inventory_csv, save_identities_json
from vlm.models import IdentityRecord, MovieIdentityRecord, ParsedIdentitiesJSON, SeriesIdentityRecord, VideoFile
from vlm.parser import parse_movie, parse_series
from vlm.utils import utc_now
@@ -20,7 +21,7 @@ def parse_cmd(ctx: CLIContext, input: Path, output: Path, inventory: Optional[Pa
click.echo(f"Parsing identities from: {input}")
path_to_metadata: dict[str, object] = {}
path_to_metadata: dict[str, VideoFile] = {}
if inventory:
click.echo(f"Loading video metadata from: {inventory}")
inventory_files = load_inventory_csv(inventory)
@@ -30,7 +31,7 @@ def parse_cmd(ctx: CLIContext, input: Path, output: Path, inventory: Optional[Pa
click.echo()
inventory_files = load_inventory_csv(input)
video_files = [
video_files: list[dict[str, str]] = [
{
"path": str(vf.path),
"filename": vf.filename,
@@ -42,10 +43,10 @@ def parse_cmd(ctx: CLIContext, input: Path, output: Path, inventory: Optional[Pa
click.echo(f"Loaded {len(video_files)} files from inventory")
click.echo()
movie_identities: list[dict] = []
series_identities: list[dict] = []
anime_files: list[dict] = []
other_files: list[dict] = []
movie_identities: list[MovieIdentityRecord] = []
series_identities: list[SeriesIdentityRecord] = []
anime_files: list[IdentityRecord] = []
other_files: list[IdentityRecord] = []
def get_video_metadata(file_path: str) -> dict:
"""Extract video metadata from inventory if available."""
@@ -141,7 +142,7 @@ def parse_cmd(ctx: CLIContext, input: Path, output: Path, inventory: Optional[Pa
generation_timestamp = utc_now().strftime("%Y-%m-%dT%H:%M:%S")
schema_version = "2.0" if path_to_metadata else "1.0"
identities_data = {
identities_data: ParsedIdentitiesJSON = {
"vlm_schema_version": schema_version,
"metadata": {
"generated": generation_timestamp,
+5 -2
View File
@@ -82,9 +82,12 @@ def plan_cmd(ctx: CLIContext, input: Path, output: Path, analysis: Optional[Path
click.echo(" Review the plan file for details on conflicting operations.")
# Check for directory warnings
directory_warning = execution_plan.metadata.get("directory_warning", False)
validation_snapshot = execution_plan.metadata.get("validation_snapshot", {})
if not isinstance(validation_snapshot, dict):
validation_snapshot = {}
directory_warning = bool(validation_snapshot.get("directory_warning", False))
if directory_warning:
emptied_dirs = execution_plan.metadata.get("emptied_directories", [])
emptied_dirs = validation_snapshot.get("emptied_directories", [])
click.echo()
click.echo(f" ⚠️ Directory preservation warning: {len(emptied_dirs)} directories will be emptied")
click.echo(" These directories will be preserved but may be empty after execution.")