-
-
Save ljm42/02b54ce9cc36f992515b to your computer and use it in GitHub Desktop.
#!/bin/bash | |
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin | |
## Usage (after configuration): | |
## 1. Insert camera's memory card into a USB port on your unRAID system | |
## 2. The system will automatically move (or copy) any images/videos from the memory card to the array | |
## If jhead was installed, it will automatically rotate images according to the exif data | |
## 3. Wait for the imperial theme to play, then remove the memory card | |
## Preparation: | |
## 1. Install jhead (to automatically rotate photos) using the Nerd Pack plugin | |
## 2. Install the "Unassigned Devices" plugin | |
## 3. Use that plugin to set this script to run *in the background* when a memory card is inserted | |
## 4. Configure variables in this script as described below | |
## Warning: | |
## The newperms script has a bug in unRAID 6.1.3 - 6.1.7 | |
## see https://lime-technology.com/forum/index.php?topic=43388.0 | |
## --- BEGIN CONFIGURATION --- | |
## SET THIS FOR YOUR CAMERAS: | |
## array of directories under /DCIM/ that contain files you want to move (or copy) | |
## can contain regex | |
VALIDDIRS=("/DCIM/[0-9][0-9][0-9]___[0-9][0-9]" "/DCIM/[0-9][0-9][0-9]CANON" "/DCIM/[0-9][0-9][0-9]_FUJI" "/DCIM/[0-9][0-9][0-9]NIKON" \ | |
"/DCIM/[0-9][0-9][0-9]MSDCF" "/DCIM/[0-9][0-9][0-9]OLYMP" "/DCIM/[0-9][0-9][0-9]MEDIA" "/DCIM/[0-9][0-9][0-9]GOPRO" "/DCIM/[0-9][0-9][0-9]_PANA") | |
## SET THIS FOR YOUR SYSTEM: | |
## location to move files to. use date command to ensure unique dir | |
DESTINATION="/mnt/user/Photos/To Be Filed/incoming/$(date +"%Y-%m-%d-%H-%M-%S-%N")/" | |
## SET THIS FOR YOUR SYSTEM: | |
## change to "move" when you are confident everything is working | |
MOVE_OR_COPY="copy" | |
## set this to 1 and check the syslog for additional debugging info | |
DEBUG="" | |
## Available variables: | |
# AVAIL : available space | |
# USED : used space | |
# SIZE : partition size | |
# SERIAL : disk serial number | |
# ACTION : if mounting, ADD; if unmounting, REMOVE | |
# MOUNTPOINT : where the partition is mounted | |
# FSTYPE : partition filesystem | |
# LABEL : partition label | |
# DEVICE : partition device, e.g /dev/sda1 | |
# OWNER : "udev" if executed by UDEV, otherwise "user" | |
# PROG_NAME : program name of this script | |
# LOGFILE : log file for this script | |
log_all() { | |
log_local "$1" | |
logger "$PROG_NAME-$1" | |
} | |
log_local() { | |
echo "`date` $PROG_NAME-$1" | |
echo "`date` $PROG_NAME-$1" >> $LOGFILE | |
} | |
log_debug() { | |
if [ ${DEBUG} ] | |
then | |
log_local "$1" | |
fi | |
} | |
beep_imperial() { | |
for i in $(seq 1 ${1}); do | |
beep -f 392 -l 450 -r 3 -D 150 -n -f 311.13 -l 400 -D 50 \ | |
-n -f 466.16 -l 100 -D 50 -n -f 392 -l 500 -D 100 \ | |
-n -f 311.13 -l 400 -D 50 -n -f 466.16 -l 100 -D 50 \ | |
-n -f 392 -l 600 -D 600 -n -f 587.33 -l 450 -r 3 -D 150 \ | |
-n -f 622.25 -l 400 -D 50 -n -f 466.16 -l 100 -D 50 \ | |
-n -f 369.99 -l 500 -D 100 -n -f 311.13 -l 400 -D 50 \ | |
-n -f 466.16 -l 100 -D 50 -n -f 392 -l 500 -D 100 | |
sleep 2 | |
done | |
} | |
case $ACTION in | |
'ADD' ) | |
# | |
# Beep that the device is plugged in. | |
# | |
beep -l 200 -f 600 -n -l 200 -f 800 | |
sleep 2 | |
if [ -d ${MOUNTPOINT} ] | |
then | |
# only process an automount. manual mount is messy, users may or may not expect it to unmount afterwards | |
if [ "$OWNER" = "udev" ]; then | |
log_all "Started" | |
log_debug "Logging to $LOGFILE" | |
RSYNCFLAG="" | |
MOVEMSG="copying" | |
if [ ${MOVE_OR_COPY} == "move" ]; then | |
RSYNCFLAG=" --remove-source-files " | |
MOVEMSG="moving" | |
fi | |
# only operate on USB disks that contain a /DCIM directory, everything else will simply be mounted | |
if [ -d "${MOUNTPOINT}/DCIM" ]; then | |
log_debug "DCIM exists ${MOUNTPOINT}/DCIM" | |
# loop through all the subdirs in /DCIM looking for dirs defined in VALIDDIRS | |
for DIR in ${MOUNTPOINT}/DCIM/*; do | |
if [ -d "${DIR}" ]; then | |
log_debug "checking ${DIR}" | |
for element in "${VALIDDIRS[@]}"; do | |
if [[ ${DIR} =~ ${element} ]]; then | |
# process this dir | |
log_local "${MOVEMSG} ${DIR}/ to ${DESTINATION}" | |
rsync -a ${RSYNCFLAG} "${DIR}/" "${DESTINATION}" | |
# remove empty directory from memory card | |
if [ ${MOVE_OR_COPY} == "move" ]; then | |
rmdir ${DIR} | |
fi | |
fi | |
done | |
fi | |
done | |
# files were moved (or copied). rotate images, fix permissions | |
if [ -d "${DESTINATION}" ]; then | |
if [ -e "/usr/bin/jhead" -a -e "/usr/bin/jpegtran" ]; then | |
log_debug "running jhead on ${DESTINATION}" | |
jhead -autorot -ft "${DESTINATION}"*.[jJ][pP][gG] | |
fi | |
log_debug "fixing permissions on ${DESTINATION}" | |
newperms "${DESTINATION}" | |
fi | |
# sync and unmount USB drive | |
sync -f ${DESTINATION} | |
sync -f ${MOUNTPOINT} | |
sleep 1 | |
/usr/local/sbin/rc.unassigned umount $DEVICE | |
# send notification | |
beep_imperial 1 | |
/usr/local/emhttp/webGui/scripts/notify -e "unRAID Server Notice" -s "Photo Import" -d "Photo Import completed" -i "normal" | |
fi # end check for DCIM directory | |
else | |
log_all "Photo Import drive not processed, owner is $OWNER" | |
fi # end check for valid owner | |
else | |
log_all "Mountpoint doesn't exist ${MOUNTPOINT}" | |
fi # end check for valid mountpoint | |
;; | |
'REMOVE' ) | |
# | |
# Beep that the device is unmounted. | |
# | |
beep -l 200 -f 800 -n -l 200 -f 600 | |
log_all "Photo Import drive unmounted, can safely be removed" | |
;; | |
esac |
Oh maybe you mean you don't want to modify the list of VALIDDIRS. Well, the good news is that MOVE_OR_COPY is set to "copy" by default. You can try it out, and only switch it to "move" when you are confident the files are going to the right place.
@ljm42
Love your script been using it a while now. Just wanted to clarify a couple of things.
Should I be letting the script mount the SD card or should I have unassigned devices mounting the drive? Currently, I have it set to automount and the only issue I get then is that the user is "user" instead of "udev"
2. evenwebb was saying would it be possible to have folders for different cameras. A parent dir for canon, GoPro, etc. Personally, I haven't been able to come up with a way of doing that without messing things up. But I'm not the best with script work anyway.
3. Anyone that sees this comment and uses Panasonic cameras I got it to work with "/DCIM/[0-9][0-9][0-9]_PANA"
Thank you for the script! Importing pictures from my camera have never been this easy even with the weird permission issue that happens ever now and again.
You can ignore #2 you already addressed that it seems. Thanks!
mkdir -p "${DESTINATION}"
needs to be added before the rsync
line, otherwise the directory will not be created and nothing will be copied
mkdir -p "${DESTINATION}"
needs to be added before thersync
line, otherwise the directory will not be created and nothing will be copied
Ah, I could see how that would be needed if your DESTINATION directory was something was something like /incoming/year/month/ instead of /incoming/date/. rsync will create a single new directory but probably not two.
Is there any way to install jhead on unraid 7? Nerdpack and Nerdtools are both depreciated.
Hmm, I don't seem to get notified when someone comments here.
This script only has access to filenames, so it wouldn't have the camera details. As written, it creates a new folder based on the current date/time so you don't have to worry much about it stomping on your existing files.