#!/bin/bash ###################################################################################### # Name: Camera Ingest Script # Author: voidf1sh (Skylar Grant) # Environment: M1 MacBook Pro # # Mounts: # Camera SD: /dev/diskXsY (varies) -- /Volumes/NO NAME # NAS: //GUEST:@192.168.0.2/media -- /Volumes/media or /Volumes/media-1 (varies) # # Git: https://git.vfsh.dev/voidf1sh/custom-scripts # File: cam-ingest-mac.sh # Version: 0.0.28 ###################################################################################### # Some initial variables to work with # Set the date for folder creation CURRENT_DATE=$(date +%F) # Paths # IMPORTANT: Paths should NEVER have trailing slashes, and ALWAYS have leading slashes # SD card mount point SD_MOUNT_POINT="/Volumes/NO NAME" # Camera's path to images SD_SRC_PATH="/DCIM/100MSDCF" # NAS Network Address NAS_ADDRESS="//GUEST:@192.168.0.2/media" # Folder where ingests are stored on the Mac MAC_INGEST_FOLDER="$HOME/Pictures/Camera Ingest" # Where to ingest to on the Mac MAC_INGEST_PATH="$MAC_INGEST_FOLDER/$CURRENT_DATE" # Folder where ingests are stored on the NAS NAS_INGEST_FOLDER="/Camera Ingest" # Where to ingest to on the NAS NAS_INGEST_PATH="$NAS_INGEST_FOLDER/$CURRENT_DATE" ###################################################################################### # Functions ###################################################################################### # Create and open Mac folders. create_folders_mac() { # Check if the parent ingest directory doesn't exist if [[ ! -d "$MAC_INGEST_PATH" ]]; then echo "Creating ingest directories at $MAC_INGEST_PATH/{ARW,JPG,MP4}..." # Since the parent doesn't exist, we create it and all children at once mkdir -p "$MAC_INGEST_PATH"/{ARW,JPG,MP4} # $? is the exit status of the last commmand, with 0 being success if [[ $? -eq 0 ]]; then echo "Success!" else echo "Failed to create directories at $MAC_INGEST_PATH" exit 1 fi else # The parent directory exists, but do the children? echo "Parent ingest directory already exists. Checking for subdirectories..." # Iterate over each folder name for folder in ARW JPG MP4; do # If the subdir doesn't exist if [[ ! -d "$MAC_INGEST_PATH/$folder" ]]; then echo "Subdirectory $folder is missing, creating..." # Create the missing subdir mkdir -p "$MAC_INGEST_PATH/$folder" # $? is the exit status of the last commmand, with 0 being success if [[ $? -eq 0 ]]; then echo "Successfully created $MAC_INGEST_PATH/$folder" else echo "Failed to create $MAC_INGEST_PATH/$folder" exit 1 fi else echo "$MAC_INGEST_PATH/$folder already exists." fi done fi } # Create and open NAS folders. create_folders_nas() { # Check if the parent ingest directory doesn't exist if [[ ! -d "$NAS_MOUNT_POINT/$NAS_INGEST_PATH" ]]; then echo "Creating ingest directories at $NAS_INGEST_PATH/{ARW,JPG,MP4}..." # Since the parent doesn't exist, we create it and all children at once mkdir -p "$NAS_MOUNT_POINT/$NAS_INGEST_PATH"/{ARW,JPG,MP4} # $? is the exit status of the last commmand, with 0 being success if [[ $? -eq 0 ]]; then echo "Success!" else echo "Failed to create directories at $NAS_MOUNT_POINT/$NAS_INGEST_PATH" exit 1 fi else # The parent directory exists, but do the children? echo "Parent ingest directory already exists. Checking for subdirectories..." # Iterate over each folder name for folder in ARW JPG MP4; do # If the subdir doesn't exist if [[ ! -d "$NAS_MOUNT_POINT/$NAS_INGEST_PATH/$folder" ]]; then echo "Subdirectory $folder is missing, creating..." # Create the missing subdir mkdir -p "$NAS_MOUNT_POINT/$NAS_INGEST_PATH/$folder" # $? is the exit status of the last commmand, with 0 being success if [[ $? -eq 0 ]]; then echo "Successfully created $NAS_MOUNT_POINT/$NAS_INGEST_PATH/$folder" else echo "Failed to create $NAS_MOUNT_POINT/$NAS_INGEST_PATH/$folder" exit 1 fi fi done fi } # Cleanup images on camera SD. clean_sd() { # Check if the SD card is mounted if mount | grep -q "/Volumes/NO NAME"; then echo "SD Card Mounted at $SD_MOUNT_POINT." else echo "ERR: SD Card Not mounted!" exit 1 fi echo "Traversing to Camera..." cd "$SD_MOUNT_POINT$SD_SRC_PATH" || { echo "Failed to navigate to SD card path."; return 1; } echo "Current Directory: $(pwd)" echo "Are you sure you want to delete all JPG, ARW, and MP4 files in $SD_MOUNT_POINT$SD_SRC_PATH? (y/N)" read -r confirmation if [[ "$confirmation" =~ ^[Yy]$ ]]; then echo "Removing JPG files..." rm *.JPG echo "Removing ARW files..." rm *.ARW echo "Removing MP4 files..." rm *.MP4 echo "Cleanup completed!" else echo "Cleanup aborted." fi cd - || { echo "Failed to return to the previous directory."; return 1; } } # Camera->Mac Ingest ingest_mac() { # Check if the SD card is mounted if mount | grep -q "/Volumes/NO NAME"; then # Get the SD Card mount point, this is static though SD_MOUNT_POINT="/Volumes/NO NAME" echo "SD Card Mounted at $SD_MOUNT_POINT." else echo "ERR: SD Card Not mounted!" exit 1 fi create_folders_mac echo "Beginning copy..." # Copy JPG files jpg_files=("$SD_MOUNT_POINT/$SD_SRC_PATH/"*.JPG) if [[ -f "${jpg_files[0]}" ]]; then echo "Copying JPGs..." rsync -avzc --progress "$SD_MOUNT_POINT/$SD_SRC_PATH/"*.JPG "$MAC_INGEST_PATH/JPG/" else echo "No JPGs, skipping." fi # Copy ARW files arw_files=("$SD_MOUNT_POINT/$SD_SRC_PATH/"*.ARW) if [[ -f "${arw_files[0]}" ]]; then echo "Copying ARWs..." rsync -avzc --progress "$SD_MOUNT_POINT/$SD_SRC_PATH/"*.ARW "$MAC_INGEST_PATH/ARW/" else echo "No ARWs, skipping." fi # Copy MP4 files mp4_files=("$SD_MOUNT_POINT/$SD_SRC_PATH/"*.MP4) if [[ -f "${mp4_files[0]}" ]]; then echo "Copying MP4s..." rsync -avzc --progress "$SD_MOUNT_POINT/$SD_SRC_PATH/"*.MP4 "$MAC_INGEST_PATH/MP4/" else echo "No MP4s, skipping." fi echo "Ingest complete!" open "$MAC_INGEST_PATH" } # Mac->NAS Ingest ingest_nas() { # Check if the NAS is mounted if mount | grep -q "$NAS_ADDRESS"; then # Get the NAS mount point since it can vary NAS_MOUNT_POINT=$(mount | grep "$NAS_ADDRESS" | awk '{print $3}' | grep -E '^/Volumes/media(-1)?$') echo "NAS Mounted at $NAS_MOUNT_POINT." else echo "ERR: NAS Not mounted!" exit 1 fi create_folders_nas echo "Beginning copy..." echo "Syncing ingested images with NAS..." # Sync /Volumes/voidf1sh/Pictures/Camera Ingest/ with NAS/media/Camera Ingest/ rsync -azv --progress "$MAC_INGEST_FOLDER/" # Copy JPG files # jpg_files=("$MAC_INGEST_PATH/JPG/"*.JPG) # if [[ -f "${jpg_files[0]}" ]]; then # echo "Copying JPGs..." # rsync -avzc --progress "$MAC_INGEST_PATH/JPG/"*.JPG "$NAS_MOUNT_POINT/$NAS_INGEST_PATH/JPG/" # else # echo "No JPGs, skipping." # fi # # Copy ARW files # arw_files=("$MAC_INGEST_PATH/ARW/"*.ARW) # if [[ -f "${arw_files[0]}" ]]; then # echo "Copying ARWs..." # rsync -avzc --progress "$MAC_INGEST_PATH/ARW/"*.ARW "$NAS_MOUNT_POINT/$NAS_INGEST_PATH/ARW/" # else # echo "No ARWs, skipping." # fi # # Copy MP4 files # mp4_files=("$MAC_INGEST_PATH/MP4/"*.MP4) # if [[ -f "${mp4_files[0]}" ]]; then # echo "Copying MP4s..." # rsync -avzc --progress "$MAC_INGEST_PATH/MP4/"*.MP4 "$NAS_MOUNT_POINT/$NAS_INGEST_PATH/MP4/" # else # echo "No MP4s, skipping." # fi echo "Ingest complete!" open "$NAS_MOUNT_POINT/$NAS_INGEST_PATH" } ###################################################################################### # Prompt Loop ###################################################################################### # Bash allows for linebreaks in string literals and will # break lines accordingly in the shell while true; do echo "" echo "[ Camera Ingest Script ]" echo "" echo "Please enter an option from below:" echo "" echo "[1] Camera->Mac Ingest" echo "[2] Mac->NAS Ingest" echo "[3] Cleanup non-RAW images on camera." echo "" echo "[0] Exit" # Wait for input read -p "Option: " opt # Execute the correct commands based on input. case "$opt" in 1) # Camera->Mac Ingest clear ingest_mac ;; 2) # Mac->NAS Ingest clear ingest_nas ;; 3) # Cleanup non-RAW images on camera. clear # echo "Temporarily disabled!" clean_sd ;; 0) # Exit the script echo "!! Quitting !!" sleep 0.8s clear exit ;; *) clear echo "!! Invalid Option !!" ;; esac done