Files
json-to-metadata/CLAUDE.md
Antoine Van Elstraete 456717f639 Ajout option --set-file-date pour modifier le mtime des fichiers
Permet de modifier la date de modification des fichiers images selon
la date de prise de vue du frame, utile pour le tri par date dans
les gestionnaires de fichiers.

Utilise os.utime() pour modifier atime et mtime.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 16:30:06 +01:00

3.5 KiB

CLAUDE.md - Contexte projet pour agent IA

Description du projet

Script Python de gestion des métadonnées EXIF pour photos argentiques. Lit un fichier JSON généré par l'application mobile Exif Notes et écrit les métadonnées dans les fichiers images correspondants.

Stack technique

  • Python 3.11+ (utilise zoneinfo natif)
  • exiftool (CLI) appelé via subprocess — pas de wrapper Python
  • pytest pour les tests
  • flake8 pour le linting (max-line-length=100)

Structure du projet

json_to_metadata/
├── __init__.py          # Version du package
├── cli.py               # Point d'entrée CLI (argparse)
├── json_parser.py       # Lecture et validation du JSON
├── metadata_mapper.py   # Mapping JSON → tags EXIF
├── exif_writer.py       # Écriture EXIF via exiftool
└── xmp_writer.py        # Génération de fichiers XMP sidecar

tests/
├── test_json_parser.py
├── test_metadata_mapper.py
├── test_exif_writer.py
└── test_xmp_writer.py

Commandes utiles

# Activer l'environnement
source venv/bin/activate

# Lancer le script
python -m json_to_metadata <fichier.json> -d <dossier_images>

# Options CLI
#   -v, --verbose      Mode verbeux (DEBUG)
#   --dry-run          Affiche sans exécuter
#   --force-xmp        Force création XMP même pour TIFF/JPEG
#   --set-file-date    Modifie le mtime des fichiers selon la date de prise de vue

# Tests
pytest tests/ -v

# Linting
flake8 json_to_metadata/ tests/ --max-line-length=100

Format JSON attendu (Exif Notes)

{
  "id": "roll-001",
  "camera": { "make": "Nikon", "model": "FM2" },
  "lens": { "make": "Nikon", "model": "Nikkor 50mm f/1.4" },
  "filmStock": { "make": "Kodak", "model": "Portra 400" },
  "iso": 400,
  "frames": [
    {
      "id": 1,
      "date": "2024-03-15T14:30",
      "shutter": "1/125",
      "aperture": "f/2.8",
      "focalLength": 50,
      "location": { "latitude": 48.8584, "longitude": 2.2945 },
      "note": "Description de la photo",
      "flashUsed": false,
      "lightSource": "daylight"
    }
  ]
}

Mapping JSON → EXIF

Champ JSON Tag EXIF
camera.make/model Make, Model
lens.make/model LensMake, LensModel
iso ISO
frame.date DateTimeOriginal, CreateDate
frame.shutter ExposureTime, ShutterSpeedValue
frame.aperture FNumber, ApertureValue
frame.focalLength FocalLength
frame.location.* GPSLatitude/Ref, GPSLongitude/Ref
frame.note ImageDescription, UserComment
frame.flashUsed Flash
filmStock.* Inclus dans ImageDescription

Formats supportés

Vitesses d'obturation

  • Fractions : 1/125, 1/1000
  • Secondes : 2, 2s, 2", 4'
  • Mode Bulb : B, bulb

Dates

  • ISO complet : 2024-03-15T14:30:00
  • Sans secondes : 2024-03-15T14:30
  • Avec timezone : 2024-03-15T14:30:00+02:00
  • Date seule : 2024-03-15

Images

  • EXIF intégré : .tif, .tiff, .jpg, .jpeg
  • Support partiel (fallback XMP) : .avif, .heic, .webp
  • XMP sidecar uniquement : autres formats

Conventions de code

  • Docstrings en français
  • Messages de log en français
  • Fuseau horaire par défaut : Europe/Paris
  • Pas d'emoji sauf demande explicite

Points d'extension possibles

  • Ajout de nouveaux tags EXIF dans metadata_mapper.py (fonction map_frame_to_exif)
  • Nouveaux formats de date dans parse_date() (liste formats)
  • Support de nouveaux formats d'image dans exif_writer.py (constantes *_EXTENSIONS)