#!/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) -s " echo " -s : 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