• Bonjour Visiteur. Bienvenue sur les nouveaux forums de MacGeneration. La peinture est encore fraiche, quelques boulons doivent être resserrés, plus d’informations demain !

WORKFLOW : Sortir des listes des rushs avec leur durée

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
Salut !
Ca fonctionne du tonnerre pour les dossiers dans le dossier que je choisis. Par contre visiblement il y a un pb dans l'addition des valeurs de tailles des fichiers pour ce qui est du total à le fin : j'obtiens un nombre ridicule, plus petit que la taille de certains fichiers contenus dans les dossiers...
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Je ne comprend pas de quelle valeur tu parles.
Je ne fais pas de total !
La dernière ligne affiche normalement la taille du dossier choisi au départ !
Tu peux préciser ce qui ne va pas ?
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
Deso c'était pas clair.
En gros ce qui ne fonctionne pas c,est la dernière ligne :

total général du dossier 13_02_18 0 h 57 mn 47 sec 1.43 Mo

alors que le dossier fait 13 gigas... Sachant que le dossier en question contient bcp de sous dossiers et sous sous dossiers. Si j essye avec un dossier qui a simplement deux sous dossiers et des files dedans ca me sort la bonne valeur. Je comprends pas ! Je viens de regarder le script et en effet c'est pas un d'addition puisque tu es allé chercher la taille direct... Je precise que si je fais
du -h \chemin dans le terminale j'ai bien une valeur de 13 gigas.
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
je viens de vérifier, je n'arrive pas à reproduire ton problème.
j'ai quand même modifié le nom de la variable car il pourrai y avoir une confusion.
essai avec ça.
Bloc de code:
property dossier : ""
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0
    set dossier to name of chemin
    my inspecter(chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"}
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string
               
               
                try
                   
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier
                        set lataille to size of infoRec
                        set lechemin to container of (path to me) as string
                        set lechemin to lechemin & "duree_mlv.py" as string
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of infos
                        set seconde to seconde as number
                        if seconde = 0 then
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video
                        set infoRec to info for file lefichier
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable seconde
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                    if lextension is in FVideo_dv_avi then
                        set infoRec to info for file lefichier
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la duréeau format teste exiftool
                        set AppleScript's text item delimiters to {":"}
                        set NB to count of text items of duree
                        if NB = 2 then
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier
                end try
            end tell
        end repeat
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier) -- dossier suivant
        end repeat
    end tell
end inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set lataille to lataille / 1000000
    set taille to lataille as string
    set AppleScript's text item delimiters to {","}
    set MO to text item 1 of taille
    set KO to text item 2 of taille
    set KO to text 1 thru 2 of text item 2 of taille
    set lataille to MO & "." & KO
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end ecriture

on total(nomdos, totsec, un_dossier)
   
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set lataille to lataille / 1000000
    set taille to lataille as string
    set AppleScript's text item delimiters to {","}
    set MO to text item 1 of taille
    set KO to text item 2 of taille
    set KO to text 1 thru 2 of text item 2 of taille
    set lataille to MO & "." & KO
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set lataille to lataille / 1000000
    set taille to lataille as string
    set AppleScript's text item delimiters to {","}
    set MO to text item 1 of taille
    set KO to text item 2 of taille
    set KO to text 1 thru 2 of text item 2 of taille
    set lataille to MO & "." & KO
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Voir en conversation privée ...
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Coucou !
Voila une version qui gère les dossier de plus de 10 Go

Bloc de code:
property dossier : ""
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0
    set dossier to name of chemin
    my inspecter(chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"}
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string
               
               
                try
                   
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier
                        set lataille to size of infoRec
                        set lechemin to container of (path to me) as string
                        set lechemin to lechemin & "duree_mlv.py" as string
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of infos
                        set seconde to seconde as number
                        if seconde = 0 then
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video
                        set infoRec to info for file lefichier
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable seconde
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                    if lextension is in FVideo_dv_avi then
                        set infoRec to info for file lefichier
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la duréeau format teste exiftool
                        set AppleScript's text item delimiters to {":"}
                        set NB to count of text items of duree
                        if NB = 2 then
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier
                end try
            end tell
        end repeat
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier) -- dossier suivant
        end repeat
    end tell
end inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set lataille to lataille / 1000000
    set taille to lataille as string
    set AppleScript's text item delimiters to {","}
    set MO to text item 1 of taille
    set KO to text item 2 of taille
    set KO to text 1 thru 2 of text item 2 of taille
    set lataille to MO & "." & KO
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end ecriture

on total(nomdos, totsec, un_dossier)
   
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille
    set KO to taille mod MO
    set KO to KO as string
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string
   
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille
    set KO to taille mod MO
    set KO to KO as string
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
Trop cool !
Je viens d'essayer avec un gros fichier chez moi, et ça marche !
(BTW en fait les mp4 il faut les mettre dans la liste FVideo_dv_avi sinon ça renvoie "null" comme valeur)
Du coup t'as fait comment ? Je viens de comparer les deux scripts pour essayer de capter mais je suis un peu perdu... C'est quoi la différence entre mod et div par exemple ? Et surtout : comment t'as fait pour résoudre le pb :) ?
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Alors div te renvoi le résultat de la division alors que mod te renvoi le reste de la division.
pour résoudre le problème j'ai récupérer l'entier de la division et le reste avant de transformer la valeur en chaine de caractères.

Bref , l'important c'est que ça fonctionne.

Edit: par contre je n'ai aucun problème avec les mp4 dans l'une ou l'autre des méthodes d'extraction ils fonctionnent dans l'une ou l'autre des listes.
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
coucou
je vois que tu es intéressé pour comprendre le script, donc je l'ai commenté, afin que tu puisses le comprendre et le modifié à ta convenance.

Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
      
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"} -- liste des extension à traiter dans FVideo_de_avi avec exftool
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
              
              
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                  
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                  
                    if lextension is in FVideo_dv_avi then -- si fichier video de la liste FVideo_dv_avi
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
  
    set taille to lataille / 1000000 -- la taille en octets divisée par 1 000 000
    set MO to round taille -- recup dans MO l'entier  du resultat soit les Mo
    set KO to taille mod MO -- recup dans KO le resultat du reste de la division de la taille en Mo par l'entier (nommbre de Mo)
    set KO to KO as string -- le résutat du reste ( 0.xxxxxxxxxx) au format chaine
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string --confection de la valeur taille (Mo + les caractères 3 et 4 de Ko)
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille
    set KO to taille mod MO
    set KO to KO as string
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string
  
  
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille
    set KO to taille mod MO
    set KO to KO as string
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string
  
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Décidément, j'avais pas vu un petit bug d'affichage des tailles, correction faite.

Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"} -- liste des extension à traiter dans FVideo_de_avi avec exftool
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
               
               
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo_dv_avi then -- si fichier video de la liste FVideo_dv_avi
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set taille to lataille / 1000000 -- la taille en octets divisée par 1 000 000
    set taille to taille as string -- recup au format chaine
    set AppleScript's text item delimiters to {","} -- defini le separateur avec la ","
    set MO to text item 1 of taille -- recup la partie avant la virgule
    set KO to text 1 thru 2 of text item 2 of taille -- recup les 2 premiers caractères apres la virgule
    set lataille to MO & "." & KO -- confection de la variable lataille
   
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille -- recup dans MO l'entier  du resultat soit les Mo
    set KO to taille mod MO -- recup dans KO le resultat du reste de la division de la taille en Mo par l'entier (nommbre de Mo)
    set KO to KO as string -- le résutat du reste ( 0.xxxxxxxxxx) au format chaine
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string --confection de la valeur taille (Mo + les caractères 3 et 4 de Ko)
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille
    set KO to taille mod MO
    set KO to KO as string
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
C'est trop cool merci ! Je suis en train d'apprendre plein de trucs en ce moment qui font que je réussis à me marrer avec des missions en soi pas très drôles...
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Encore un bug de dévoilé !
le calcul de la taille des dossiers pouvait être faux car il arrondi la valeur en Mo (supérieur ou inférieur suivant xx.49 ou xx.51)
donc il faut lui forcer l'arrondi inférieur avec l'option rounding down.
je te remet un script ! :D

Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"} -- liste des extension à traiter dans FVideo_de_avi avec exftool
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
               
               
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo_dv_avi then -- si fichier video de la liste FVideo_dv_avi
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set taille to lataille / 1000000 -- la taille en octets divisée par 1 000 000
    set taille to taille as string -- recup au format chaine
    set AppleScript's text item delimiters to {","} -- defini le separateur avec la ","
    set MO to text item 1 of taille -- recup la partie avant la virgule
    set KO to text 1 thru 2 of text item 2 of taille -- recup les 2 premiers caractères apres la virgule
    set lataille to MO & "." & KO -- confection de la variable lataille
   
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille rounding down -- recup dans MO l'entier  du resultat soit les Mo
    set KO to taille mod MO -- recup dans KO le resultat du reste de la division de la taille en Mo par l'entier (nommbre de Mo)
    set KO to KO as string -- le résutat du reste ( 0.xxxxxxxxxx) au format chaine
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string --confection de la valeur taille (Mo + les caractères 3 et 4 de Ko)
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille rounding down
    set KO to taille mod MO
    set KO to KO as string
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & text 3 thru 4 of KO as string
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
coucou, je continu à traquer les bugs :D
il y avait un mauvais calcul de taille si un fichier dépassait 10 Go.

Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"} -- liste des extension à traiter dans FVideo_de_avi avec exftool
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
               
               
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo_dv_avi then -- si fichier video de la liste FVideo_dv_avi
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set taille to lataille / 1000000 -- la taille en octets divisée par 1 000 000
    set MO to round taille rounding down -- partie avant la virgule arrondi inferieur
    set KO to round ((taille mod MO) * 100) rounding down -- recup dans KO arrondi inferieur du reste de la division  (taille /Mo) * 100
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & KO -- confection de la variable lataille
   
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille rounding down -- recup dans MO l'entier  du resultat soit les Mo
    set KO to round ((taille mod MO) * 100) rounding down -- recup dans KO arrondi inferieur du reste de la division  (taille /Mo) * 100
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & KO --confection de la valeur taille (Mo + les caractères 3 et 4 de Ko)
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille rounding down
    set KO to round ((taille mod MO) * 100) rounding down -- recup dans KO arrondi inferieur du reste de la division  (taille /Mo) * 100
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & KO
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
La résolution d'un bug en provoque un autre :D, quand on est mauvais ! ! !
Si la taille après la virgule commençait par un 0 (xxxx.01) alors le 0 était supprimé !
Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
      
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"} -- liste des extension à traiter dans FVideo_de_avi avec exftool
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
              
              
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                  
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                  
                    if lextension is in FVideo_dv_avi then -- si fichier video de la liste FVideo_dv_avi
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
  
    set taille to lataille / 1000000 -- la taille en octets divisée par 1 000 000
    set MO to round taille rounding down -- partie avant la virgule arrondi inferieur
    set KO to round ((taille mod MO) * 100) rounding down -- recup dans KO arrondi inferieur du reste de la division  (taille /Mo) * 100
    if KO < 10 then -- si Ko est inférieur à 10 alors il y à un 0 devant (9 --> 09)
        set KO to KO as string
        set KO to "0" & KO
    end if
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & KO -- confection de la variable lataille
  
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille rounding down -- recup dans MO l'entier  du resultat soit les Mo
    set KO to round ((taille mod MO) * 100) rounding down -- recup dans KO arrondi inferieur du reste de la division  (taille /Mo) * 100
    if KO < 10 then
        set KO to KO as string
        set KO to "0" & KO
    end if
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & KO --confection de la valeur taille (Mo + les caractères 3 et 4 de Ko)
  
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
    set taille to lataille / 1000000
    set MO to round taille rounding down
    set KO to round ((taille mod MO) * 100) rounding down -- recup dans KO arrondi inferieur du reste de la division  (taille /Mo) * 100
    if KO < 10 then
        set KO to KO as string
        set KO to "0" & KO
    end if
    set AppleScript's text item delimiters to {"."}
    set lataille to MO & KO
  
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Dernière édition:

zeltron54

Membre d’élite
29 Mars 2008
1 484
229
Lorraine
Coucou Igor,
Allez une manière beaucoup plus simple, de calculer la taille en Mo . o_O
Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"mov", "MOV", "VOB", "vob", "divx", "mp4", "MP4"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        set FVideo_dv_avi to {"dv", "DV", "avi", "AVI"} -- liste des extension à traiter dans FVideo_de_avi avec exftool
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
               
               
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo_dv_avi then -- si fichier video de la liste FVideo_dv_avi
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter



on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set lataille to (round lataille / 10000 rounding down) / 100 -- la taille en Mo et 2 chiffres representatifs apres la virgule
   
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier -- recupère la taille du dossier en octets
    set lataille to size of infoRec
   
    set lataille to (round lataille / 10000 rounding down) / 100 -- la taille en Mo et 2 chiffres representatifs apres la virgule
   
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
   
    set lataille to (round lataille / 10000 rounding down) / 100
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
Salut !
Me revoilà pour continuer à essayer d'améliorer le script :)
En gros comme je l'avais écrit à un moment, les .mp4 ont le même problème que les .avi et les .dv : quand on essaye de prendre leur durée sans passer par exiftool, la valeur retournée est "null".
Et il y a quelques jours, j'ai dévouvert qu'il en était de même pour les .mov encodés en H264 !
Donc pour l'instant j'en suis resté à une solution qui consiste à placer les .mov et les .mp4 dans la liste FVideo_dv_avi (qu'on peut d'ailleurs renommer du coup), mais au final je me suis mis à rêver d'une autre solution...

Pour rappel, suite à mon poste 31, on avait cherché à ne pas passer par exiftool pour la durée parce que le logiciel n'arrivait pas à la lire sur certains mp4... Mais on avait séparé les DV et les avi parce que la nouvelle manière ne trouvait pas les métadonnées.
Là je suis en train de me rendre compte qu'en fait la plupart du temps, il faut aussi mettre les lp4 et les mov via exiftool parce que sinon je n'ai pas les données de temps...
Du coup ça me donne l'idée d'une autre manière de faire :
On ferait une seule liste avec les mov dv avi divx etc etc (tout ce qu'on veut sauf les mlv quoi), et on passe par exiftool. Mais on ajoute un "if" : "si jamais par exiftool on n'obtient pas la valeur de la durée", alors "on essaye l'autre méthode".
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
Voilà où j'en suis mais je galère...
Bloc de code:
property dossier : "" --déclaration de variables globales
property tsecg : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    set tsecg to 0 -- initialise la variable total general des secondes
    set dossier to name of chemin -- récupère le nom du dossier choisi pour écrire la dernière ligne du log
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set FVideo to {"VOB", "vob", "divx", "dv", "DV", "avi", "AVI", "mp4", "MP4", "mov", "MOV"} -- liste des extensions a traiter dans FVideo avec fonction mdls
        -- mise a 0 des variables duree fichier
        set totsec to 0
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --réupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set duree to "" -- mise a blanc de la durée
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
               
               
                try --bloc si erreur
                    --traitement des fichiers MLV
                    if lextension is "mlv" then
                        set infoRec to info for file lefichier --recup infos du fichier par le finder
                        set lataille to size of infoRec -- recup la taille dans les infos
                        set lechemin to container of (path to me) as string -- recup chemin du dossier qui contient le fichier, donc le .py au format chaine chaine
                        set lechemin to lechemin & "duree_mlv.py" as string --fabrique le chemin du fichier .py
                        set fichier_mlv_info to quoted form of POSIX path of lechemin as string --chemin au format unix
                        set infos to do shell script "python " & fichier_mlv_info & " " & quoted form of POSIX path of lefichier as string --execute fichier .py
                        set AppleScript's text item delimiters to {"."} --défini le séparateur de chaine
                        set seconde to text item 1 of infos -- recup le temps en secondes partie avant la virgule
                        set seconde to seconde as number -- converti en nombre
                        if seconde = 0 then -- si le durée est inférieure à la seconde met la durée à 1
                            set seconde to 1
                        end if
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
                   
                    if lextension is in FVideo then -- si fichier video de la liste FVideo
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set lessecondes to do shell script "mdls -name kMDItemDurationSeconds " & quoted form of POSIX path of lefichier --récupère la durée en secondes format mdls
                        set duree to word 3 of lessecondes --extrait la durée en secondes dans la variable les secondes
                        set AppleScript's text item delimiters to {"."}
                        set seconde to text item 1 of duree
                        -- fait le total du dossier en cours
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                    end if
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
La suite du code (je peux pas poster des messages de plus de 5000 caractères)
Bloc de code:
                    if errorMessage then -- c'est ici que je galère... Je voudrais que si jamais je n'ai pas de durée en seconde, je passe par l'autre méthode. J'ai essayé en écrivant if errorMessage is "il est impossible de rendre "null" en type number." then etcetc
                        -- mais le problème de cette tentative, c'est que les guillemets de "null" ferment ce du début. Bref pour l'instant je beugue ici, et c'est relou...
                        display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier & "du coup on va essayer une autre méthode" --affiche message si erreur
                        set infoRec to info for file lefichier --recup taille
                        set lataille to size of infoRec
                        set duree to do shell script "/usr/local/bin/exiftool -Duration " & quoted form of POSIX path of lefichier --récupère la durée au format texte exiftool
                        set AppleScript's text item delimiters to {":"} --defini le séparateur
                        set NB to count of text items of duree -- verifi sur duree est inférieur à 30 secondes (notation différente)
                        if NB = 2 then --recuo duree en secondes
                            set lesseconde to text item 2 of duree
                            set AppleScript's text item delimiters to {"."}
                            set seconde to text item 1 of lesseconde
                            set minute to 0
                            set heure to 0
                            set AppleScript's text item delimiters to {":"}
                        else -- recup duree si supérieure à 30 sec (format hh : mn : sec )
                            set seconde to get last text item of duree as string -- récupère les secondes
                            set minute to text item 3 of duree as string -- récupère les minutes
                            set heure to text item 2 of duree as string --récupère les heures
                            set seconde to seconde + (minute * 60) + (heure * 3600)
                        end if
                        display dialog "Voila c'est resolu, le fichier qui affichait null fait en fait  " & seconde & " secondes "
                        set totsec to totsec + seconde as string
                        -- fait total general
                        set tsecg to tsecg + seconde
                        my ecriture(lefichier, seconde, lataille) --appel pour ecriture dans fichier texte du fichier
                       
                    end if
                   
                end try
            end tell
        end repeat -- fichier suivant
        if totsec > 0 then
            my total(nomdos, totsec, un_dossier) --appel pour ecriture dans fichier texte total dossier si supérieur à 0
        end if
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter
 

igorbatchev

Membre confirmé
22 Novembre 2009
220
1
et la fin :

Bloc de code:
on ecriture(nom, secondes, lataille)
    -- calcule le temps total heure-minutes-secondes et Ecrit dans la fichier texte le nom + tabulation  + la durée
    set heure to secondes div 3600 as string
    set minute to secondes mod 3600 div 60 as string
    set seconde to secondes mod 60 as string
   
    set lataille to (round lataille / 10000 rounding down) / 100 -- la taille en Mo et 2 chiffres representatifs apres la virgule
   
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write nom & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec " & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture

on total(nomdos, totsec, un_dossier)
    -- idem écriture pour les dossiers
    set un_dossier to un_dossier as string
    set infoRec to info for file un_dossier -- recupère la taille du dossier en octets
    set lataille to size of infoRec
   
    set lataille to (round lataille / 10000 rounding down) / 100 -- la taille en Mo et 2 chiffres representatifs apres la virgule
   
   
    -- calcule le temps total heure-minutes-secondes et ecrit dans fichier texte total dossier+dans fichierprovisoire listh+listmn+listsec
    set heure to totsec div 3600 as string
    set minute to totsec mod 3600 div 60 as string
    set seconde to totsec mod 60 as string
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total dossier " & nomdos & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & (ASCII character 13) & return to lelog starting at eof
    close access lelog
end total

tell application "Finder"
    -- calcule le temps total heure-minutes-secondes
    set heure to tsecg div 3600 as string
    set minute to tsecg mod 3600 div 60 as string
    set seconde to tsecg mod 60 as string
    -- recup de la taille du dossier initial choisi
    set chemin to chemin as string
    set infoRec to info for file chemin
    set lataille to size of infoRec
   
    set lataille to (round lataille / 10000 rounding down) / 100
   
    --Ecrit dans la fichier texte le nom + tabulation  + la durée
    set lelog to open for access ((path to desktop folder as text) & dossier & ".txt") as text with write permission
    write " total général du dossier " & dossier & (ASCII character 9) & heure & " h " & minute & " mn " & seconde & " sec" & (ASCII character 9) & lataille & " Mo" & return to lelog starting at eof
    close access lelog
end tell


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell