Servicemenü für den KDE Dateimanager Dolphin individuell erweitern (Teil 3)

Im folgenden Artikel beschreibe ich wie man mit Hilfe der Servicemenüs, im KDE Dateimanager Dolphin, mit ein paar Mausklicks den Datei-Zeitstempel eines oder mehrerer Fotos (JPEG) wieder auf das Datum der Aufnahme setzen kann. Das kann u.U. nicht identisch sein, z.B. wenn man ein Foto nachträglich bearbeitet hat oder irgendeiner Modifikation unterzogen hat die das erneute Speichern der Datei zur Folge hatte.

Die Metadaten (EXIF) eines JPEG kann man im Dateimanager Dolpin mit einem Rechtsklick auf die Datei, im Kontextmenü unter dem Menüpunkt Eigenschaften, im Reiter Details einsehen.


Kontextmenü Eigenschaften eines JPEG

Alternativ über einen selbst erstellten Servicemenü-Eintrag, zur Anzeige der EXIF-Tags wie hier Blog von mir beschrieben.


Kontextmenü EXIF Daten anzeigen

Um nun einen zusätzlichen Menüpunkt im Kontextmenü im Dateimanager Dolphin aufzunehmen muss man zwei Dateien erstellen, eine sogenannte *.desktop Datei im Verzeichnis /usr/share/kservices5/ServiceMenus/ und ein kurzes Shellscript das die eigentliche Arbeit bewerkstelligt. Als Dateinamen wählen wir für die erste Configdatei setexiftime.desktop.

Listing setexiftime.desktop

[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=image/jpeg
Actions=setexiftime
Encoding=UTF-8 
X-KDE-Priority=TopLevel

[Desktop Action setexiftime]
Icon=view-list-symbolic
Name=Foto-Zeitstempel als Datei-Zeitstempel setzen
Exec=/usr/local/scripts/run_set_exiftime.sh %U

Die Datei setexiftime.desktop ist für die Anzeige eines Menüunterpunktes “Foto-Zeitstempel als Datei-Zeitstempel setzen” (Feld Name) im Kontextmenü einer JPEG Datei zuständig. Das eigentliche Doing übernimmt ein noch zu erstellendes Shellscript run_set_exiftime.sh das im Feld Exec angegeben wird (Verzeichnispfad bitte den eigenen Gegebenheiten anpassen).

Das Shellscript nutzt das Kommandozeilentool jhead und kdialog (Anzeige von grafischen Dialogboxen im KDE in Shellscripten). Gegebenenfalls sind diese Programme zu installeren, wenn nicht vorhanden auf dem eigenen Desktop.

Das Shellscript bearbeitet alle mit der Maus markierten JPEG Dateien in einer Schleife und testet ob ein “Date/Time” Feld im EXIF-Header existiert. Wenn nein, wird ein minimaler EXIF-Header erzeugt, der u.a. die Felder “File date” (Datum und Zeit der Datei) und “Date/Time” (Datum und Zeit der Aufnahme des Fotos) enthält. Sollte ein erweiteter EXIF-Header bereits vorhanden sein wird mit dem Kommandozeilentool jhead das Feld “Date/Time” aus dem EXIF-Header ausgelesen und mit dem Systemkommando touch der Zeitstempel der Datei auf den identischen Wert gesetzt.

Sollte sich unter den markierten Dateien ein oder mehrere File(s) befinden das nicht vom MIME-Typ JPEG ist wird der Eintrag im Kontextmenü erst gar nicht angezeigt, da diese Aktion nur bei diesen Dateityp möglich und sinnvoll ist.

Zum Abschluß erscheint noch eine Dialogbox, die die Anzahl der verarbeiteten Dateien und den Speicherort des Logfiles anzeigt.

Listing run_set_exiftime.sh

#!/bin/bash
#
NULLDATUM="Date/Time"
TMP_FILE=/tmp/run_set_exiftime.tmp
COUNTER=0
 
# altes Logfile löschen
if [ -e "$TMP_FILE" ]
    then
    rm $TMP_FILE
fi

# alle markierten Dateien vom MIME-Typ jpeg verarbeiten
for BILD in "$@"
    do
    # teste ob "Date/Time" im EXIF-Header existiert
    RC=`jhead "$BILD" | egrep "$NULLDATUM" | wc -l`

    # Date/Time Feld existiert nicht 
    if [ $RC -eq 0 ]
        then
        # setze minimalen EXIF Header mit "File date" und "Date/Time" Feld
        echo "$BILD:  erzeuge minimalen EXIF Header mit >File date< und >Date/Time< Feld" 1>> $TMP_FILE
        jhead -mkexif $BILD 1>> $TMP_FILE 2>>$TMP_FILE
        echo "" 1>> $TMP_FILE
        COUNTER=$((COUNTER + 1))
        
    # wenn EXIF-Feld "Date/Time" existiert, setze EXIF-Feld "File date" mit den Werten aus EXIF-Feld "Date/Time"
    elif [ $RC -eq 1 ]
        then
        echo "$BILD:  setze Datum aus EXIF-Feld >Date/Time< als Dateidatum" 1>> $TMP_FILE
      touch -t $(jhead "$BILD" | egrep ^"Date/Time" | awk '{print $3":"$4}' | awk -F":" '{print $1$2$3$4$5"."$6}') "$BILD" 1>> $TMP_FILE 2>>$TMP_FILE
      echo "" 1>> $TMP_FILE
      COUNTER=$((COUNTER + 1))
    fi
done
 
kdialog --title "Foto-Zeitstempel als Datei-Zeitstempel setzen" --msgbox "Es wurde(n) $COUNTER Datei(en) verarbeitet. Logdatei unter $TMP_FILE"
#EOF


Im nachfolgenden Screenshot ist der neu hinzu gekommene Punkt im Servicemenü, bei einem Rechtsklick auf ein JPEG, zu sehen.


Kontextmenü EXIF Daten anzeigen

Weiterführende Informationen

Die vorhergehenden Artikel (Teil 1 und Teil 2) der Serie sind hier im Blog nachzulesen.

Servicemenü für den KDE Dateimanager Dolphin individuell erweitern

Servicemenü für den KDE Dateimanager Dolphin individuell erweitern (Teil 2)