293 lines
12 KiB
Bash
Executable File
293 lines
12 KiB
Bash
Executable File
#!/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 "<a href=\"%s/%s/%s/%s.jpg\" data-fancybox=\"\" data-caption=\"\"><img src=\"%s/%s/%s/%s_.jpg\" class=\"aligncenter\" alt=\"\"></a>" ${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 "<img src=\"%s/%s/%s/%s.jpg\" class=\"aligncenter\" alt=\"\">" ${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
|