62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
"""
|
|
Read command - Display metadata from files.
|
|
|
|
This command reads and displays metadata from image files in a
|
|
formatted table view. Supports single files or recursive directory processing.
|
|
"""
|
|
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
import typer
|
|
from rich.console import Console
|
|
|
|
from src.services.metadata_factory import MetadataFactory
|
|
from src.utils.display import print_metadata_table
|
|
from src.utils.get_target_files import get_target_files
|
|
|
|
console = Console()
|
|
log = logging.getLogger("metadata-scrubber")
|
|
|
|
|
|
# fmt: off
|
|
def read(
|
|
file_path: Path = typer.Argument(
|
|
exists=True, # Must exist on the filesystem
|
|
file_okay=True, # Can be a file
|
|
dir_okay=True, # Can be a directory
|
|
readable=True, # Must be readable (permissions check)
|
|
resolve_path=True, # Auto-convert to absolute path
|
|
help="The path to the file you want to process",
|
|
),
|
|
recursive: bool = typer.Option(False, "--recursive", "-r", help="Recursively process files in the specified directory."),
|
|
ext: str = typer.Option(None,"--extension", "-ext", help="The file extension to filter by. eg: jpg, png, pdf"),
|
|
):
|
|
if recursive and not ext:
|
|
raise typer.BadParameter("If you provide --recursive or -r, you must also provide --extension or -ext.")
|
|
if ext and not recursive:
|
|
raise typer.BadParameter("If you provide --extension or -ext, you must also provide --recursive or -r.")
|
|
|
|
for file in get_target_files(file_path, ext) if recursive else [file_path]:
|
|
try:
|
|
# Get the correct object from the factory
|
|
handler = MetadataFactory.get_handler(str(file))
|
|
|
|
# Read
|
|
console.print(f"🔎 Reading [bold cyan]{file.name}[/bold cyan]...")
|
|
current_data = handler.read()
|
|
if log.isEnabledFor(logging.DEBUG):
|
|
# if verbose mode is enabled, log the Info
|
|
log.info(f"Successfully read metadata from {file.name}")
|
|
print_metadata_table(current_data)
|
|
|
|
except Exception as e:
|
|
# display error in console
|
|
console.print(f"❌ [bold red]Skipped[/bold red] [cyan]{file.name}[/cyan]: [dim]{e}[/dim]")
|
|
|
|
# LOG: Full technical details (Stack trace) for you to debug
|
|
|
|
if log.isEnabledFor(logging.DEBUG):
|
|
# if verbose mode is enabled, log the traceback
|
|
log.error(f"Failed to read metadata from {file}", exc_info=True)
|