Script to create Nextcloud Photo App albums from a folder structure

This commit is contained in:
2023-05-11 15:40:56 +02:00
parent 7ffb0a7505
commit ef033f613d
+210
View File
@@ -0,0 +1,210 @@
#!/bin/bash
# export PGPASSWORD=$CLOUDDB_POSTGRES_PASSWORD
#psql -h 10.12.15.2 -U nextcloud <<< "select * from photos_albums;"
#realpath --relative-base=/zp1/data/nextcloud/ Mediafix_\ 0001.jpg
NEXTCLOUD_DATADIR=/zp1/data/nextcloud
NEXTCLOUD_USER=mschoengens
NEXTCLOUD_ALBUM_COLLABS=(
skapitza
)
NEXTCLOUD_DB=10.12.15.2
NEXTCLOUD_DB_USER=nextcloud
FLAG_DRYRUN=1
FLAG_SOURCE=
function query () {
sql="$1"
output=$(psql -h ${NEXTCLOUD_DB} -U ${NEXTCLOUD_DB_USER} -t <<< ${sql})
echo "${output}"
}
function _print_help() {
echo "Create Nextcloud photo apps albums from folders"
echo ""
echo "Usage: $(basename $0) <options> -s <source-dir>"
echo " -s <source-dir> : source folder"
echo " -d : no dry run"
}
function _get_fileids () {
dir=$1
local -n result=$2
plist=()
IFS=$'\n'
for f in $(find $dir -type f); do
ff=$(realpath --relative-base="${NEXTCLOUD_DATADIR}/${NEXTCLOUD_USER}" "${f}")
plist+=("'${ff}', ")
done
last=${plist[-1]}
last=${last:0:-2}
unset 'plist[${#plist[@]}-1]'
plist+=("${last}")
sql="select fileid from filecache where path in (${plist[@]});"
if [ $FLAG_DRYRUN -eq 0 ]; then
fids=$(query "${sql}")
fi
result=()
for fid in "${fids}"; do
cfid=${fid// /}
result+=(${cfid})
done
}
function _get_album_name () {
dir=$1
dir_base=$(basename $(readlink -f $dir))
pdir_base=$(basename $(dirname $(readlink -f $dir)))
album_year=
album_month=
album_name=
if [[ ${dir_base} =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2} ]]; then
album_year=${dir_base:0:4}
album_month=${dir_base:5:2}
album_name=${dir_base:10}
elif [[ ${dir_base} =~ ^[0-9]{4}-[0-9]{2} ]]; then
album_year=${dir_base:0:4}
album_month=${dir_base:5:2}
album_name=${dir_base:7}
elif [[ ${dir_base} =~ ^[0-9]{8} ]]; then
album_year=${dir_base:0:4}
album_month=${dir_base:4:2}
album_name=${dir_base:8}
elif [[ ${dir_base} =~ ^[0-9]{4} ]]; then
album_year=${dir_base:0:4}
album_name=${dir_base:5}
elif [[ ${pdir_base} =~ ^[0-9]{4}-[0-9]{2} ]]; then
album_year=${pdir_base:0:4}
album_month=${pdir_base:5:2}
album_name="${pdir_base:7} - ${dir_base}"
fi
if [ -z "${album_year}" ] || [ -z "${album_name}" ]; then
return
fi
# clean album name
album_name=$(sed -r 's/^[ -_]//' <<< ${album_name}) # rstrip name
album_name=${album_name//_/ }
album_name=$(sed -r 's/\<./\U&/g' <<< ${album_name}) # upper case words
album_name=$(sed -r 's/-/ - /g' <<< ${album_name}) # introduce spaces around -
album_name=$(sed -r 's/[ ]{2,}/ /g' <<< ${album_name}) # remove too many spaces
#album_name_full="${album_name} ${album_year}"
if [ -z ${album_month} ]; then
album_name_full="${album_year} - ${album_name}"
else
album_name_full="${album_year} ${album_month} - ${album_name}"
fi
echo $album_name_full
}
function create_empty_album () {
name=$1
user=$2
time=$(date +%s)
sql="insert into photos_albums values (DEFAULT, '${name}', '${user}', ${time}, '', -1);"
if [ $FLAG_DRYRUN -eq 0 ]; then
output=$(query "${sql}")
fi
sql="select last_value from photos_albums_album_id_seq;"
if [ $FLAG_DRYRUN -eq 0 ]; then
album_id=$(query "${sql}")
fi
echo $album_id
}
function add_files_to_album () {
album_id=$1
fileids=$2
time=$(date +%s)
sql_prefix="insert into photos_albums_files values "
sql_infix=""
for fid in ${fileids[@]}; do
sql_infix+="(DEFAULT, '${album_id}', '${fid}', ${time}, '${NEXTCLOUD_USER}'), "
done
sql="${sql_prefix}"
sql+="${sql_infix}"
sql="${sql:0:-2};"
if [ $FLAG_DRYRUN -eq 0 ]; then
output=$(query "${sql}")
fi
}
function update_album_thumb () {
album_id=$1
fileid=$2
sql="update photos_albums set last_added_photo = ${fileid} where album_id = ${album_id};"
if [ $FLAG_DRYRUN -eq 0 ]; then
output=$(query "${sql}")
fi
}
function share_album () {
album_id=$1
for cid in ${NEXTCLOUD_ALBUM_COLLABS[@]}; do
sql="insert into photos_albums_collabs values (DEFAULT, ${album_id}, '${cid}', 0);"
output=$(query "${sql}")
done
}
function import_album () {
dir=$1
album=$2
fileids=()
_get_fileids $dir fileids
album_id=$(create_empty_album "${album}" "${NEXTCLOUD_USER}")
add_files_to_album "${album_id}" ${fileids[@]}
update_album_thumb "${album_id}" ${fileids[-1]}
share_album "${album_id}"
}
# process input flags
while true; do
case $1 in
-d)
FLAG_DRYRUN=0
shift;
;;
-h)
_print_help
exit 0
;;
-s)
shift
FLAG_SOURCE=$1
shift
;;
*)
break
;;
esac
done
# make sure input is correct
if [ -z $FLAG_SOURCE ]; then
echo "You need to specify a source directory"
exit 1
fi
if [ -z $PGPASSWORD ]; then
echo "Please expose postgres password as PGPASSWORD"
exit 1
fi
for dir in $(find ${FLAG_SOURCE} -type d ! -empty -links 2); do
album=$(_get_album_name "${dir}")
if [ -z "${album}" ]; then
echo "Skipping ${dir}."
else
echo "Creating album '${album}' for ${dir} ..."
if [ $FLAG_DRYRUN -eq 0 ]; then
import_album $dir "${album}"
fi
fi
done