# Add-File Batch Directory Mode ## Overview The `add-file` cmdlet now supports scanning directories for batch file operations. When you provide a directory path with the `-path` argument and specify a `-store` location, add-file will: 1. **Scan** the directory for all supported media files 2. **Hash** each file (SHA256) 3. **Display** a result table with filename, hash, size, and extension 4. **Wait** for your selection using `@N` syntax 5. **Add** only the selected files to your store ## Usage ### Basic Syntax ```bash add-file -path -store ``` ### Step-by-Step Example #### Step 1: Scan directory and show table ```bash add-file -path "C:\Users\Admin\Downloads\test_add_file" -store mystore ``` Output: ``` ✓ Found 3 files in directory. Use @N syntax to select (e.g., @1 or @1-3) Files in Directory ───────────────────────────────────────────────────────── # │ name │ hash │ size │ ext ──────────────────────────────────────────────────────────── 1 │ image1.jpg │ a3f9b2c1... │ 2.3 MB │ .jpg 2 │ video1.mp4 │ d4e8f7a3... │ 45.2 MB │ .mp4 3 │ audio1.mp3 │ b1c9d2e3... │ 3.8 MB │ .mp3 ``` The command **stops here** and waits for your selection - no files are processed yet. #### Step 2: Select files using @N syntax After the table is displayed, use one of these selection syntaxes: ```bash # Add file 1 only @1 # Add files 1 through 3 @1-3 # Add files 1, 2, and 3 @1,@2,@3 # Add files 2 and 3 @2-3 ``` The selected file(s) are then piped back to `add-file` for processing and added to your store. ## Workflow Diagram ``` User Command: ┌─────────────────────────────────────────────────────┐ │ add-file -path "D:\media" -store mystore │ └─────────────────────────────────────────────────────┘ ↓ ┌───────────────────────┐ │ STEP 1: Scan & Display│ │ - Scan directory │ │ - Compute hashes │ │ - Show result table │ │ - WAIT for @N input │ └───────────────────────┘ ↓ User Response: ┌─────────────────────────────────────────────────────┐ │ @1,@3 (select files 1 and 3) │ └─────────────────────────────────────────────────────┘ ↓ ┌───────────────────────┐ │ STEP 2: Process Files │ │ - Get selected items │ │ - Copy to store │ │ - Show results │ └───────────────────────┘ ↓ Files added successfully! ``` ## Supported File Types The directory scanner supports all media files defined in `SUPPORTED_MEDIA_EXTENSIONS`: - **Images**: .jpg, .jpeg, .png, .gif, .webp, .bmp, .tiff - **Videos**: .mp4, .mkv, .webm, .mov, .avi, .flv, .mpg, .mpeg, .ts, .m4v, .wmv - **Audio**: .mp3, .flac, .wav, .m4a, .aac, .ogg, .opus, .wma, .mka - **Documents**: .pdf, .epub, .txt, .mobi, .azw3, .cbz, .cbr, .doc, .docx ## Key Behavior Notes 1. **No immediate processing**: Directory scan shows table and returns without copying/adding any files 2. **User control**: Nothing happens until the user makes an `@N` selection 3. **Batch selection**: Multiple files can be selected with comma or range syntax 4. **Hash display**: Each file's SHA256 is displayed (first 12 chars in table) 5. **Error handling**: Unsupported file types are automatically filtered out ## Implementation Details ### New Methods Added - **`_scan_directory_for_files(directory: Path)`**: Static method that scans a directory and returns a list of dicts with: - `path`: Path object to the file - `name`: Filename - `hash`: SHA256 hash - `size`: File size in bytes - `ext`: File extension ### Modified Methods - **`run()`**: - Detects when `-path` is a directory AND `-store` is provided - Calls `_scan_directory_for_files()` to build the file list - Displays result table - **Returns early (return 0) without processing** - this is key! - User selection via `@N` pipes selected items back to add-file for processing - **`_resolve_source()`**: - Added priority for directory scan results (path + hash keys) - Handles items coming from @N selection seamlessly ## Error Handling - If directory doesn't exist or isn't readable, returns error - If a file fails to hash, it's skipped with debug output logged - Unsupported file types are automatically filtered out during scan