133 lines
5.3 KiB
Markdown
133 lines
5.3 KiB
Markdown
|
|
# 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 <directory> -store <store-name>
|
||
|
|
```
|
||
|
|
|
||
|
|
### 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
|
||
|
|
|