Add selected dashcam imports
Co-authored-by: Copilot <[email protected]>
This commit is contained in:
+47
-9
@@ -383,10 +383,8 @@ def delete_dashcam_files(relative_path=None, delete_all=False, mount_point=DEFAU
|
||||
return result
|
||||
|
||||
|
||||
def copy_files(source_folder, destination_folder):
|
||||
"""Copy every video file found under source_folder into destination_folder,
|
||||
preserving its relative sub-folder path (dashcams often split files into
|
||||
date/event sub-folders - flattening them risks filename collisions).
|
||||
def copy_files(source_folder, destination_folder, relative_paths=None):
|
||||
"""Copy selected videos, or every video when relative_paths is omitted.
|
||||
|
||||
Files already present at the destination (same relative path, same size)
|
||||
are skipped so re-running an import doesn't re-copy everything.
|
||||
@@ -394,11 +392,43 @@ def copy_files(source_folder, destination_folder):
|
||||
Returns a summary dict: {found, copied, skipped, errors}.
|
||||
"""
|
||||
os.makedirs(destination_folder, exist_ok=True)
|
||||
errors = []
|
||||
|
||||
if relative_paths is None:
|
||||
videos = find_video_files(source_folder)
|
||||
else:
|
||||
if not isinstance(relative_paths, list) or not relative_paths:
|
||||
return {
|
||||
"found": 0,
|
||||
"copied": 0,
|
||||
"skipped": 0,
|
||||
"errors": ["Select at least one video to import."],
|
||||
"invalid_selection": True,
|
||||
}
|
||||
|
||||
videos = []
|
||||
seen = set()
|
||||
for relative_path in relative_paths:
|
||||
if relative_path in seen:
|
||||
continue
|
||||
seen.add(relative_path)
|
||||
try:
|
||||
abs_path = _safe_video_path(source_folder, relative_path)
|
||||
except ValueError as e:
|
||||
return {
|
||||
"found": 0,
|
||||
"copied": 0,
|
||||
"skipped": 0,
|
||||
"errors": [str(e)],
|
||||
"invalid_selection": True,
|
||||
}
|
||||
except FileNotFoundError:
|
||||
errors.append(f"Video not found: {relative_path}")
|
||||
continue
|
||||
videos.append((abs_path, relative_path))
|
||||
|
||||
videos = find_video_files(source_folder)
|
||||
copied = 0
|
||||
skipped = 0
|
||||
errors = []
|
||||
|
||||
for abs_path, rel_path in videos:
|
||||
dest_path = os.path.join(destination_folder, rel_path)
|
||||
@@ -417,7 +447,11 @@ def copy_files(source_folder, destination_folder):
|
||||
return {"found": len(videos), "copied": copied, "skipped": skipped, "errors": errors}
|
||||
|
||||
|
||||
def import_dashcam(destination_folder=DEFAULT_DESTINATION, mount_point=DEFAULT_MOUNT_POINT):
|
||||
def import_dashcam(
|
||||
destination_folder=DEFAULT_DESTINATION,
|
||||
mount_point=DEFAULT_MOUNT_POINT,
|
||||
relative_paths=None,
|
||||
):
|
||||
"""Full detect -> mount -> copy -> unmount pipeline.
|
||||
|
||||
Returns a summary dict describing what happened, always unmounting the
|
||||
@@ -440,8 +474,12 @@ def import_dashcam(destination_folder=DEFAULT_DESTINATION, mount_point=DEFAULT_M
|
||||
}
|
||||
|
||||
try:
|
||||
summary = copy_files(source, destination_folder)
|
||||
summary["status"] = "ok"
|
||||
summary = copy_files(source, destination_folder, relative_paths)
|
||||
summary["status"] = (
|
||||
"invalid_selection" if summary.pop("invalid_selection", False) else "ok"
|
||||
)
|
||||
if summary["status"] == "invalid_selection":
|
||||
summary["message"] = summary["errors"][0]
|
||||
summary["device"] = device_path
|
||||
return summary
|
||||
finally:
|
||||
|
||||
Reference in New Issue
Block a user