diff --git a/nextcloud-photos-dir2album.sh b/nextcloud-photos-dir2album.sh new file mode 100755 index 0000000..65420d1 --- /dev/null +++ b/nextcloud-photos-dir2album.sh @@ -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) -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