diff --git a/.img_helpr b/.img_helpr new file mode 100644 index 0000000..bffa6a0 --- /dev/null +++ b/.img_helpr @@ -0,0 +1,9 @@ +#!/bin/bash +local_blog_path=''; # Wohin sollen die Bilder lokal gespeichert werden +w_blog_img=500; # Wieviele Pixel breit soll das Blogbild sein +w_img=1900; # Wieviele Pixel breit soll das verlinkte Bild maximal sein +h_img=1900; # Wieviele Pixel hoch soll das verlinkte Bild maximal sein +blog_address=''; # Webadresse und Bilder-Basis-Pfad des Blogs +blog_path=''; # wo auf dem Server liegen die Bilder +SSH_LOGIN=''; # ssh-Login beim Hoster +SSH_PASSWD=''; # Passwort diff --git a/img-helpr.sh b/img-helpr.sh new file mode 100755 index 0000000..a086d5e --- /dev/null +++ b/img-helpr.sh @@ -0,0 +1,292 @@ +#!/bin/bash + +## Dieses Script ist ein kleiner Offline-Helfer zum Vorbereiten der Bilder fürs Blog. +## Vom Bild wird eine angepasste Version für das Blog erzeugt, auf Wunsch auch ein großes. +## Zeitlich einsortiert wird es mit Hilfe der Exif-Daten. Ein Link zum Einfügen ins Blog +## wird in der Zwischenablage abgelegt. +## Author swg, knapp80ps.de, November 2013 +## letzte Änderungen +## - Juni 2021, Version 1.06, Progress bar eingebaut +## - Januar 2021, Version 1.05, Test auf fehlende Software geändert. +## - Oktober 2019, Version 1.03, Das extrahieren des Vorschaubildes aus Exif war in Version 1.02 verloren gegangen -> ist wieder drin +## - Oktober 2018, Version 1.02, Exifdaten werden erhalten und zusätzlich OriginalFileName gesetzt +## - November 2017, Version 1.01, Vorschaubild wird aus Exif geholt, wenn vorhanden +## MODIFY AND SHARE AS YOU LIKE! + +function CleanUp() +{ +if [ -f "$local_blog_path/preview.jpg" ]; then + rm "$local_blog_path/preview.jpg"; +fi +unset FILE; +unset FILELIST; +unset EXIFORIGINALLIST; +unset EXIFDATETIMELIST; +kill $ZenityPID; +exec 3>&- +exec 4>&- +} + +function which_is() { +EXECUTABLE=$1; +WITHFULLPATH=$(which ${EXECUTABLE} 2>/dev/null); +if [ -x ${WITHFULLPATH} ]; +then + echo ${WITHFULLPATH}; +else + echo "${EXECUTABLE} not found! abort." + exit 1; +fi +} + +# Was wir am Anfang brauchen +PATH=$PATH:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/global/bin:/global-common/scripts:/usr/sfw/bin:/opt/sfw/bin:/usr/ccs/bin:/usr/xpg4/bin:/opt/SUNWspro/bin:/usr/dt/bin:/usr/openwin/bin:/usr/ucb:/opt/bin + + +## Prüfen der notwendigen Software auf Existenz und Ausführbarkeit +# zenity +MSGDIALOG=$(which_is "zenity"); + +# imagemagick +CONVERT=$(which_is "convert"); + +IMGDISPLAY=$(which_is "display"); + +# date +DATE=$(which_is "date"); + +# exiftool +EXIFTOOL=$(which_is "exiftool"); + +# xclip +XCLIP=$(which_is "xclip"); + +# printf +PRINTF=$(which_is "printf"); + +# sed +SED=$(which_is "sed"); + +SCRIPTNAME=$(echo $0 | sed -e 's/.*\///g'); +VERSION="1.05"; +VERS=1.05; +ME=$(whoami); +TMPPFAD=/tmp; +MYHOME=$(echo ~); +USTRICH="_"; + +exec 3> >($MSGDIALOG --notification --listen); +# The PID of zenity is needed to kill the process at the end of the script +ZenityPID=$!; +#((ZenityPID=ZenityPID+1)) # this is a workaround as I don't know how to get the PID of zenity (but get the one of exec) +echo "tooltip:Scrip ${SCRIPTNAME}, Version ${VERSION}" >&3 + +if [ ! $# -gt 0 ]; then + echo "img-helpr, Version: $VERSION, June 2021" + echo "Syntax: img-helpr.sh IMG_FILE1 [IMG_FILE2 ...]"; + echo "MODIFY AND SHARE AS YOU LIKE!" + exit; +fi; + +## Nutzerdaten +USERDATAFILE=$MYHOME/.img_helpr; + +if [[ -f $USERDATAFILE ]]; then + source $USERDATAFILE; +else + printf "#!/bin/bash\nlocal_blog_path='%s/Blog/'; # Wohin sollen die Bilder lokal gespeichert werden\nw_blog_img=450; # Wieviele Pixel breit soll das Blogbild sein\nw_img=1200; # Wieviele Pixel breit soll das verlinkte Bild maximal sein\nh_img=900; # Wieviele Pixel hoch soll das verlinkte Bild maximal sein\nblog_address='http://www.example.com/wp-content'; # Webadresse des Blogs\nblog_path='./wp-content'; # wo im Blog liegen die Bilder\nSSH_LOGIN='' # ssh-Login beim Hoster\nSSH_PASSWD=''" $MYHOME > $USERDATAFILE; + chmod 750 $USERDATAFILE; + source $USERDATAFILE; +fi + +if [ ! -d "$local_blog_path" ]; then + echo "Lokaler Speicherpfad ($local_blog_path) für die Bilder existiert nicht!"; + exit 1; +fi + +## Aus den übergebenen Argumenten die Dateien rausklauben +## Leerzeichen behandeln: +ARGS="$*"; +INP_C=0; +INP_TEMP=""; +for INP in $ARGS +do + #echo "INP ist: $INP"; + INP_TEMP="$INP_TEMP$INP"; + if [ -f "$INP_TEMP" ]; then + FILE[$INP_C]="$INP_TEMP"; #echo "Arrayinhalt an der Stelle $INP_C: ${FILE[$INP_C]}"; + ((INP_C=INP_C+1)); + INP_TEMP=""; + else + echo "Fehler: $?" + INP_TEMP="$INP_TEMP "; + fi +done + +## Schleife für Bildumwandlung: Pfad erzeugen +declare -A FILELIST; # Associative Array for BASH: http://www.artificialworlds.net/blog/2012/10/17/bash-associative-array-examples/ +declare -A EXIFORIGINALLIST; # nimmt die Original-Dateinamen auf +declare -A EXIFDATETIMELIST; # nimmt das Aufnahmedatum + Uhrzeit des Originals auf +MAX_INP_C=$INP_C; +for((INP_C=0;INP_C<${#FILE[*]};INP_C++)); +do + #echo "Bearbeite: ${FILE[$INP_C]}"; + # Mögliches Vorschaubild aus exif holen + $EXIFTOOL -b -W "$local_blog_path/preview.jpg" -preview:PreviewImage "${FILE[$INP_C]}"; + if [ -f "$local_blog_path/preview.jpg" ]; then # Wenn exifvorschau existierte: Anzeigen + origOrient=$($EXIFTOOL -s -s -s -n -Orientation "${FILE[$INP_C]}"); + $EXIFTOOL -n -Orientation=$origOrient "$local_blog_path/preview.jpg"; + $IMGDISPLAY -auto-orient -resize 400x400 "$local_blog_path/preview.jpg" & + else # Es existierte keine exif-Vorschau + $IMGDISPLAY -auto-orient -resize 400x400 "${FILE[$INP_C]}" & + fi + IMGDISPLAYPID=$!; + + ## Datum aus den Exifdaten des Bildes ermitteln, um die Bilder in der passenden Struktur zu speichern + OUT_PATH_Y=$($EXIFTOOL -DateTimeOriginal -d %Y -S "${FILE[$INP_C]}" | $SED -e 's/DateTimeOriginal:\ //'); + OUT_PATH_M=$($EXIFTOOL -DateTimeOriginal -d %m -S "${FILE[$INP_C]}" | $SED -e 's/DateTimeOriginal:\ //'); + OUT_DAY=$($EXIFTOOL -DateTimeOriginal -d %d -S "${FILE[$INP_C]}" | $SED -e 's/DateTimeOriginal:\ //'); + DATETIMEORIGINAL=$($EXIFTOOL -DateTimeOriginal -S "${FILE[$INP_C]}" | $SED -e 's/DateTimeOriginal:\ //'); + ## Datum alternativ von heute nehmen + if [[ -z "${OUT_PATH_Y##?([-+])+([0-9])}" ]] || [[ -z "${OUT_PATH_M##?([-+])+([0-9])}" ]] || [[ -z "${OUT_DAY##?([-+])+([0-9])}" ]]; then + echo "Kein Datum in Exif gefunden (Jahr=$OUT_PATH_Y, Monat=$OUT_PATH_M, Tag=$OUT_DAY)"; + OUT_PATH_Y=$(date +%Y); + OUT_PATH_M=$(date +%m); + OUT_DAY=$(date +%d); + fi + + ## Lokalen Speicherpfad erzeugen + if [ ! -d "$local_blog_path/${OUT_PATH_Y}/${OUT_PATH_M}" ]; then + mkdir -p "$local_blog_path/${OUT_PATH_Y}/${OUT_PATH_M}"; + if [ ! $? == 0 ]; then + echo "tooltip:Konnte lokalen Speicherpfad $local_blog_path/${OUT_PATH_Y}/${OUT_PATH_M} für Bilder nicht erzeugen!" >&3 + kill $IMGDISPLAYPID; + CleanUp; + exit 1; + fi + fi + + ## Dateinamen erfragen + FILENAME=""; + while [ -z "${FILENAME}" ] + do + FILENAME=$($MSGDIALOG --entry --title "Dateiname" --text "Welchen Dateinamen soll das Bild bekommen?" --entry-text="$OUT_DAY$USTRICH" 2> /dev/null); + if [ "$?" = "1" ]; then # Es wurde Abbruch geklickt, Script endet: + kill $IMGDISPLAYPID; + CleanUp; + exit 1; + fi + done + OUTFILE="${local_blog_path}/${OUT_PATH_Y}/${OUT_PATH_M}/${FILENAME}.jpg"; + OUTFILE_="${local_blog_path}/${OUT_PATH_Y}/${OUT_PATH_M}/${FILENAME}_.jpg"; + + ## Muss das Bild gedreht werden? + case $($MSGDIALOG --list --title "Bild drehen" --text "Richtung" --radiolist --hide-header --column "eins" --column "zwei" FALSE links TRUE 0 FALSE rechts FALSE 180 2> /dev/null) in + links) ROTATE="-90";; + 0) ROTATE="0";; + rechts) ROTATE="90";; + 180) ROTATE="180";; + *) kill $IMGDISPLAYPID; # Es wurde Abbruch geklickt, Script endet: + CleanUp; + exit 1;; + esac + + ## Soll ein großes Bild erzeugt werden? + $MSGDIALOG --question --title "Großes Bild" --text "Soll ein großes Bild erzeugt werden?" 2> /dev/null; + + if [ "$?" == "0" ]; then ## Großes Bild erzeugen + $PRINTF "\"\"" ${blog_address} ${OUT_PATH_Y} ${OUT_PATH_M} ${FILENAME} ${blog_address} ${OUT_PATH_Y} ${OUT_PATH_M} ${FILENAME} | $XCLIP; # Linkadresse in die Zwischenablage legen + $CONVERT "${FILE[$INP_C]}" -auto-orient -rotate $ROTATE -resize "${w_blog_img}x${h_blog_img}" -quality 95 -unsharp 1.5x1.0+1.5+0.02 "${OUTFILE_}" & + CONVERTPID=$!; + FILELIST+=( ["${CONVERTPID}"]=${OUTFILE_} ); # Process IDs der Convertierprozesse sammeln + EXIFORIGINALLIST+=( ["${CONVERTPID}"]=${FILE[$INP_C]} ); # Original-Dateiname + EXIFDATETIMELIST+=( ["${CONVERTPID}"]=$DATETIMEORIGINAL ); # Datum und Zeit des Originals speichern + $CONVERT "${FILE[$INP_C]}" -auto-orient -rotate $ROTATE -resize "${w_img}x${h_img}" -quality 95 -unsharp 1.5x1.0+1.5+0.02 "${OUTFILE}" & + CONVERTPID=$!; + FILELIST+=( ["${CONVERTPID}"]=${OUTFILE} ); # Process IDs der Convertierprozesse sammeln + EXIFORIGINALLIST+=( ["${CONVERTPID}"]=${FILE[$INP_C]} ); # Original-Dateiname + EXIFDATETIMELIST+=( ["${CONVERTPID}"]=$DATETIMEORIGINAL ); # Datum und Zeit des Originals speichern + else ## Nur kleines Bild erzeugen + $PRINTF "\"\"" ${blog_address} ${OUT_PATH_Y} ${OUT_PATH_M} ${FILENAME} | $XCLIP; # Linkadresse in die Zwischenablage legen + $CONVERT "${FILE[$INP_C]}" -auto-orient -rotate $ROTATE -resize "${w_blog_img}x${h_img}" -quality 95 -unsharp 1.5x1.0+1.5+0.02 "${OUTFILE}" & + CONVERTPID=$!; + FILELIST+=( ["${CONVERTPID}"]=${OUTFILE} ); # Process IDs der Convertierprozesse mit dem zugehörigen Dateinamen sammeln + EXIFORIGINALLIST+=( ["${CONVERTPID}"]=${FILE[$INP_C]} ); # Original-Dateiname + EXIFDATETIMELIST+=( ["${CONVERTPID}"]=$DATETIMEORIGINAL ); # Datum und Zeit des Originals speichern + fi + kill $IMGDISPLAYPID; # Bildanzeige der Vorschau beenden + if [ -f "$local_blog_path/preview.jpg" ]; then + rm "$local_blog_path/preview.jpg"; + fi +done + +# Progress bar +FILECOUNT=${#FILELIST[*]}; +exec 4> >(${MSGDIALOG} --progress --title="${SCRIPTNAME} ($FILECOUNT files)" --percentage=0 --auto-close --width=400) +PROGRESS=0; +## Wenn keine Logindaten hinterlegt sind, muss das Script nur noch die exif-Daten schreiben +if [ -z "${SSH_LOGIN}" ]; then + #echo "nur exif setzen"; + while [ ${#FILELIST[@]} -gt 0 ] # solange noch CONVERTPIDs vorhanden sind + do + for CPID in "${!FILELIST[@]}"; + do + if [ -n "${CPID}" -a -d "/proc/${CPID}" ]; then + # Prozess läuft noch, hochladen noch nicht möglich + sleep 2; + else + # Konvertierung beendet, kann exif schreiben + echo "# Setting exif ${FILELIST[${CPID}]}" >&4 + ((PROGRESS++)) + echo $(( ($PROGRESS*100/$MAX_INP_C)-1 )) >&4 + $EXIFTOOL -overwrite_original -DateTimeOriginal="${EXIFDATETIMELIST[${CPID}]}" ${FILELIST[${CPID}]}; + $EXIFTOOL -overwrite_original -OriginalFileName="${EXIFORIGINALLIST[${CPID}]##*/}" ${FILELIST[${CPID}]}; + #echo "tooltip:Argumente: ${EXIFORIGINALLIST[${CPID}]##*/}" >&3 # DEBUG! + unset FILELIST["${CPID}"]; + unset EXIFDATETIMELIST["${CPID}"]; + unset EXIFORIGINALLIST["${CPID}"]; + fi + done + done + echo "100" >&4 # trigger auto-close of progressbar + CleanUp; + exec 4>&- + exit 0; +fi + +## Hochladen der Bilder aufs Blog +while [ ${#FILELIST[@]} -gt 0 ] # solange noch CONVERTPIDs vorhanden sind +do + #echo "Länge Liste: ${#FILELIST[@]}"; + for CPID in "${!FILELIST[@]}"; + do + if [ -n "${CPID}" -a -d "/proc/${CPID}" ]; then + # Prozess läuft noch, hochladen noch nicht möglich + sleep 2; + else + #echo "Konvertierung beendet, kann exif und hochladen"; + echo "# Setting exif ${FILELIST[${CPID}]}" >&4 + ((PROGRESS++)) + echo $(( ($PROGRESS*25/$MAX_INP_C)-1 )) >&4 + $EXIFTOOL -overwrite_original -DateTimeOriginal="${EXIFDATETIMELIST[${CPID}]}" ${FILELIST[${CPID}]}; + $EXIFTOOL -overwrite_original -OriginalFileName="${EXIFORIGINALLIST[${CPID}]##*/}" ${FILELIST[${CPID}]}; + # Bild für den Upload mit cat ausgeben, Passwort an ssh geben, wenn Zielverzeichnis nicht existiert: erzeugen, auf Remote-Host Bild mit cat in Zieldatei schreiben. ( Dieses Konstrukt ${FILELIST[${CPID}]##*/} extrahiert den Dateinamen aus dem Pfad ) + echo "# Uploading ${FILELIST[${CPID}]}" >&4 + ((PROGRESS++)) + echo $(( ($PROGRESS*25/$MAX_INP_C)-1 )) >&4 + cat ${FILELIST[${CPID}]} | sshpass -p $SSH_PASSWD ssh ${SSH_LOGIN} "mkdir -p $blog_path/${OUT_PATH_Y}/${OUT_PATH_M}/;cat > $blog_path/${OUT_PATH_Y}/${OUT_PATH_M}/${FILELIST[${CPID}]##*/}" & + #scp ${FILELIST[${CPID}]} ${SSH_LOGIN}:$blog_path/${OUT_PATH_Y}/${OUT_PATH_M}/${FILELIST[${CPID}]##*/} & + unset EXIFDATETIMELIST["${CPID}"]; + unset EXIFORIGINALLIST["${CPID}"]; + unset FILELIST["${CPID}"]; + fi + done +done + +sleep 5; +echo "100" >&4 # trigger auto-close of progressbar +CleanUp; +exec 4>&- +exit 0; + +# EOF