La Lanterne Rouge

Warning: Geek Inside

Ajouter ou corriger la timezone EXIF de photos en masse

- Posted in Sans catégorie by

En voulant créer un album fusionné de nos photos respectives d'un même séjour avec ma moitié, on s'est rendu compte que si mon ordiphone (un Samsung Galaxy A51) ajoutait bien la notion de fuseau horaire sur les photos en tag EXIF, ce n'était pas le cas du sien (un Samsung Galaxy S5) qui ne mettait que l'heure !

Fâcheux car une fois fusionnées, les photos n'étaient pas correctement triées sur Lychee car celui-ci compare les horaires en UTC ! (ce qui est logique et d'ailleurs très bien)

Pour 2 photos prises au même moment sur chacun de nos appareils cet été on se trouvait donc avec :

  • ma photo en AAAA-MM-JJ HH:mm:ss +02:00
  • sa photo en AAAA-MM-JJ HH:mm:ss, considérée donc comme UTC ou +00:00

Ce qui fait donc 2h de décalage à chaque fois. S'il était 17:00 (heure locale), ma photo était en 17:00:00 +02:00, et la sienne en 17:00:00 +00:00, ce qui fait donc, ramenées en UTC, 15:00:00 pour moi et toujours 17:00:00 pour elle.

En observant les les tags EXIF sur ses photos j'ai rapidement compris. Mais une fois le constat passé, il fallait pouvoir corriger.

Le plus simple dans ce cas est d'utiliser exiftool et d'écrire un petit script. Celui sera chargé de récupérer la date de prise de la photo (via EXIF), d'en déduire le décalage (+01:00 en hiver en France, +02:00 en été) et d'injecter ou écraser les tags EXIF OffsetTime et OffsetTimeOriginal.

Ce qui donne ça :


Addedum 18 octobre :

Il n'est pas utile ni pertinent d'appliquer le scripts aux photos qui sont déjà présentes dans Lychee, car les métadonnées utilisées pour le classement sont indexées dans la base de données SQLite intégrée à l'application.

À la place, il faut corriger ces métadonnées en base, ce qui peut se faire avec les requêtes suivantes :

-- Photos à corriger avec l'horaire d'été
UPDATE photos
SET taken_at_orig_tz = "+02:00",
  taken_at = datetime(taken_at, '-2 hours')
WHERE 1
AND (taken_at_orig_tz = "UTC" OR taken_at_orig_tz = "" OR taken_at_orig_tz IS NULL)
AND CAST(strftime("%m", taken_at) as INT) >= 4
AND CAST(strftime("%m", taken_at) as INT) <= 10;

-- Photos à corriger avec l'horaire d'hiver
UPDATE photos
SET taken_at_orig_tz = "+01:00",
  taken_at = datetime(taken_at, '-1 hour')
WHERE 1
AND (taken_at_orig_tz = "UTC" OR taken_at_orig_tz = "" OR taken_at_orig_tz IS NULL)
AND (CAST(strftime("%m", taken_at) as INT) < 4
  OR CAST(strftime("%m", taken_at) as INT) > 10
);

Note : La correction reste assez naïve car cela ne tient pas rigoureusement compte de la date de changement d'heure. On utilise à la place un arrondi au mois :

  • novembre => mars = HIVER
  • avril => octobre = ÉTÉ

En considérant que ces requêtes sont dans un fichier fix_tz.sql, on pourra l'importer comme ceci en se plaçant dans le dossier db/ de Lychee :

# Backup par précaution
cp lychee.sqlite lychee.sqlite.bak-$(date +%Y%m%d)
# Application des modifications
cat fix_tz.sql | sqlite3 lychee.sqlite