Wenn man viele Bilder zu verwalten hat, dann stellt dies meist nicht nur an die beteiligte Hardware – besonders der benötigte Platz kann dann schnell zu klein werden – hohe Anforderungen, sondern auch an die eingesetzten Softwaretools. Welche Tools dabei wie eingesetzt werden, hängt oftmals von den Bedürfnissen des Fotografen ab (wie viel Speicherplatz benötigt ein Bild meiner Kamera? In welchem Format fotografiert man?).
Oftmals will man dann die Bilder auch noch einfach zugänglich im Web zugänglich haben, was aber besonders bei der Fotographie mit RAW-Dateien ein nicht triviales Unterfangen darstellen kann. Kommt dann noch hinzu, dass man seine Bilder keinem Online-Dienst (Picasa, Flickr, Facebook, Dropbox, …) geben will, dann muss man sich schon nach passender Software umsehen.
Im Folgenden wird deshalb ein kleines Skript vorgestellt, welches genau diesen Anwendungsfall (wenn auch mit ein Einschränkungen) umsetzen soll.
Die Verwaltung von Bilddaten auf dem eigenen Server kann auf mehrere Arten erfolgen. Eine weit verbreitete und außerdem sehr praktische Speicherart ist aber das Abspeichern in Ordnern, welche nach Datum angeordnet sind. Oft gibt es dabei einen Ordner „Jahr“ mit Unterordnern der Art „Jahr-Monat-Tag“ und einer evtl. weiteren Beschreibung. Nun kann man natürlich eine solche Ordnerstruktur mit den typischen im Web verbreiteten Mitteln freigeben (FTP, SSH oder ähnliches), was aber den deutlichen Nachteil hat, dass wenn man mit RAW-Dateien arbeitet, die Bilder nur angezeigt werden können, wenn der Client-PC über die entsprechende Software verfügt.
Wäre es da nicht noch besser, wenn man im Web eine eigene Bildgalerie hat, die alle Bilder in einem einheitlichen Format (sinnvollerweise meist JPEG-Bilder) mit Vorschaubildern anbietet? Doch wie erstellt man möglichst einfach aus den vorhandenen Bildern diese JPEG-Bilder und wo speichert man sie dann so ab, dass die Bildgalerie darauf zugreifen kann? Wie geht man vor, wenn man neue Bilder erstellt hat – muss man sich dann jedes Mal die Arbeit machen und diese zu konvertieren und auf sie Galerie hochzuladen?
Gott sei Dank geht das alles auch automatisiert. Unter der Voraussetzung, dass die Bildgalerie per WebDAV zugänglich ist oder eine Synchronisation mit den Daten auf dem Dateisystem erlaubt, kann ein Shell-Skript erstellen, welches Bilder in den Speicherorten der RAW-Bilder sucht, und dann in die Bildgalerie stellt und falls notwendig auch noch eine Konvertierung der Daten vornimmt.
Hier muss man aber mit der Einschränkung leben, dass die Bilder, welche von dem Skript konvertiert werden, nicht von perfekter Qualität sein werden. Die RAW-Wandlung der beteiligten Tools ist nicht perfekt, das wird aber gerne in Kauf genommen, da der Vorgang automatisiert werden kann. Da die Ausgangsdaten nicht verändert werden und es sich außerdem nur um eine Webgalerie handelt (welche sowieso nie perfekte Qualität bieten könnte), ist dies aber vernachlässigbar.
Die Automatisierung erfolgt, wie schon oben erwähnt, per Shell-Skript. Dabei wird davon ausgegangen, dass die Dateien in einem Verzeichnis abgespeichert werden müssen und dann in der Galerie einsehbar sind. Das verringert die Auswahl an verfügbaren Softwarelösungen, trotzdem bietet die Automatisierung einen derart großen Komfort, dass man auch damit Leben kann.
Ich persönlich habe mich für die Webgalerie „Piwigo“ entschieden. Sie bietet zwar keinen Webdav-Support, kennt aber eine Synchronisation mit dem Dateisystem und fügt dabei neu gefundene Bilder unter Beibehaltung der Ordnerstruktur in Form von Alben ein (ebenso entfernt es gelöschte Bilder aus der Datenbank). Prinzipiell wären aber auch Lösungen wie Gallerie2 von Menalto umsetzbar (per WebDAV). Eigentlich sollte auch Gallerie3 von selbiger Firma machbar sein, jedoch ist dazu das WebDAV-Modul derzeit zu instabil.
Das folgende Shell-Skript kopiert die Bilder von einem Quellverzeichnis „SRC“ in den beteiligten Gallerien-Ordner von Piwigo („DST“) und kümmert sich dabei um eine evtl. notwendige Umwandlung von Nikon-RAW-Dateien nach JPEG (per Kommandozeilen-Tool „UFRaw“):
#! /bin/sh
SRC=${1-/media/Multimedia/Pictures}
DST=/media/Niko/www/html/piwigo/galleries
UFRAW_EXEC=/opt/ufraw/ufraw-batch
UFRAW_OPTS="--silent --compression=100 --lensfun=auto --embedded-image --out-type=jpeg"
replace_special_chars() {
STR=$1
STR=`echo $STR | sed -e "s/ //g"`
STR=`echo $STR | sed -e "s/\&/_/g"`
STR=`echo $STR | sed -e "s/[ÄÖÜäöüß]/_/g"`
STR=`echo $STR | sed -e "s/(/_/g"`
STR=`echo $STR | sed -e "s/)//g"`
echo $STR
}
if [ ! `whoami` = root ]; then
echo "Script can only be run as root or apache user... exiting"
exit 1
fi
if [ ! -d "$SRC" ]; then
echo "Directory \"$SRC\" not found"
exit 1
fi
cd "$SRC"
TMPIFS=$IFS
IFS=$'\n'
DIRS=($(find * -type d -print))
IFS=$TMPIFS
LEN=${#DIRS[@]}
echo "Processing "$LEN" directories"
for ((i = 0; i < $LEN; ++i)); do
CDIR=$(replace_special_chars ${DIRS[$i]})
echo "Processing \"$SRC/${DIRS[$i]}\""
if [ ! -d "$DST/$CDIR" ]; then
echo " creating directory"
mkdir -p "$DST/$CDIR"
fi
cd "$SRC/${DIRS[$i]}"
TMPIFS=$IFS
IFS=$'\n'
CP_FILES=($(find * -maxdepth 0 -regex ".*\.\(jpg\|jpeg\|JPG\|JPEG\|tif\|TIF\|tiff\|TIFF\|png\|PNG\|gif\|GIF\)" -print))
CNV_FILES=($(find * -maxdepth 0 -regex ".*\.\(nef\|NEF\)" -print))
IFS=$TMPIFS
CP_LEN=${#CP_FILES[@]}
CNV_LEN=${#CNV_FILES[@]}
if [ $CNV_LEN -le 0 -a $CP_LEN -le 0 ]; then
echo " no files to copy or convert"
fi
if [ $CNV_LEN -gt 0 ]; then
echo " converting "$CNV_LEN" raw file(s)"
for ((j = 0; j < $CNV_LEN; ++j)); do
OUTPUT_FILE=$(replace_special_chars ${CNV_FILES[$j]})
OUTPUT_FILE=`echo $OUTPUT_FILE | sed -e "s/\.nef/\.jpg/g"`
OUTPUT_FILE=`echo $OUTPUT_FILE | sed -e "s/\.NEF/\.jpg/g"`
$UFRAW_EXEC $UFRAW_OPTS --output="$DST/$CDIR/$OUTPUT_FILE" "${CNV_FILES[$j]}"
done
fi
if [ $CP_LEN -gt 0 ]; then
echo " copying "$CP_LEN" non-raw-file(s)"
for ((j = 0; j < $CP_LEN; ++j)); do
OUTPUT_FILE=$(replace_special_chars "${CP_FILES[$j]}")
cp -n -u -p "${CP_FILES[$j]}" "$DST/$CDIR/$OUTPUT_FILE" 2>/dev/null
done
fi
done
chown -R apache:apache "$DST"
exit 0
Genau genommen extrahiert UFRaw bei dieser Lösung nur die JPEG-Vorschaubilder aus den RAW-Dateien – ohne die RAW-Daten selbst zu interpretieren – die kann aber bei Bedarf leicht in den UFRAW_OPTS angepasst werden. Alle Bilder, die nicht konvertiert werden müssen, kopiert das Skript einfach in das Zielverzeichnis (welches erstellt wird, sofern es noch nicht existiert).
Eine eventuell notwendige Benutzerverwaltung, welche den Zugriff auf die Bilder in der Bildgalerie managed, erfolgt dann wieder direkt in der Galerie. Hinterlegt man hierfür aber Default-Werte, dann erspart man sich mit der Automatisierung sehr viel Arbeit. Führt man es beispielsweise per Cronjob jede Nacht aus, so speichert man seine Bilder nur mehr wie gewohnt in seine Verzeichnisstruktur am Server und am nächsten Tag hat man die Bilder dann im Web zur Verfügung – ganz automatisch ;-)
Eine verbesserte Version des Skripts gibt es in Teil 2