bundlewrap/bundles/nextcloud-picsort/files/nextcloud-picsort
2026-03-07 11:37:49 +01:00

110 lines
No EOL
3 KiB
Bash

#!/bin/bash
set -euo pipefail
if [[ $# -ne 4 ]]; then
echo "Usage: $0 <nc_user> <source_subdir> <dest_subdir> <unsortable_subdir>" >&2
exit 1
fi
NC_USER="$1"
SOURCE_SUBDIR="$2"
DEST_SUBDIR="$3"
UNSORTABLE_SUBDIR="$4"
REL_SOURCE_PATH="/$NC_USER/files/$SOURCE_SUBDIR"
ABS_SOURCE_PATH="/var/lib/nextcloud/$NC_USER/files/$SOURCE_SUBDIR"
REL_DEST_PATH="/$NC_USER/files/$DEST_SUBDIR"
ABS_DEST_PATH="/var/lib/nextcloud/$NC_USER/files/$DEST_SUBDIR"
REL_UNSORTABLE_PATH="/$NC_USER/files/$UNSORTABLE_SUBDIR"
ABS_UNSORTABLE_PATH="/var/lib/nextcloud/$NC_USER/files/$UNSORTABLE_SUBDIR"
echo "STARTING..."
chown -R www-data:www-data "$ABS_SOURCE_PATH"
chmod -R 770 "$ABS_SOURCE_PATH"
process_file() {
local f="$1"
local DATETIME DATE TIME YEAR MONTH DAY HOUR MINUTE SECOND HASH EXT RAW FILE RELPATH DIRNAME
echo "PROCESSING: $f"
DATETIME="$(
exiftool -s -s -s -CreateDate "$f" 2>/dev/null | head -n1
)"
if [[ -z "$DATETIME" ]]; then
DATETIME="$(
exiftool -s -s -s -FileModifyDate "$f" 2>/dev/null | head -n1 | cut -d'+' -f1 | cut -d'-' -f1
)"
fi
if [[ -z "$DATETIME" ]]; then
RELPATH="$(realpath --relative-to="$ABS_SOURCE_PATH" "$f")"
DIRNAME="$(dirname "$ABS_UNSORTABLE_PATH/$RELPATH")"
echo "UNSORTABLE: $f"
mkdir -p "$DIRNAME"
mv -n -- "$f" "$DIRNAME/"
return 0
fi
DATE="$(cut -d' ' -f1 <<< "$DATETIME")"
TIME="$(cut -d' ' -f2 <<< "$DATETIME" | cut -d'+' -f1)"
YEAR="$(cut -d':' -f1 <<< "$DATE")"
MONTH="$(cut -d':' -f2 <<< "$DATE")"
DAY="$(cut -d':' -f3 <<< "$DATE")"
HOUR="$(cut -d':' -f1 <<< "$TIME")"
MINUTE="$(cut -d':' -f2 <<< "$TIME")"
SECOND="$(cut -d':' -f3 <<< "$TIME")"
HASH="$(sha256sum "$f" | awk '{print $1}' | xxd -r -p | base64 | head -c 6 | tr '/+' '_-')"
EXT="$(tr '[:upper:]' '[:lower:]' <<< "${f##*.}")"
if [[ "$EXT" == "cr2" || "$EXT" == "cr3" ]]; then
RAW="raw/"
else
RAW=""
fi
FILE="$ABS_DEST_PATH/$YEAR-$MONTH/${RAW}${YEAR}${MONTH}${DAY}-${HOUR}${MINUTE}${SECOND}_${HASH}.${EXT}"
echo "DESTINATION: $FILE"
mkdir -p "$(dirname "$FILE")"
mv -- "$f" "$FILE"
}
mapfile -d '' -t FILES < <(
find "$ABS_SOURCE_PATH" -type f \( \
-iname '*.PNG' -o \
-iname '*.JPG' -o \
-iname '*.JPEG' -o \
-iname '*.HEIC' -o \
-iname '*.CR2' -o \
-iname '*.CR3' -o \
-iname '*.MP4' -o \
-iname '*.MOV' \
\) -print0
)
if ((${#FILES[@]})); then
export -f process_file
export ABS_SOURCE_PATH ABS_DEST_PATH ABS_UNSORTABLE_PATH
printf '%s\0' "${FILES[@]}" |
xargs -0 -n1 -P"$(nproc)" bash -c 'process_file "$1"' _
echo "SCANNING..."
chown -R www-data:www-data "$ABS_DEST_PATH"
chown -R www-data:www-data "$ABS_UNSORTABLE_PATH"
chmod -R 770 "$ABS_DEST_PATH"
chmod -R 770 "$ABS_UNSORTABLE_PATH"
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_SOURCE_PATH"
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_UNSORTABLE_PATH"
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_DEST_PATH"
else
echo "NO MATCHING FILES FOUND."
fi
echo "FINISH."