Photos : problème pour ajuster date et heure

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Ok
donc il faut écrire un script pour mettre une date de prise de vue et modifier la date du fichier.
Pour cela il faut- être sur du format du titre des photos.
elles sont toutes au format : "IMG-AAAAMMJJ-XXXXXX.jpg" ?
Après confirmation du format, ou me donner les différents format utilisés pour nommer ces photos, je pourrai envisager de t'écrire un petit script pour faire çà.
Toutes les photos concernées devront être dans un dossier du finder.
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
J'ai oublier de te préciser, tous le fichiers seront donc mis à la même heure par exemple 12h00mn00sec.
et y aura t'il des sous dossiers ? (des dossiers dans le dossier principal ).
 

sojateur

Nouveau membre
2 Février 2013
7
0
Tous les fichiers sont bien du même format au niveau du nom. Quant à l'heure ce n'est pas grave, si au moins la date peut être à jour c'est déjà une belle avancée.
Et non il n'y aura pas de sous dossier, au pire j'isolerais les fichiers concerné au préalable.

Je crois que j'ai d'autre dossier ou ce problème à lieu, avec des titre différent mais toujours avec la date dans le titre. Pour ce cas là je pense être capable de remodifier le script s'il n'y a que des petite modification à faire.
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Bonjour,
Je t'ai écrit un petit script qui:
-te demande de choisir le dossier à 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, les 8 caractères après le premier "-" comme date, ils doivent être au format AAAAMMJJ , 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.

Dis moi si cela te convient, ou les modifs à faire.
Comme toujours pas exempt de bug alors faire un essai sur un copie...

Bloc de code:
-- remplace date du fichier par la date exif creation ou par la date du nom après 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 après le premier -
                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 dernier "."
                set nb to offset of "-" in nom
                set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                set madate to characters (nb + 1) thru (nb + 8) of nom as string
                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
              
                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
 
Dernière édition:

sojateur

Nouveau membre
2 Février 2013
7
0
Wouaouh...

Je m'attendais pas à un script si bien fait :eek:
J'ai fais les test:
  • ça marche très bien pour récupérer la date depuis le nom du fichier (si pas de date de prise de vue)
  • pour les fichiers où juste la date de prise de vue est bonne, les modification sur les dates de modification et création se font aussi très bien.

Je pense aussi avec ton script avoir compris comment changer les délimitation dans le nom du fichier si besoin donc pas besoin de modification :)

Un grand merci, c'est totalement ce qu'il me fallait !
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
C'est pour çà que je l'ai commenté...
Content pour toi !

Oups! un bug , j'ai oublié de réinitialiser les 2 variables "nb" et "madate" dans la récupération de la date dans le nom, ce qui peut dans certain cas poser un problème: nouveau code corrigé.
Bloc de code:
-- remplace date du fichier par la date exif creation ou par la date du nom après 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 après le premier -
                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 dernier "."
                set nb to offset of "-" in nom
                if nb is not 0
                set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                set madate to characters (nb + 1) thru (nb + 8) of nom as string
                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
                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
 
Dernière édition: