Tutorial: Metadaten in Fotos einfügen und gezielte Synology Neuindizierung

Puddies

Benutzer
Mitglied seit
11. Sep 2020
Beiträge
71
Punkte für Reaktionen
4
Punkte
8
Ich möchte hier eine kurze Hilfe für folgende Probleme bereitstellen:

(1): Screenshots und Bilder aus Whatsapp enthalten leider keine Meta-Informationen. So können diese in den üblichen Photo Apps von Synology nicht vernünftig nach Aufnahme-Datum sortiert werden. Hierfür habe ich ein kleines Python-Skript geschrieben, welches die Metainformationen anhand der Dateinamen einfügt. Daraus ergibt sich allerdings ein zweites Problem:

(2): Werden Fotos per Skript bearbeitet, müssen sie im Anschluss in den Synology-Index eingefügt werden. Andernfalls erkennen die Photo Apps die Änderungen nicht und die Bilder bleiben für die Apps auf dem alten Stand. Hierfür kann der Befehl synoindex verwendet werden. Diesen habe ich in mein Python-Skript ebenfalls eingebaut. Besonders schön ist an dieser Lösung, dass keine vollständige Neuindizierung aller Fotos gemacht werden muss, sondern gezielt ausschließlich die bearbeiteten Fotos indiziert werden. Das spart sehr viel Zeit und sorgt dafür, dass der ganze Prozess in wenigen Sekunden abgeschlossen ist.

(3): Zusätzlich benenne ich die Whatsapp-Bilder (IMG-YYMMDD-WA<Nr>) und die Screenshots (Screenshot_YYMMDD..) um, so dass sie in das Schema IMG_YYMMDD... passen. Bei den Whatsapp-Bildern werden alle Bindestriche durch Unterstriche ersetzt. Bei Screenshots wird das Präfix Screenshot_ durch IMG_ ersetzt. Das hat abgesehen von der vereinheitlichten Namensgebung den angenehmen Nebeneffekt, dass diese Bilder beim nächsten Durchlauf des Skripts nicht noch einmal angefasst werden, da diese nach der Umbenennung nicht mehr in das gesuchte Dateinamens-Schema passen.

Das hier ist mein Python-Skript:
Code:
'''
Created on 25.10.2020

@author: Puddies, synology-forum.de
@version: 1.0.0-20201029
'''

import os
from datetime import datetime
import piexif
import re
import subprocess

'''
Liest aus Dateien mit den Mustern

Screenshot_YYMMDD_HHMMSS_...jpg
IMG_YYMMDD_WAXXX.jpg

Das Datum und gegebenenfalls die Uhrzeit heraus.
'''
def get_date(filename):

    # entfernt das Suffix .jpg
    split = filename.split('.')[0]
    
    # teilt den Dateinamen nach Unterstrichen auf
    split = split.split('_')
    
    if filename.startswith('Screenshot'):
        # Zweiter Teil des splits (split[1]) steht fürs Datum, dritter Teil (split[2]) für die Uhrzeit
        date_str = split[1] + split[2]
    else:
        # Zweiter Teil des splits (split[1]) steht fürs Datum, eine fiktive Uhrzeit 00:00:00 wird hinten dran gehängt
        date_str = split[1] + '000000'
        
    # Lese aus dem date_str mit dem Format YYMMDDHHMMSS das Datum und die Uhrzeit
    return datetime.strptime(date_str, '%Y%m%d%H%M%S').strftime("%Y:%m:%d %H:%M:%S")

if __name__ == '__main__':
    
    path = '/volume1/photo/'
    
    for currentpath, folders, files in os.walk(path):
        files[:] = [f for f in files if f.split('.')[-1] == 'jpg' and (f.split('-')[-1].startswith('WA') or f.startswith('Screenshot'))]
        
        for filename in files:
            old_fullpath = os.path.join(currentpath,filename)
            print(old_fullpath)
            
            # ersetzt alle Bindestriche durch Unterstriche
            newfilename = re.sub(r'-', '_', filename)
            
            # Extrahiere das Datum und die Uhrzeit aus dem Dateinamen
            exif_dict = {'Exif': { piexif.ExifIFD.DateTimeOriginal: get_date(newfilename) }}
            
            # ersetzt Screenshot_ durch IMG_
            newfilename = re.sub(r'Screenshot_', r'IMG_', newfilename)
            
            # Benennt die Dateien um
            new_fullpath = os.path.join(currentpath,newfilename)
            os.rename(old_fullpath, new_fullpath)
            
            # Fügt das Datum und die Uhrzeit als Meta-Daten in die Bild-Datei ein
            exif_bytes = piexif.dump(exif_dict)
            piexif.insert(exif_bytes, new_fullpath)
            
            # Füge neue Dateienamen in den Index ein und lösche die alten aus dem Index
            subprocess.call(["synoindex", "-a", new_fullpath])
            subprocess.call(["synoindex", "-d", old_fullpath])
            
            print('Done!\n')

Um das Skript automatisiert auf der Diskstation zum Laufen zu bringen, muss folgendes gemacht werden:

  • Python installieren: Paket-Zentrum: Python3 installieren
  • Virtualenv einrichten und benötigte Pakete installieren:
    • Einloggen mit Admin-Accout auf die Diskstation (via Telnet oder Linux-Konsole)
    • python3 -m venv /opt/pyenv
    • . /opt/pyenv/bin/activate
    • pip install --upgrade pip
    • pip install piexif
  • Das Python-Skript anpassen und einfügen
    • Auf eurem Rechner lokal eine Datei erzeugen mit einem gewünschten Namen, z.B. fix-photos.py
    • Den obenstehenden Python-Code in die Datei einfügen
    • Die Zeile path = '/volume1/photo/' auf den Pfad anpassen, auf dem ihr eure Fotos/Foto-Alben gespeichert habt. Das Skript geht den Pfad rekursiv durch, ihr könnt also das oberste Verzeichnis eurer Foto-Alben angeben.
    • Die Datei an einen beliebigen Ort auf der Diskstation kopieren, z.B. unter /opt/scripts/fix-photos.py (via Telnet) oder auch einfach in einen freigegebenen Ordner via File Station hochladen.
  • Automatisierte Aufgabe anlegen:
    • Systemsteuerung -> Aufgabenplaner -> Erstellen -> Geplante Aufgabe -> Benutzerdefiniertes Skript
    • Den Zeitplan auf die gewünschte Uhrzeit stellen (Bei mir täglich 23:50 Uhr)
    • In den Aufgabeneinstellungen folgendes einfügen:
      • Code:
        . /opt/pyenv/bin/activate
        python /opt/scripts/fix-photos.py
      • Die Pfade müsst ihr natürlich entsprechend anpassen, je nachdem wo ihr eure Python-Umgebung installiert habt und wohin ihr das Python-Skript kopiert habt.

Und fertig! Viel Spaß beim Ausprobieren!
Vielen Dank an @Benares @neuhier17, deren Beiträge mir bei der gezielten Indizierung sehr geholfen haben!
 
Zuletzt bearbeitet:

Checole

Benutzer
Mitglied seit
17. Apr 2021
Beiträge
18
Punkte für Reaktionen
0
Punkte
1
Hallo Puddy,
funktioniert # Fügt das Datum und die Uhrzeit als Meta-Daten in die Bild-Datei ein das mit Synology Photos und .heic Format?
Wird das in direkt in das Bild geschrieben oder in eine .xmp sidecar Datei?
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat