Script to create Nextcloud Photo App albums from a folder structure
This commit is contained in:
Executable
+210
@@ -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
|
||||||
Reference in New Issue
Block a user