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
(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:
Um das Skript automatisiert auf der Diskstation zum Laufen zu bringen, muss folgendes gemacht werden:
Und fertig! Viel Spaß beim Ausprobieren!
Vielen Dank an @Benares @neuhier17, deren Beiträge mir bei der gezielten Indizierung sehr geholfen haben!
(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.
- Auf eurem Rechner lokal eine Datei erzeugen mit einem gewünschten Namen, z.B.
- 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: