IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Modifier le contenu d'un fichier textedit


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Modifier le contenu d'un fichier textedit
    Bonjour à tous,

    Je suis monteur film et formateur au montage. Je rédige un document d'apprentissage pour Final Cut Pro X (FCP X) que je vends sur internet (pour une bien petite somme vu le boulot).

    J'aimerais entrer doucement dans l'écriture de petits scripts pour aider les utilisateur de FCP X à organiser leurs tournages (on appelle cela le dérushage) dans FCP X.
    Pour cela j'aimerais transformer le contenu d'un fichier (au format .fcpxml) qui peut s'ouvrir dans textedit.

    Le but me semble assez simple en soi mais mes connaissances sont très faibles en script et le très gros travail de vulgarisation que j'essaie de mener à propos de FCP X me prends énormément de temps et j'avoue n'avoir plus le courage de me plonger à fond dans un nouvel univers. Je propose à qui voudra bien aider ce petit bidule, une version gratuite de mon document (407 pages pour l'instant) et autant de coups de main sur FCP X qu'il voudra. Il s'agit donc d'un échange, disons.

    Voici l'idée:

    Dans ce fichier qui s'ouvre dans textedit, j'aimerais qu'en dessous de chaque ligne de ce type:

    <rating start="1264126/25s" duration "4000/2500s" name="nom du favoris un" value="favorite" note="*note du favoris un"/>

    le script ajoute à la suite une nouvelle ligne:

    <keyword start="1264126/25s" duration "4000/2500s" value="*" note="*note du favoris un"/>

    Cette ligne supplémentaire est donc une copie modifiée de l'originale où le script aura (dans l'orde d'apparition dans la ligne originale):
    remplacé le mot "rating" par le mot "keyword"
    supprimé la partie name="nom du favoris un"
    remplacé value "favorite" par value "*"

    Précision :
    1. Tout ce qui dans la ligne originale est dans les champs name et note est un texte qui peut varier (c'est du texte entré dans FCP X par l'utilisateur et sensé décrire le nom d'une entité (un favori) et la décrire un peu mieux avec le champ note).
    2. Par ailleurs l'astérisque * pourra parfois être deux ou trois astérisques ( donc ** ou ***) qui se trouveront toujours au début du contenu de la note de la ligne de départ. Ce serait idéal si le script pouvait donc étudier le début du contenu de la note et suivant qu'il trouve une, deux ou trois étoiles, il associe la value "*" ou "**" ou "***".
    3. L'idéal serait que seules les lignes comportant une ou plusieurs astérisques * dans leur champ note soient traitées par le script.
    4. L'idéal serait que l'utilisateur puisse déposer son fichier .fcpxml quelque part, que cela déclenche le script et qu'il puisse récupérer un fichier .fcpxml modifié.

    voili voilà

    Je mets donc cela entre vos mains et si le coeur et le courage vous en dit, je serai ravi de recevoir votre aide. Je sais par ailleurs que les demandes d'un néophytes complet ignorent souvent la quantité de savoir et de boulot que requiert une demande simple d'apparence.

    Merci de votre aide donc. Elle sera utile à la communauté des utilisateur de FCP X.

    bien à vous
    Martin

    PS: je suis matheux de formation donc n'ayez pas peur de la complexité.

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour MartinOsset,
    Gentil petit challenge pour ce week end...

    Pour bien repérer la ligne à dupliquer/changer, quels sont les mots clé à repérer (pour éviter de prendre d'autres types de ligne) ?
    Par exemple est-ce que le fichier ne contient pas d'autres lignes (à ne pas dupliquer) qui commencent aussi par les caractères <rating start =" ?

    Si d'autres lignes, que tu ne souhaites pas dupliquer, peuvent aussi commencer par ces caractères, contiennent-elles aussi " name=" ?
    Tu le comprends, il faux d'abord être certain de trouver une "partern" unique qui garantie que cette ligne et pas une autre peut être traitée.

    Par ailleurs, j'imagine que les contenus entre "" des rating start, duration, name, value et note sont tous variables (d'un point de vue mathématique, je dirai quelconque !)

    Pour le reste, j'hésite entre des commandes replace Unix ou un script.
    - Unix très puissant, très rapide, mais dans ton cas, la syntaxe doit être un peu tordue.
    - AppleScript, plus lent, moins puissant dans les recherche/remplace, mais tellement plus lisible que cela te permettrai de modifier ensuite !

    Je réfléchi et je m'y mets dès que j'ai du temps ce WE... et que j'ai tes réponses !
    Cordialement

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Philippe,

    très gentil à à toi de te pencher sur ce bidule.
    Alors oui ces question me font ajouter une petite précision du coup.

    1. Si on recherche les lignes qui contiennent <rating start=" on tombera sur des lignes qui contiennent la value "favorite" et celle qui ne la contiennent pas.
    Donc en fait il n'y a que les lignes commençant par <rating start=" et qui contiennent la value "favorite" qui seront concernées.
    Et ça serait super si on pouvait épargner celles qui ne contiennent aucune astérisque (ni*, ni **, ni ***) dans note. Mais je ne sais pas si ça complique pas trop le tri.

    Donc en résumé une ligne est à modifier si elle contient <rating start=" et value "favorite" et contienne une astérisque au moins dans note

    2. Pour ce qui est de name= il y a d'autres lignes qui le contiennent et là malheureusement ça poserait problème.

    3. les contenus entre "" des rating start, duration, name, value et note:
    -pour name, note c'est du texte entrée par l'utilisateur dans FCP X qui peut donc être différent selon les lignes.ça peut donc être name "Interview 1 de Jean-Pierre" et note " je bois du café au petit déjeuner "
    -pour duration ça parle de la longueur d'une plage (en nombre d'images) donc ça peut changer pour chaque ligne.
    -pour rating start ça dit à quelle image commence la plage donc ça peut changer pour chaque ligne.
    -pour value,dans la ligne originale c'est toujours "favorite" et ça ne change jamais.
    -par contre le value de la ligne copiée lui peut être ce qu'on veut (ici, on aimerait que ce soit *, ** ou ***, selon ce qu'on trouve dans la note de la ligne originale).

    Pour ce qui est de la vitesse d'execution, si y a 100 lignes à modifier, c'est bien le bout du monde. Je me dis que ça ne dois pas être très long. Je ne me rends pas compte. Et oui, si je peux espérer comprendre vaguement le code c'est mieux mais bon hein faut pas pousser mémé dans les orties !!!

    Bon merci beaucoup Philippe. Il n'y pas d'urgence du tout, donc si il y a du soleil ce week end, il y a surement mieux à faire

    Je reste à dispo si besoin d'autres précisions.

    bon week end

    Martin

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir,
    Lorsque tu lis le fichier text ce doit être avec un read file dans une variable text.
    Tu peux ensuite faire une boucle sur chaque paragraphe.
    Pour cette boucle, tu peux la faire avec le paragraphe I.

    dans l'itération sur le paragraphe I, rien ne t'empêche de lire le paragraphe (I+1) , à condition , bien sûr, qu'il existe !

    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci Philippe,

    c'est exactement ce que le fait de simplement formuler davantage cette question m'a doucement fait comprendre.
    Oui effectivement je comprends que le script que tu m'avais envoyé il y a bien longtemps était en fait en deux temps. Un partie lecture d'un fichier, une autre d'écriture dans un autre. Tout simplement. Donc on peut lire, consigner des choses au fur et à mesure et les donner ensuite à manger au moment de l'écriture.
    Comme quoi on peut faire les chose bêtement sans trop les comprendre.

    Merci à toi Philippe.
    Grâce à toi, je peux facilement modifier des XML de Final Cut Pro X quand le besoin s'en fait sentir
    Bonne continuation
    Martin

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Petite demande
    Bonjour Philippe,
    Il y a bien longtemps

    Je me mets document à Swift mais c'est pas fastoche...
    J'ai posté une petite demande sur le forum dédié à Swift mais j'ai l'impression qu'il n'est pas très fréquenté.

    https://www.developpez.net/forums/d1...le-transposer/

    J'essaie de trouver un point d'entrée dans ce langage... et je peine ;(

    Si vous aviez des pistes, des lien vers lequels me diriger pour lire des programmes simples.... comme vous me l'aviez permis avec Apple Script.... J'ai l'impression que de lire un petit programme m'aide davantage que de lire la doc d'Apple...

    Merci à vous si vous aviez une piste...
    Martin

  7. #7
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour Martin,
    Le script ci-dessous doit répondre à tes souhaits. Il doit être copié/collé dans l'éditeur de script et enregistré en tant qu'application (pas en tant que script !)
    Quelques commentaires :

    Lancement :
    Le programme principal est une sous routine nommé Prog_Principal. Cette routine est appelée par 2 handlers situés au début du script :
    - On run sera utilisé si l'utilisateur double click sur l'application : alors le script demande le nom d'un fichier .fcpxml
    - On Open sera utilisé si l'utilisateur dépose un ou plusieurs fichiers .fcpxml sur l'icône de l'application (traitement par lot possible !)

    Fichier résultat :
    Le fichier modifié est enregistré sous Nom_original_Nouv.fcpxml, dans le même dossier que l'original. J'ai mis des commentaires dans le script si tu veux directement écrire par dessus le fichier initial (lignes 17 à 24).
    Par habitude, je n'aime pas ré-écrire directement. En cas d'erreur, tout est perdu. A toi de voir selon le risque, les sauvegardes,...

    Pour les puristes, ce fichier est un format xml qui aurait aussi pu être traité comme tel par AppleScript. Le passage via un fichier texte n'est en fait pas plus compliqué que de manipuler des propriétés xml, mais peut être plus souples quant aux règles si elles évoluent !

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    on run-- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
        set source to choose file of type {"fcpxml"} with prompt "Sélectionner le fichier .fcpxml à traiter"
    Prog_Principal(source)
    end run
    
    
    on openList_source-- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
        repeat with source in List_source
    Prog_Principal(source)
        end repeat
    end open
    
    
    
    
    on Prog_Principal(source)
    -- extraire son nom, son dossier et ajouter un "_Nouv" dans le nom du fichier modifié pour éviter d'écraser l'existant
    -- cette partie peut être remplacée par un "Set Destination to Source", 
    -- cela écrasera le fichier source avant la fin de l'écriture du fichier destination :c'est plus dangereux, ..mais possible !
        tell application "Finder"
            set Nom to name of source
            set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_Nouv.fcpxml"
            set Destination to ((container of source) as text) & Nouv_Nom
        end tell
        
    -- on défini les constantes de recherche (ascii code 34 est un guillement)
        set Guil to ASCII character 34
        set T_Start to "<rating start=" & Guil
        set T_Favorite to "value=" & Guil & "favorite" & Guil
        set T_Note to "Note="
        
    -- lecture des lignes source
        set Mes_Lignes to paragraphs of (read source)
        
    -- crée le fichier destination et l'ouvre en écriture
        try
    open for accessfileDestination with write permission
        end try
        
    -- boucle sur les lignes
        repeat with Ligne in Mes_Lignes
    -- on réécrit la ligne telle quel
    write (Ligne & return) tofileDestinationstarting ateof
    -- rechercher si la ligne commence par <rating start=" et qui contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
            if (Ligne starts with T_Start) and (Ligne contains T_Favorite) then
    -- recherche le contenu de la note
                set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
                set Asterix to ""
                if P_Note contains "***" then
                    set Asterix to "***"
                else if P_Note contains "**" then
                    set Asterix to "**"
                else if P_Note contains "*" then
                    set Asterix to "*"
                end if
                if Asterix is not "" then
    -- la ligne est bien à dupliquer car Note contient 1,2 ou 3 asterix : <keyword start="xxxx" duration="xxxx" value=" asterix "
                    set Ligne to "<keyword" & (text 8 thru -1 of Ligne)
                    set Ligne to (text 1 thru ((offset of "name=" in Ligne) - 1) of Ligne) & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    write (Ligne & return) tofileDestinationstarting ateof
                end if
            end if
        end repeat
    close accessfileDestination
        display alert "Le fichier " & Nom & " est traité" giving up after 3
    end Prog_Principal
    Cordialement

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Philippe,

    je viens seulement de voir ton message.

    c'est SUPER (le mot est faible) sympa.

    je vais regarder cela de près et cela me motivera joliment pour entrer document dans la programmation en Apple script (on appelle ça comme ça ?). Dans le temps je faisais des maths et j'ai toujours trouvé une poésie propre à ce genre de langage.
    Et tes remarques à propos des fichiers XML, me rappellent cette idée de "beau langage". Je pense qu'effectivement il y a une esthétique du code (sans snobisme s'entend). La "beauté" se loge là où on veut bien la voir.

    je te tiens au courant très rapidement et te remercie encore mille fois.

    (et comme promis, si l'envie d'apprendre ou de conforter tes savoirs sur FCP X te viens, je suis là !!!)

    à tout bientôt donc

    Martin

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    bon à partir de maintenant, toute réponse est optionnelle car je tenterai de chercher par moi même une solution:

    mais je la pose quand même:

    lorsque j'ai copié puis collé le script dans l'application AppelScript et que je l'enregistre sous forme d'application

    j'ai ce message lorsque j'enregistre le script en tant qu'application

    erreur de syntaxe
    «*given*», «*into*», «*with*», «*without*» ou autre nom de paramètre prévu mais fin de ligne trouvé.
    et il surligne la partie qui se trouve juste après on openList_source

    j'ai beau chercher partout, enlever toutes les lignes de commentaire (tout ce que tu as écrit avec deux tiret (--), rien n'y fait.

    Note :
    1. j'ai aussi essayer de passer par Automator pour y inclure un script. Pareil
    2.lorsque je lance l'appui (qui a malgré tout été créée), il me demande si je veux executer. je dis oui, il me propose ensuite de lui fournir un fichier .fcpxml et quand je valide j'ai le message suivant:
    "script" ne comprend pas le message "Prog_Principal"

    je continue mes recherches

    martin

  10. #10
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Désolé Martin de ne pourvoir t'aider, mais je ne me suis pas mis à Swift...
    Compte tenu du succès apparent de ce language, je suis sûr que tu dois pouvoir trouver des forums très actifs à ce sujet.

    Cordialement

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci Philippe pour votre réponse,
    Ce n'est pas bien grave. Je vais finir par trouver un point d'entrée dans la maison Swift... tirer la bonne ficelle pour ensuite tout dérouler.

    Bien à vous et encore merci pour vos précédentes aides.
    Bel été.
    Martin

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Autre petite demande
    Bonjour,

    j'ai un petit souci pour lire un fichier de sous-titrage en .srt

    lorsque j'ouvrais un .fcpxml pour le lire j'utilisais:

    set Bibule to paragraphs of (read LeFichier)

    et ça fonctionnait

    Lorsque je fais la même chose avec un fichier .srt, il m'indique un message me disant qu'on ne peut pas le convertir en "type file"
    Il semble donc qu'il ne parvienne pas à le lire ("read"...)
    Il est vrai que lorsque je fais un clic-droit sur un .fcpxml, le Finder me propose "TextEdit" parmi toutes les applications proposées. Ce n'est pas le cas pour un fichier .srt.
    Pourtant je peux drag-dropper un fichier .srt sur l'icône de l'application TexEdit et il s'ouvre sans souci.

    Pour contourner le problème, j'ai tenté d'abord de renommer le fichier "monfichier.srt" en "monfichier.txt" mais là encore, il ne veut pas "read" ce fichier. Mais surement que de renommer un fichier ne le rend pas plus lisible ?

    J'ai essayé des déclinaisons de type (read LeFichier as unicode "utf-8") (je ne suis plus bien certain du terme mais j'avais trouvé ça lors de mes recherche et l'écriture était bonne)...

    Bref, je ne parviens pas à faire fonctionner "set Bibule to paragraphs of (read LeFichier)"

    Si Philippe tu avais une idée, je te serais fort fort fort reconnaissant...
    Je continue à chercher sur le net.
    Merci merci
    Martin
    PS: je vais poster cela comme nouveau topic aussi...

  13. #13
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir,
    Il faut simplement ajouter un espace entre les mots "open" et "List_source".
    J'ai beau vérifier tout ou presque, depuis le nouveau look de ce forum (par ailleurs mieux que l'ancien !), il y a des bugs lors des copié/collé de scripts avec des espaces perdus ...
    J'ai beau vérifier, j'en oublie !

    Si après cette correction, tu as une autre erreur de compilation, c'est sûrement un autre espace qui s'est joué de ma vigilance.
    Dans le doute, sur le script posté initialement, les mots sont souvent de couleurs différentes (car copiés de l'éditeur de script), ce qui peut aider à voir lorsque des espaces manquent.

    Cordialement

  14. #14
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci beaucoup beaucoup Philippe,

    Effectivement le souci était là. J'aurais beaucoup appris pendant ce temps !!!
    Malgré tout, quoique l'application se lançait alors bien, cela ne modifiait pas les fichier fcpxml.
    J'ai alors fait des tests, en ne gardant que des bouts de code. Pour voir ce qui n'allait pas. Il m'a semblé que cela se passait dans la boucle du premier IF. Comme si le script n'arrivait pas à detecter les étoiles (*). J'ai fini par le réécrire petits bouts par petits bouts (je commence à comprendre).
    J'ai finalement réussi à ce que ça fonctionne même si je pense que c'est du bricolage.
    C'est ici (vous verrez, j'ai entre autre ajouté une variable CROCHET car je pensais que le crochet n'était pas reconnu et je lui est attribué la valeur ASCII 60. Mais en fait ça n'est pas ça. J'ai tout de même laissé. Bricolage !!!)

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    on run -- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
    	set source to choose file of type {"fcpxml"} with prompt "Sélectionner le fichier .fcpxml à traiter"
    	Prog_Principal(source)
    end run
     
    on open List_source -- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
    	repeat with source in List_source
    		Prog_Principal(source)
    	end repeat
    end open
     
    on Prog_Principal(source)
    	-- extraire son nom, son dossier et ajouter un "_Nouv" dans le nom du fichier modifié pour éviter d'écraser l'existant
    	-- cette partie peut être remplacée par un "Set Destination to Source", 
    	-- cela écrasera le fichier source avant la fin de l'écriture du fichier destination :c'est plus dangereux, ..mais possible !
    	tell application "Finder"
    		set Nom to name of source
    		set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_NEW.fcpxml"
    		set Destination to ((container of source) as text) & Nouv_Nom
    	end tell
     
    	-- on défini les constantes de recherche (ascii code 34 est un guillement)
    	set Guil to ASCII character 34
    	set CROCHET to ASCII character 60
    	set T_Start to CROCHET & "rating start=" & Guil
    	set T_Favorite to "value="
    	set T_Note to "note="
    	set T_Name to "name="
    	-- lecture des lignes source
    	set Mes_Lignes to paragraphs of (read source)
     
    	-- crée le fichier destination et l'ouvre en écriture
    	try
    		open for access file Destination with write permission
    	end try
     
    	-- boucle sur les lignes
    	repeat with Ligne in Mes_Lignes
    		-- on réécrit la ligne telle quel
    		write (Ligne & return) to file Destination starting at eof
    		-- rechercher si la ligne commence par <rating start=" et qui contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
    		if (Ligne contains "rating start") and (Ligne contains T_Favorite) then
    			set Asterix to ""
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			if (Ligne contains "name=") then
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Name in Ligne) - 1) of Ligne)
    			else
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Favorite in Ligne) - 1) of Ligne)
    			end if
    			if (P_Note contains "***") then
    				set Asterix to "***"
    			else if (P_Note contains "**") then
    				set Asterix to "**"
    			else if (P_Note contains "*") then
    				set Asterix to "*"
    			end if
    			if Asterix is not "" then
    				set Ligne to CROCHET & "keyword start=" & P_Start & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
    	end repeat
    	close access file Destination
    	display alert "your NEW fcpxml is ready" giving up after 3
    end Prog_Principal
    J'aimerais maintenant ajouter deux actions.
    la premiere
    Le but est de :
    1. repérer toutes les lignes commençant par "</event>"
    2.insérer 3 lignes juste avant
    3a. écrire "<keyword-collection name="*"/>" dans la premiere
    3b. écrire "<keyword-collection name="**"/>" dans la seconde
    3c. écrire "<keyword-collection name="***"/>" dans la troisième

    pour celle là je ne sais pas comment:
    1. insérer un ligne au dessus d'une ligne repérée (la ligne qui commence par </event>)
    1. insérer après une seconde ligne puis une troisieme.

    la seconde :
    Le but est de :
    premier partie:
    1. rechercher d'autres types de lignes en cherchant d'abord les lignes qui commence par "<clip name=".
    2. inspecter ce qu'il y a après "clip name=" dans la ligne pour voir si il y a les mots ITW, ILL, LIVE ou encore AMB.
    3. dans ce cas je crée une variable P_ROLL qui selon les cas prendre l'une de ces 4 valuers (ITW, LIVE...)
    4. ensuite l'idée est de placer a la fin de la ligne les mots "role=video." & P_ROLL & ">"
    seconde partie (en option):
    5. inspecter la PREMIER ligne suivante qui comporterait "<audio name=" en son début
    6. à la fin de de cette ligne repérée placer les mots "role=audio." & P_ROLL & ">"

    pour la premiere partie de celle-ci :
    j'ai essayé d'ajouter ce code en transformant
    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
    18
    19
    20
    if (Ligne contains "rating start") and (Ligne contains T_Favorite) then
    			set Asterix to ""
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			if (Ligne contains "name=") then
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Name in Ligne) - 1) of Ligne)
    			else
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Favorite in Ligne) - 1) of Ligne)
    			end if
    			if (P_Note contains "***") then
    				set Asterix to "***"
    			else if (P_Note contains "**") then
    				set Asterix to "**"
    			else if (P_Note contains "*") then
    				set Asterix to "*"
    			end if
    			if Asterix is not "" then
    				set Ligne to CROCHET & "keyword start=" & P_Start & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
    en ceci

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    	if (Ligne starts with T_CLIP) then
    			set P_ROLE to ""
    			if (Ligne contains T_INTERVIEW) then
    				set P_ROLE to T_INTERVIEW
    			else if (Ligne contains T_ILLUSTRATION) then
    				set P_ROLE to T_ILLUSTRATION
    			else if (Ligne contains T_AMBIANCES) then
    				set P_ROLE to T_AMBIANCES
    			else if (Ligne contains T_LIVE) then
    				set P_ROLE to T_LIVE
    			end if
    			if P_ROLE is not "" then
    				set Ligne to (text 1 thru -1 of Ligne) & T_ROLE & "video." & P_ROLE & Guil & ">"
    			end if
    		else if (Ligne starts with T_Start) and (Ligne contains T_Favorite) then
    			-- recherche le contenu de la note
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			set Asterix to ""
    			if P_Note contains "***" then
    				set Asterix to "***"
    				set memAsterix to Asterix
    			else if P_Note contains "**" then
    				set Asterix to "**"
    				set memAsterix to Asterix
    			else if P_Note contains "*" then
    				set Asterix to "*"
    				set memAsterix to Asterix
    			end if
    			if Asterix is not "" then
    				-- la ligne est bien à dupliquer car Note contient 1,2 ou 3 asterix : <keyword start="xxxx" duration="xxxx" value=" asterix "
    				set Ligne to "<keyword" & (text 8 thru -1 of Ligne)
    				set Ligne to (text 1 thru ((offset of "name=" in Ligne) - 1) of Ligne) & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
     
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
     
    	end repeat
    ce qui donnerait avec les variables supplémentaires que j'ai ajouté en amont

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    on run -- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
    	set source to choose file of type {"fcpxml"} with prompt "Sélectionner le fichier .fcpxml à traiter"
    	Prog_Principal(source)
    end run
     
    on open List_source -- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
    	repeat with source in List_source
    		Prog_Principal(source)
    	end repeat
    end open
     
    on Prog_Principal(source)
    	-- extraire son nom, son dossier et ajouter un "_Nouv" dans le nom du fichier modifié pour éviter d'écraser l'existant
    	-- cette partie peut être remplacée par un "Set Destination to Source", 
    	-- cela écrasera le fichier source avant la fin de l'écriture du fichier destination :c'est plus dangereux, ..mais possible !
    	tell application "Finder"
    		set Nom to name of source
    		set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_Nouv.fcpxml"
    		set Destination to ((container of source) as text) & Nouv_Nom
    	end tell
     
    	-- on défini les constantes de recherche (ascii code 34 est un guillement)
    	set Guil to ASCII character 34
    	set T_Start to "<rating start=" & Guil
    	set T_Favorite to "value=" & Guil & "favorite" & Guil
    	set T_Note to "Note="
    	set memAsterix to ""
    	-- lecture des lignes source
    	set Mes_Lignes to paragraphs of (read source)
    	set T_INTERVIEW to "ITW"
    	set T_AMBIANCES to "AMB"
    	set T_ILLSUTRATION to "ILL"
    	set T_LIVE to "LIVE"
    	set T_CLIP to "<clip name=" & Guil
    	set T_DURATION to "duration="
    	set T_ROLE to "role=" & Guil
    	-- crée le fichier destination et l'ouvre en écriture
    	try
    		open for access file Destination with write permission
    	end try
     
    	-- boucle sur les lignes
    	repeat with Ligne in Mes_Lignes
    		-- on réécrit la ligne telle quel
    		write (Ligne & return) to file Destination starting at eof
    		-- rechercher si la ligne commence par <rating start=" et qui contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
    		if (Ligne starts with T_CLIP) then
    			set P_ROLE to ""
    			if (Ligne contains T_INTERVIEW) then
    				set P_ROLE to T_INTERVIEW
    			else if (Ligne contains T_ILLUSTRATION) then
    				set P_ROLE to T_ILLUSTRATION
    			else if (Ligne contains T_AMBIANCES) then
    				set P_ROLE to T_AMBIANCES
    			else if (Ligne contains T_LIVE) then
    				set P_ROLE to T_LIVE
    			end if
    			if P_ROLE is not "" then
    				set Ligne to (text 1 thru -1 of Ligne) & T_ROLE & "video." & P_ROLE & Guil & ">"
    			end if
    		else if (Ligne starts with T_Start) and (Ligne contains T_Favorite) then
    			-- recherche le contenu de la note
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			set Asterix to ""
    			if P_Note contains "***" then
    				set Asterix to "***"
    				set memAsterix to Asterix
    			else if P_Note contains "**" then
    				set Asterix to "**"
    				set memAsterix to Asterix
    			else if P_Note contains "*" then
    				set Asterix to "*"
    				set memAsterix to Asterix
    			end if
    			if Asterix is not "" then
    				-- la ligne est bien à dupliquer car Note contient 1,2 ou 3 asterix : <keyword start="xxxx" duration="xxxx" value=" asterix "
    				set Ligne to "<keyword" & (text 8 thru -1 of Ligne)
    				set Ligne to (text 1 thru ((offset of "name=" in Ligne) - 1) of Ligne) & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
     
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
     
    	end repeat
     
    	close access file Destination
    	display alert "your new fcpxlm files " & Nom & memAsterix & "is ok" giving up after 3
    end Prog_Principal
    en fait plutôt que ressayer de faire cela dans le m^me mouvement (scan progressif des lignes du fichier) j'aimerais le faire en 3 petits PROGRAMMES. A la fin du premier PROGRAMME, on remonterait au début du fichier et on lancerait le second et ensuite pareil avec le troisième. Ce serait moins compliqué pour moi, même si c'est moins joli et conduit surement à une analyse plus longue. Cela me permettrait aussi dev kir les bout de scripts qui ne marchent pas.

    Je me demandais d'ailleurs si je n'allais pas passer par automator en procédant ainsi

    Etape 1: Premier script (celui que vous m'avez gentiment transmis)
    Etape 2: Action Automator: on réouvre le nouveau fichier .fcpxml et on le transmet au script suivant (je n'arrive pas à trouver le module de automator qui permette de réouvrir ce fichier et de le livrer au script suivant, mais peut-être que ça peut être un petit script)
    Etape 3: second script (ajouter les 3 lignes "<keyword-collection name="*"/>", "<keyword-collection name="**"/>" et "<keyword-collection name="***"/>" avant la ligne </event>
    Etape 4: Action Automator: on réouvre le nouveau fichier .fcpxml et on le transmet au script suivant.
    Etape 5: troisième script (ajouter les mots "role=video." & P_ROLL & ">" à la fin des ligne commençant par "<clip name=")+ en option ((ajouter les mots "role=audio." & P_ROLL & ">" à la fin des ligne commençant par "<audio name=")

    voilà où j'en suis
    je continue mes recherches

    merci encore mille fois (je ne vous en voudrez pas du tout si vous ne répondez pas à ce message, EVIDEMENT)

    Martin

  15. #15
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir Martin,
    Je pense que le problème vient de ta variable LeFichier.
    En effet, la fonction "read" demande un fichier comme paramètre et non pas une string.

    Par exemple le script ci-dessous donne une erreur "impossible de convertir en type file" car F est une string et pas un alias vers un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set Fstring to "Users:imac27:Desktop:Expert.srt"
    set Liste to paragraphs of (read Fstring)
    Par contre le script ci-dessous fonctionne parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set Fstring to "Users:imac27:Desktop:Expert.srt"
    set Liste to paragraphs of (read file Fstring)
    La différence est le mot "file" qui convertie la string F en alias vers un fichier.

    Enfin, dans le cas ci-dessous, la variable F est directement un alias donc le mot "file" n'est pas nécessaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set F to choose file "Sélectionner un fichier srt"
    set Liste to paragraphs of (read F)
    Cordialement

  16. #16
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Merci Philippe
    Merci Philippe, je comprends mieux du coup.
    Par contre en suivant une logique qui 'avait semblé proche de ce tu proposais (il y a longtemps !!), j'avais besoin d'appeler un dossier contenant plusieurs fichier .srt
    Donc je commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     on run
    set source to choose file of type {fcpxml} with prompt " sélectionner le fichier .fcpxml à croiser avec les .srt"
    set sourceFolder to choose folder with prompt " sélectionner le dossier contenant les fichier .srt"
    Prog_Principal (source,sourceFolder)
    end run
    ensuite au début du Programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     set Mes_lignes to paragraphs of (read source)
    tell application "Finder"
    set Mes_Srt to every file of the sourceFolder
    end tell
    (j'ai ajouté un tell application "Finder" car ça ne marche pas sinon)

    plus tard dans le programme et lorsque je commence à avoir besoin de lire un .srt.
    J'ai d'abord besoin d'extraire le nom du .srt pour le comparer à un plan qui a (presque) le même nom dans le .fcpxml. donc je commence a extraire une partie du nom du sit pour pouvoir le comparer à celui de ce plan. Ici les srt on des noms de type "20170925-NOMDONNE.srt" tandis que les plans ont des noms de type "NOMDONNE". Donc il me faut extraire "NOMDONNE" du nom du .srt...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat with Le_Srt in Mes_Srt
    set Name_Srt to name of Le_Srt
    set Nom_Du_Srt to (text((offset of "-" in Name_Srt) +1) thru ((length of Name_Srt) - 4) of Name_Srt)
    et là ça coince parce qu'il n'arrive pas à lire le nom du fichier Le_Srt (pourtant un moment ça marchait !!!). Donc quand ça marchait, je pouvait comparer avec le nom du plan trouvé dans le .fcpxml (variable "P_NamClip" dans le code en dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Nom_Du_Srt = P_NameClip then
    set Mes_LignesSrt to paragraphs of (read file Le_Srt)
    J'ai donc ajouté comme tu le dis le "file" dans (read file Le_Srt) mais ça ne fonctionne pas ... ( j'ai débrayer le if et la ligne ( set Name_Srt to name of Le_Srt) qui par ailleurs coince...
    automator me dit
    " Il est impossible de rendre "class docf" "201105525-AAAO4325.srt" of "class cfol" "NOM DU DOSSIER" of "class cofl" "NOMDUDISQUEDUR" of application "Finder" dans le type attendu"
    Mais je suis en effet aussi perdu lorsqu'il s'agit ou pas d'appeler le "FINDER"... bon ;(

    Daprès ce que tu évoque et qui est très parlant, il doit être question de définition au départ puis le long du programme... un string ou une file !!! Et mes lignes doivent tout mélanger... ;(

    bon, je continue à tester...

  17. #17
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    j'ai modifié un peu ma réponse : je ne "change" pas le nom du .srt, je l'extrais !!!

    Citation Envoyé par MartinOsset Voir le message
    Merci Philippe, je comprends mieux du coup.
    Par contre en suivant une logique qui 'avait semblé proche de ce tu proposais (il y a longtemps !!), j'avais besoin d'appeler un dossier contenant plusieurs fichier .srt
    Donc je commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     on run
    set source to choose file of type {fcpxml} with prompt " sélectionner le fichier .fcpxml à croiser avec les .srt"
    set sourceFolder to choose folder with prompt " sélectionner le dossier contenant les fichier .srt"
    Prog_Principal (source,sourceFolder)
    end run
    ensuite au début du Programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     set Mes_lignes to paragraphs of (read source)
    tell application "Finder"
    set Mes_Srt to every file of the sourceFolder
    end tell
    (j'ai ajouté un tell application "Finder" car ça ne marche pas sinon)

    plus tard dans le programme et lorsque je commence à avoir besoin de lire un .srt.
    J'ai d'abord besoin d'extraire le nom du .srt pour le comparer à un plan qui a (presque) le même nom dans le .fcpxml. donc je commence a extraire une partie du nom du sit pour pouvoir le comparer à celui de ce plan. Ici les srt on des noms de type "20170925-NOMDONNE.srt" tandis que les plans ont des noms de type "NOMDONNE". Donc il me faut extraire "NOMDONNE" du nom du .srt...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat with Le_Srt in Mes_Srt
    set Name_Srt to name of Le_Srt
    set Nom_Du_Srt to (text((offset of "-" in Name_Srt) +1) thru ((length of Name_Srt) - 4) of Name_Srt)
    et là ça coince parce qu'il n'arrive pas à lire le nom du fichier Le_Srt (pourtant un moment ça marchait !!!). Donc quand ça marchait, je pouvait comparer avec le nom du plan trouvé dans le .fcpxml (variable "P_NamClip" dans le code en dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Nom_Du_Srt = P_NameClip then
    set Mes_LignesSrt to paragraphs of (read file Le_Srt)
    J'ai donc ajouté comme tu le dis le "file" dans (read file Le_Srt) mais ça ne fonctionne pas ... ( j'ai débrayer le if et la ligne ( set Name_Srt to name of Le_Srt) qui par ailleurs coince...
    automator me dit
    " Il est impossible de rendre "class docf" "201105525-AAAO4325.srt" of "class cfol" "NOM DU DOSSIER" of "class cofl" "NOMDUDISQUEDUR" of application "Finder" dans le type attendu"
    Mais je suis en effet aussi perdu lorsqu'il s'agit ou pas d'appeler le "FINDER"... bon ;(

    Daprès ce que tu évoque et qui est très parlant, il doit être question de définition au départ puis le long du programme... un string ou une file !!! Et mes lignes doivent tout mélanger... ;(

    bon, je continue à tester...

  18. #18
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour Martin,
    Je ne suis pas certain que la variable Crochet "<" apporte un plus, mais pas de souci, le but est que cela fonctionne avec les corrections que tu as faites !
    Je vois cependant dans ta correction que tu cherches maintenant les lignes avec "rating start" et "value=" et pas "value="favorite"". J'ai du mal interpréter.


    Petite remarque en passant : le dernier display Alert est en anglais et la sélection du fichier au début est en français. Fromage ou dessert ? j'ai mis le premier dans la langue de Shakespeare.


    Si tu veux tester les lignes </Event> pas de problème tout peut se faire. C'est aussi une raison pour laquelle j'ai préféré faire cela en texte car je m'attendais à des extensions ! Idem pour les lignes avec "<clip name=" et "<audio name".

    Je n'aime pas ton idée de passe multiples .
    Certes il est possible de lancer un script à partir d'un autre ou à partir d'Automator (quel est l'intérêt ici d'ajouter Automator ?), cependant, pour une meilleure lecture et maintenance du code, je suggère de passer par des sous routines pour chaque type de ligne... ce sera plus lisible: une sous routine pour traiter les rating start, une pour les </event>, une pour les <clip name=" , etc ... en attendant qu'il y en aie d'autres !!

    Cela implique cependant de bien transmettre les variables adéquates à chaque routine et de laisser les autres en local, à l'exception de Guil et Crochet.
    L'avantage est que tu peux pousser plus loin les possibilités, car avec des sous routines, celles-ci peuvent aussi appeler des modules externes (d'autres scripts) qui sont assignés chacun à une tâche particulière.
    J'ai repris ton script en le transformant avec les 4 sous-routines ( tu pourrais en ajouter d'autres) :
    Je précise que j'ai supprimé les variables T_CLIP et T_Duration car elles ne semblent pas utiles

    (j'ai beau ajouter l'espace après open à la main, il est systématiquement supprimé lorsque je fais une prévisualisation du message !!! pense à le rajouter
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    global Guil
    global CROCHET
    
    
    on run-- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
        set source to choose file of type {"fcpxml"} with prompt "Select the file .fcpxml to process :"
    Prog_Principal(source)
    end run
    
    
    on openList_source-- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
        repeat with source in List_source
    Prog_Principal(source)
        end repeat
    end open
    
    
    on Prog_Principal(source)
    -- extraire son nom, son dossier et ajouter un "_New" dans le nom du fichier modifié pour éviter d'écraser l'existant
        tell application "Finder"
            set Nom to name of source
            set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_NEW.fcpxml"
            set Destination to ((container of source) as text) & Nouv_Nom
        end tell
        
    -- Initialisation des variables 
        set Guil to ASCII character 34 -- 34 est un guillement
        set CROCHET to ASCII character 60 -- 60 est un chevron <
        set P_ROLE to ""
        
        set Mes_Lignes to paragraphs of (readsource) -- lecture des lignes source
        try
    open for accessfileDestination with write permission-- crée le fichier destination et l'ouvre en écriture
        end try
        repeat with La_Ligne in Mes_Lignes-- boucle sur les lignes du fichier
            if (La_Ligne starts with "<rating start") then
    L_Rating(La_Ligne, Destination)
            else if La_Ligne starts with "</event>" then
    L_Events(La_Ligne, Destination)
            else if La_Ligne starts with "<clip name=" then
                set P_Roll to L_Clip_Name(La_Ligne, Destination)
            else if (L_Ligne starts with "<Audioname=") and (P_Roll is not "") then
    L_Audio_Name(La_Ligne, Destination, P_ROLE)
                set P_ROLE to ""
            end if
        end repeat
    close accessfileDestination
        display alert "your NEW fcpxml is ready" giving up after 3
    end Prog_Principal
    
    
    
    
    -- ********************************* traite les lignes commençant par "raiting start"
    on L_Rating_Start(Ligne, Fichier)
        set T_Start to CROCHET & "rating start=" & Guil
        set T_Favorite to "value="
        set T_Note to "note="
        set T_Name to "name="
    write (Ligne & return) tofileFichierstarting ateof-- on réécrit en premier la ligne telle qu'elle est
    -- rechercher si la ligne contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
        if (Ligne contains T_Favorite) then
            set Asterix to ""
            set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
            if (Ligne contains "name=") then
                set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Name in Ligne) - 1) of Ligne)
            else
                set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Favorite in Ligne) - 1) of Ligne)
            end if
            if (P_Note contains "***") then
                set Asterix to "***"
            else if (P_Note contains "**") then
                set Asterix to "**"
            else if (P_Note contains "*") then
                set Asterix to "*"
            end if
            if Asterix is not "" then
                set Ligne to CROCHET & "keyword start=" & P_Start & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    write (Ligne & return) tofileFichierstarting ateof
            end if
        end if
    end L_Rating_Start
    
    
    -- ********************************* traite les lignes commençant par "</event>" en écrivant d'abord 3 lignes différentes, puis la ligne elle-même
    on L_Events(Ligne, Fichier)
        set L_Key to "<keyword-collection name=" & Guil & "*" & Guil & "/>"
    write (L_Key & return) tofileFichierstarting ateof
        set L_Key to "<keyword-collection name=" & Guil & "**" & Guil & "/>"
    write (L_Key & return) tofileFichierstarting ateof
        set L_Key to "<keyword-collection name=" & Guil & "**" & Guil & "/>"
    write (L_Key & return) tofileFichierstarting ateof
    write (Ligne & return) tofileFichierstarting ateof
    end L_Events
    
    
    -- ********************************* traite les lignes començant par "<clip name=" : les écrit en extrayant le code P_Role si il existe
    on L_Clip_Name(Ligne, Fichier)
        set T_INTERVIEW to "ITW"
        set T_AMBIANCES to "AMB"
        set T_ILLSUTRATION to "ILL"
        set T_LIVE to "LIVE"
        set L_P_ROLE to ""
        if (Ligne contains T_INTERVIEW) then
            set L_P_ROLE to T_INTERVIEW
        else if (Ligne contains T_ILLUSTRATION) then
            set L_P_ROLE to T_ILLUSTRATION
        else if (Ligne contains T_AMBIANCES) then
            set L_P_ROLE to T_AMBIANCES
        else if (Ligne contains T_LIVE) then
            set L_P_ROLE to T_LIVE
        end if
    write (Ligne & return) tofileFichierstarting ateof
        return L_P_ROLE-- renvoie la valeur L_P_Role (ITW, LIVE,ILL,AMB)
    end L_Clip_Name
    
    
    -- ********************************* traite les lignes commençant par <audio name= et ajoute à la fin "role=audio." & L_P_Roll & >
    on L_Audio_Name(Ligne, Fichier, L_P_ROLE)
        set T_ROLE to "role=" & Guil
        set Ligne to (text 1 thru -1 of Ligne) & T_ROLE & "video." & L_P_ROLE & Guil & ">"
    write (Ligne & return) tofileFichierstarting ateof
    end L_Audio_Name
    Cordialement

  19. #19
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci beaucoup Philippe

    avec votre aide et une presque une nuit blanche, je retrouve les vieux automatismes du Pascal quand il fallait diagonaliser des matrices. il y a 20 ans !!!

    avec ce code-ci, je crois que j'ai vraiment de quoi faire. je vais étudier tout cela.

    bon Philippe, un grand grand merci pour cet accompagnement. J'ai l'impression d'être une petite barque perdue dans l'océan qui a eu la chance de rencontrer le secours d'une fière esquife.
    Je vais pouvoir vous laisser à vos grandes pêches arctiques.

    merci à vous

    et ma proposition tiens toujours

    bien à vous

    Martin

  20. #20
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Voilà,

    ça marche. Il manquait une petite ligne pour reconduire les lignes pas traitées (à moins que je l'ai enlevé sans faire exprès)
    Je vais ajouter une routine supplémentaire pour ajouter cette fois ce qu'on appelle dans FCP X des Marqueurs

    Donc à partir du Nom du plan, du nom du Favoris et de sa Note, on pourra créer
    des mots clés
    des Rôles
    des Marqueurs

    Maintenant je travaille à une petite fenêtre de départ pour pouvoir:
    1. cocher ce qu'on veut obtenir (Mots-Clés, Rôles, Marqueurs)
    2. préciser si on veut garder les Favoris ou les supprimer
    3. définir le signe utilisé pour donner des notes aux plans (jusqu'ici c'était *)
    4. définir le nombre de niveaux possibles ( 4 signifierait qu'on peut avoir jusqu'à 4 signes: *,**,***,****)
    5. indiquer les abréviations qu'on utilise dans le codage des Interviex, Live, Ambiance etc...
    6. enregistrer ses propres réglages pour ne pas avoir à les refaire à chaque fois.

    donc le menu ressemblera à ça
    Nom : MENU BOOMERANG.jpg
Affichages : 2258
Taille : 272,8 Ko

    Donc je vais
    1.ajouter un routine pour écrire une ligne ajoutant un marqueur à l'endroit du favoris
    2.créer une variable booléen pour chaque case coché dans la première partie du menu
    3.créer une variable pour le singe utilisé
    4.créer une variable pour le nombre de niveau possible à chercher
    5.créer un variable pour chaque champ d'abréviation
    6.créer une variable qui recueillera les choix de l'utilisateur pour pouvoir les conserver quelque part (surement qu'il est possible de créer des variables à plusieurs entrée (genre ChoixUtil(oui,non,non,oui,*,3,ITW,AMB,ILL,...))
    7. créer un menu genre questionnaire.

    voili voilà

    en tout cas je suis super content parce que je crois que ça va être une application très utiles pour les monteurs film.
    J'aimerais Philippe savoir comment je peux te siter. Un site internet, un compte Facebook, twiter etc...?
    Je pense que c'est important. Pour moi en tout cas, ça l'est.

    Martin

Discussions similaires

  1. Modifier le contenu d'un fichier PDF en PHP
    Par Ghunter59 dans le forum Langage
    Réponses: 6
    Dernier message: 17/03/2020, 13h27
  2. Modifier le contenu d'un fichier
    Par karim_usthb dans le forum C
    Réponses: 2
    Dernier message: 28/05/2008, 09h42
  3. Modifier le contenu d'un fichier
    Par sconrad dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2008, 17h00
  4. modifier le contenu d'un fichier
    Par progamer54 dans le forum ANT
    Réponses: 1
    Dernier message: 06/12/2007, 11h31
  5. Modifier le contenu d'un fichier
    Par Core8 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/01/2007, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo