Photo: motif exif automatique

Ralfix

Membre actif
21 Novembre 2007
222
42
Nord
Bonjour,

Mon père a scanné des milliers de négatifs et photos de famille, de son club photo, de l'histoire de la ville. Les photos sont soigneusement nommées en commençant par la date.
Je lui ait donné un ancien iMac et expliqué Photo, il a rempli 3 photothèques.

Mais évidemment la date n'est pas renseignée dans les Exifs ce qui empêche de faire des regroupements et classements rapidement.

Je cherche donc un moyen (script?) pouvant être utilisé dans photo pour extraire la date du nom du fichier et mettre à jour la date dans l'exif.

Est-ce que c'est possible ?
Un grand merci si vous avez une solution !
 
Via la commande
touch -t
tu peux changer la date dans les exif afin d'avoir celle de ton choix dans Photos

Peux-tu me donner un exemple de nom de fichier et je te donne les commandes à passer pour le faire.
Il faudra avoir les photos dans un répertoire et plus dans Photos.
 
  • J’aime
Réactions: Human-Fly
Avec exif editor tu peux editer les données exif sur un lot de photo. ( à faire or de l'appli photos) Je n'utilise pas photos e peut t'on pas classer les photos par nom de fichier et ensuite créer des albums ? ( ce serait pus rapide)
 
Via la commande
touch -t
tu peux changer la date dans les exif afin d'avoir celle de ton choix dans Photos

Peux-tu me donner un exemple de nom de fichier et je te donne les commandes à passer pour le faire.
Il faudra avoir les photos dans un répertoire et plus dans Photos.

Bonjour,

Voila un nom d'image type: 1998-01-14_01_Lendemain de naissance.jpg
Ils sont dans des dossiers classés par mois au format 1998-01

J'avais un peu laissé tomber, je m'en excuse, mais suite à un décès je souhaite reprendre cette importation dans photo pour retrouver facilement des visages.
 
Bonsoir

Je me base uniquement sur la date "1998-01-14", donc la date du fichier sera avec comme heure : 00h00

Dans le code suivant, il faudra mettre l'adresse du répertoire contenant tes photos dans "path_photo" à la place du "/User/Ralfix/..."
Crée toi un fichier "modifier_date.sh" dans le dossier téléchargement contenant ce code

Bloc de code:
#!/bin/bash

path_photo="/Users/Ralfix/..../repertoire_photo"

#Modification date
function modify_date {
  file_date=$(basename "$1" | cut -c 1-10 | sed "s/\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)/\1\2\30000.00/" )
  echo "$1"
  touch -t $file_date "$1"
}

#Pour utiliser les fonctions dans le find
export -f modify_date

#Modification date
find "${path_photo}" -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_*.jpg" -exec bash -c 'modify_date "{}"' \;

Passe dans le terminal les commandes suivantes (si c'est bien Ralfix ton user)
Bloc de code:
chmod +x /Users/Ralfix/Downloads/modifier_date.sh
/Users/Ralfix/Downloads/modifier_date.sh
 
Dernière édition par un modérateur:
Merci merci, on y est ... presque !

J'ai bien réussi à executer le script (qui va dans les repertoires en plus, c'est genial) et j'ai vu dans les infos fichier que les dates sont bonnes.
Par contre quand je les importe dans photo ce n'est pas le cas :banghead:

Exemple:
dans le finder la date de création de la photo est: jeudi 15 janvier 1998 à 00:00
Et dans Photo: 21 Avril 2004 16:35:43

Reste un petit loup.
 
Bonjour,

@ecatomb :coucou:
Ton script change la date de création du fichier, donc pas de problème pour un classement dans le finder qui utilise cette date, mais l'application photo utilise la date exif de la prise de vue, donc pas de classement dans photo.

@Ralfix
Dans l'exemple que tu donnes, la date réelle de la prise de vue est 1998 ou 2004 ?
Je suppose que 2004 est la date à laquelle la photo à été scannée et mise sur l'ordi.

Dans ce cas il faut créer la date de prise de vue dans les exif de la photo, ceci ne peut se faire que si les fichiers sont sorti de l'application photo et mis dans des dossiers sur le finder.

ci-dessous un script (applescript) qui ferait le job.
A son lancement il te demande de choisir le dossier a traiter.
-il traite tous les fichiers du dossier et de ses sous dossier
-il vérifie si le fichier contient déjà une date de prise de vue, si oui, il se sert de cette date pour remplacer la date du fichier.
-sinon il récupère dans le nom, la date, qui doit être au format "AAAA-MM-JJ_xxxxxx", il ajoute 12h00mn00sec et il cré une date de prise de vue et remplace la date du fichier.
Il crée sur le bureau un fichier texte "date trouvée.txt" contenant la liste des fichiers dont la date existait déjà, et un fichier texte "date erreur.txt" contenant la liste des fichiers dont il n'a pas pu extraire la date du nom.

Bloc de code:
-- remplace date du fichier par la date exif creation ou par la date du nom avant le premier "_"

tell application "Finder"
    set Chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à redater"
    my inspecter(Chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
           
            set lefichier to chaque_fichier
            set AppleScript's text item delimiters to {""}
            set nom to name of chaque_fichier --récupère le nom du fichier
           
            set chaque_fichier to chaque_fichier as string --chemin du fichier
            set unedate to true --initialise le flag date trouvée
           
            try
                --récupère la date si elle existe
                set datephoto to do shell script "/usr/local/bin/exiftool -DateTimeOriginal " & quoted form of POSIX path of chaque_fichier
                if datephoto is "" then set datephoto to do shell script "/usr/local/bin/exiftool -CreationDate " & quoted form of POSIX path of chaque_fichier
                if datephoto is "" then set datephoto to do shell script "/usr/local/bin/exiftool -CreateDate " & quoted form of POSIX path of chaque_fichier
               
                if datephoto is "" then
                    set unedate to false --vérifie si date trouvée
                end if
               
            on error
                set unedate to false -- si erreur dans la récup de date
                set datephoto to ""
            end try
           
            if length of datephoto > 20 then
                --mise en forme de la date récupérée
                set x to (length of datephoto) - 33
                set DateOriginale to text -x thru -1 of datephoto
                set ladate to text 1 thru 5 of DateOriginale
                set lannee to ladate
                set ladate to ladate & text 7 thru 8 of DateOriginale
                set lemois to text 7 thru 8 of DateOriginale
                set ladate to ladate & text 10 thru 11 of DateOriginale
                set lejour to text 10 thru 11 of DateOriginale
                set ladate to ladate & text 13 thru 14 of DateOriginale
                set lheure to text 13 thru 14 of DateOriginale
                set ladate to ladate & text 16 thru 17 of DateOriginale
                set lesminutes to text 16 thru 17 of DateOriginale
                set ladate to ladate & "." & text 19 thru 20 of DateOriginale
                set lessecondes to text 19 thru 20 of DateOriginale
                set newnom to lannee & "-" & lemois & "-" & lejour & " " & lheure & "." & lesminutes & "." & lessecondes
               
                set xxx to ladate as string --vérifie sidate trouvée est 000
                if xxx is " 000000000000.00" then
                    set unedate to false
                else
                    -- remplace date fichier par date originale et écrit dans fichier log
                    do shell script "touch -t " & ladate & " " & quoted form of POSIX path of chaque_fichier
                    set lelog to open for access ((path to desktop folder as text) & "Date trouvée.txt") as text with write permission
                    write "Le fichier avait une date originale: " & DateOriginale & " " & chaque_fichier & return to lelog starting at eof
                    close access lelog
                end if
            end if
           
            if unedate is false then
                --récupère la date du nom
                set nb to ""
                set madate to ""
                set nom to nom as string
                set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                set AppleScript's text item delimiters to {"_"} --récupère la partie avant le premier "_"
                set ladate to text item 1 of nom
                set AppleScript's text item delimiters to {"-"}
                set nb to offset of "-" in nom
                if nb is not 0 then
                    set annee to text item 1 of ladate
                    set mois to text item 2 of ladate
                    set jour to text item 3 of ladate
                    set madate to annee & mois & jour
                    set madate to madate & "1200.00"
                    set commande1 to "/usr/local/bin/exiftool -datetimeoriginal=" & madate & " " & quoted form of POSIX path of chaque_fichier
                    set commande2 to "/usr/local/bin/exiftool -createdate=" & madate & " " & quoted form of POSIX path of chaque_fichier
                end if
                set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
               
                try
                    --ecrit dans les exif la date du nom
                    do shell script commande1
                    do shell script commande2
                    do shell script "touch -t " & madate & " " & quoted form of POSIX path of chaque_fichier
                    do shell script "rm " & quoted form of POSIX path of (chaque_fichier & "_original")
                on error
                    --si date du nom est erreur écrit un log
                    set lelog to open for access ((path to desktop folder as text) & "Date erreur.txt") as text with write permission
                    write "Le nom fichier ne possède pas de date: " & chaque_fichier & return to lelog starting at eof
                    close access lelog
                end try
            end if
        end repeat
       
       
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
   
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
J'ai oublié de te préciser qu'il faut d'abord installer exiftool à télécharger la: https://exiftool.org/
Il suffit d'ouvrir le DMG et d'exécuter le "ExifTool-12.14.pkg"
 
Ton script change la date de création du fichier, donc pas de problème pour un classement dans le finder qui utilise cette date, mais l'application photo utilise la date exif de la prise de vue, donc pas de classement dans photo.
Ah oui, mer***

C'était la commande utilisant "ExifTool" (https://exiftool.org) que j'utilisais. En prime, c'était pour extraire la date de la photo via la commande suivante, pas la modifier :banghead:
Bloc de code:
exiftool -d "%Y-%m-%d %H.%M.%S" -DateTimeOriginal -S -s "$fichier"
Bon, ben tu as expliqué quoi faire. Plus besoin de moi :D

Pour installer ExifTool, il faut maintenir "Control" avant d'ouvrir le dmg. Sinon, il ne voudra pas s'installer (sécurité de Apple pour les applications d'un développeur non identifié)
Cliquez sur l’icône de l’app en maintenant la touche Contrôle enfoncée, puis choisissez Ouvrir dans le menu contextuel
 
Merci je vais essayer ça sans tarder. C'est complet, on voit que vous vous êtes déjà cassé la tête sur le sujet !