Initial development by Claude
This commit is contained in:
155
README.md
155
README.md
@@ -1,2 +1,155 @@
|
||||
# path-juggler
|
||||
# Path Juggler
|
||||
|
||||
Automates file organization by watching folders and routing files to structured destinations based on matching source material.
|
||||
|
||||
## Current Workflow: DIT Editorial Proxies
|
||||
|
||||
The default configuration watches for Resolve render outputs and organizes them into editorial proxy folder structures:
|
||||
|
||||
1. Watches `~/Movies/AM` and `~/Movies/PM` for MXF files from Resolve
|
||||
2. Parses filenames like `A080C002_251209R2.mxf` to extract the reel prefix (`A080`)
|
||||
3. Searches mounted `HONEY 1`, `HONEY 2`, etc. volumes for matching bin folders
|
||||
4. Creates the editorial proxy folder structure in `~/Movies/Honey Dailies Transfer`
|
||||
5. Moves the rendered files to the correct location
|
||||
|
||||
### Example
|
||||
|
||||
- Resolve outputs: `~/Movies/AM/A080C002_251209R2.mxf`
|
||||
- Path Juggler finds on HONEY 1: `Honey/20251209_Day 22/02 FOOTAGE/CAM_A/A080CY75/`
|
||||
- Path Juggler creates: `~/Movies/Honey Dailies Transfer/20251209_Day 22 AM/03 EDITORIAL PROXIES/CAM_A/A080CY75/`
|
||||
- Path Juggler moves the MXF file there
|
||||
|
||||
## Installation
|
||||
|
||||
### Option 1: Standalone App (Recommended)
|
||||
|
||||
Build a self-contained macOS application - no Python dependencies needed after building:
|
||||
|
||||
```bash
|
||||
# Make the build script executable
|
||||
chmod +x build_app.sh
|
||||
|
||||
# Build the app
|
||||
./build_app.sh
|
||||
```
|
||||
|
||||
This creates `dist/Path Juggler.app` which you can drag to your Applications folder.
|
||||
|
||||
**First launch:** Right-click the app and select "Open" to bypass Gatekeeper (since it's self-signed).
|
||||
|
||||
#### Optional: Add a custom icon
|
||||
|
||||
```bash
|
||||
# Requires Pillow
|
||||
pip3 install Pillow
|
||||
python3 create_icon.py
|
||||
|
||||
# Then edit build_app.sh and change:
|
||||
# icon=None,
|
||||
# to:
|
||||
# icon='AppIcon.icns',
|
||||
|
||||
# Rebuild
|
||||
./build_app.sh
|
||||
```
|
||||
|
||||
### Option 2: Run from Source
|
||||
|
||||
If you prefer to run the Python scripts directly:
|
||||
|
||||
```bash
|
||||
pip3 install watchdog
|
||||
python3 path_juggler_gui.py
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### GUI Application
|
||||
|
||||
Launch the app (double-click or from terminal):
|
||||
|
||||
```bash
|
||||
open "Path Juggler.app"
|
||||
# or
|
||||
python3 path_juggler_gui.py
|
||||
```
|
||||
|
||||
The GUI provides:
|
||||
- Start/Stop button to control watching
|
||||
- Live status of mounted HONEY volumes
|
||||
- Real-time activity log with color-coded messages
|
||||
- Clean macOS-style interface
|
||||
|
||||
### Command Line Interface
|
||||
|
||||
**Watch mode (default)** - Continuously watches for new files:
|
||||
|
||||
```bash
|
||||
python3 path_juggler.py
|
||||
```
|
||||
|
||||
**Dry run** - See what would happen without moving anything:
|
||||
|
||||
```bash
|
||||
python3 path_juggler.py --dry-run
|
||||
```
|
||||
|
||||
**Process once and exit** - Process existing files without watching:
|
||||
|
||||
```bash
|
||||
python3 path_juggler.py --once
|
||||
```
|
||||
|
||||
**Verbose mode** - See detailed logging:
|
||||
|
||||
```bash
|
||||
python3 path_juggler.py -v
|
||||
```
|
||||
|
||||
## Files
|
||||
|
||||
- `path_juggler_gui.py` - GUI application
|
||||
- `path_juggler.py` - Command line interface
|
||||
- `path_juggler_core.py` - Core logic (shared by both interfaces)
|
||||
- `build_app.sh` - Build script for standalone .app
|
||||
- `create_icon.py` - Optional icon generator
|
||||
|
||||
## Customization
|
||||
|
||||
Edit the configuration section at the top of `path_juggler_core.py`:
|
||||
|
||||
```python
|
||||
WATCH_FOLDERS = {
|
||||
"AM": Path.home() / "Movies" / "AM",
|
||||
"PM": Path.home() / "Movies" / "PM",
|
||||
}
|
||||
DESTINATION_BASE = Path.home() / "Movies" / "Honey Dailies Transfer"
|
||||
VOLUME_PATTERN = re.compile(r"^HONEY \d+$")
|
||||
PROJECT_FOLDER = "Honey"
|
||||
FOOTAGE_FOLDER = "02 FOOTAGE"
|
||||
PROXIES_FOLDER = "03 EDITORIAL PROXIES"
|
||||
```
|
||||
|
||||
After changing configuration, rebuild the app with `./build_app.sh`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "No HONEY volumes found"
|
||||
- Make sure your backup drives are mounted
|
||||
- Check they're named exactly `HONEY 1`, `HONEY 2`, etc. (with space before number)
|
||||
|
||||
### "Could not find bin folder for A080"
|
||||
- Verify the bin exists in SilverStack's folder structure
|
||||
- Check the path follows: `HONEY X/Honey/YYYYMMDD_Day XX/02 FOOTAGE/CAM_X/A080XXXX/`
|
||||
|
||||
### Files not being detected
|
||||
- Ensure Resolve is outputting to `~/Movies/AM` or `~/Movies/PM`
|
||||
- Check file extension is `.mxf` (case insensitive)
|
||||
|
||||
### App won't open ("unidentified developer")
|
||||
- Right-click the app and select "Open" instead of double-clicking
|
||||
- Or: System Preferences → Security & Privacy → "Open Anyway"
|
||||
|
||||
### Build fails
|
||||
- Ensure you have Xcode Command Line Tools: `xcode-select --install`
|
||||
- Check Python 3.8+ is installed: `python3 --version`
|
||||
|
||||
Reference in New Issue
Block a user