Bonjour et merci par avance pour vos lumières,
Je suis en train de terminer une petite application et j'ai un petit souci pour demander à mon script de lire (read) un fichier en lui fournissant son chemin.
Je résume :
etape 1
J'extrais un chemin d'un fichier XML :
"file:///Users/samysamy/Desktop/DossierTemporaire/a%CC%80_A%CC%80_A%CC%82_%C3%A6_%C3%86_e%CC%81_E%CC%81_e%CC%80_E%CC%80_e%CC%82_E%CC%82_e%CC%88_E%CC%88_i%CC%82_I%CC%82_I%CC%80_I%CC%88_%C5%93_o%CC%82_O%CC%82_O%CC%80_u%CC%80_U%CC%80_c%CC%A7_C%CC%A7_%3F_!_%E2%82%AC_$_&.mov"
etape 2
Je passe ce chemin à la moulinette d'une petite routine replace_chars pour en récupérer les bons caractères et une autre pour supprimer les 8 premiers caractères (i.e "file:///)
J'obtiens le string : Users/samysamy/Desktop/DossierTemporaire/à_À_Â_æ_Æ_é_É_è_È_ê_Ê_ë_Ë_î_Î_Ì_Ï_œ_ô_Ô_Ò_ù_Ù_ç_Ç_?_!_€_$_&.mov
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 repeat with k from 1 to (count of ListChar) set thePath to replace_chars(thePath, item k of ListChar, item k of ListCharEqui) end repeat set thePathTerminal to thePath set thePath to (text 9 thru (length of thePath) in thePath)
Il servira à l'étape 4
etape 3
Je fabrique deux chemins qui serviront au Terminal et au programme un peu plus tard.
Note : theDate est une string fabrique avant à partir de la date et l'heure actuelle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 set LCheminTXTTerminal to SingleGuil & "desktop/Silence" & theDate & ".txt" & SingleGuil set LCheminTXTFinder to (":Desktop:Silence" & theDate & ".txt") as string
etape 4
Je fabrique un ligne de commande qui sera livrée juste après au Terminal
etape 5
Code : Sélectionner tout - Visualiser dans une fenêtre à part set LigneCommande to " ffmpeg -i " & SingleGuil & thePathTerminal & SingleGuil & " -af silencedetect=n=" & R_dBMin & "dB:d=" & R_DurMin & " -f s16le -y /dev/null 2>&1 | tee " & LCheminTXTTerminal
J'execute une petite routine pour lancer la commande dans le Terminal
Et cela fonctionne car j'obtiens bien un petit fichier .txt placé sur le bureau. Il est nourri comme je le voudrais (par le contenu de la fenêtre du Terminal grâce à la commande "tee").
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 tell application "Terminal" do script LigneCommande end tell
La commande a demandé au Terminal d'analyser un fichier audio/video et de repérer les parties du fichier dont le volume est inférieur à la valeur R_dBMin entrée par l'utilisateur du programme et qui dure plus de R_DurMin seconde. Tout cela est donc ensuite écrit dans le fichier .txt en question...
JUSQU'ICI TOUT VA BIEN
etape 6
Comme je ne sais pas trop faire autrement et que je veux attendre que le Terminal ait fini sa tâche puis nourri ce fichier .txt, je lance une boucle qui voudrait, toutes les secondes, compter le nombre de lignes du fichier .txt. J'en profite à chaque test pour récupérer ces lignes dans une variable LMes_LignesTXT que je traiterais plus tard.
Lorsque le nombre de lignes ne croît plus, la routine se termine et devrait donc livrer ce texte LMes_LignesTXT.
Note: le plus souvent le Terminal met moins de 2 ou 3 secondes pour accomplir sa tâche. Même sur de très longs fichiers vidéo/audio
MAIS MAIS MAIS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 repeat while TAcheEnCours delay 1 set LsourceTXT to LCheminTXTFinder as file set LMes_LignesTXT to paragraphs of (read LsourceTXT) if (count of LMes_LignesTXT) > n then set n to (count of LMes_LignesTXT) else set TAcheEnCours to false tell application "Terminal" quit end tell exit repeat end if end repeat set TAcheEnCours to true return LMes_LignesTXT
Automator annonce une erreur. Il n'y arrive pas avec cette partie
Et je pense qu'il y a soit un problème pour convertir cette string en chemin de fichier (en "file") soit que commencer le chemin par desktop n'est pas suffisant pour lui et qu'il lui faudrait peut être "DisqueDeDépart:Utilisateur" avant...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 set LsourceTXT to LCheminTXTFinder as file set LMes_LignesTXT to paragraphs of (read LsourceTXT)
Donc je me demande comment faire pour que ce chemin puisse être lu et converti en ... LMes_LignesTXT exploitables ensuite !!!
Questions subsidiaires
Ce programme est un peu tordu ..
Question 1 :
Je suis certain qu'au lieu de lancer le Terminal, je pourrais utiliser un Do Shell Script avec la même commande... mais il semble que
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part do shell script LigneCommande
Ne fonctionne pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 tell application "Terminal" do script LigneCommande end tell
Il doit falloir écrire la commande autrement.
Question 2 :
Au lieu d'écrire un fichier texte pour ensuite en récupérer le contenu, je suis certain que je pourrais remplacer la commande "tee" du Terminal par un truc du genre "transfert le contenu de la fenêtre du terminal dans une variable que je peux récupérer dans le programme...
C'est sauf que je ne sais pas faire vu que je n'y connais rien en commande du Terminale!!!
Merci pour votre éventuelle aide pour le nul que je suis... et qui malheureusement n'a pas d'autre connaissance que l'AppleScript (et encore, comme on peut le voir ici...)
Voici un lien vers ce que l'application fait :
https://vimeo.com/415340397/f28424553d
Partager