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 :

Decouper un texte en plusieurs morceaux et les afficher successivement


Sujet :

AppleScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Decouper un texte en plusieurs morceaux et les afficher successivement
    Bonjour à tous!

    Je suis en train d'écrire un script mais je bloque.

    Le script doit
    -Récupérer les paroles de la chanson (sure fichier de la chanson, pas sur le Web) en cours de lecture dans iTunes.
    -Restituer les retours de ligne
    -Élaguer les 10 premières lignes
    -Découper le texte en plusieurs blocs de 15 lignes
    -Afficher les blocs au fur et à mesure que la chanson est lue par iTunes (le script va etre utilisé ensuite avec GeekTool, qui s'occupera d'afficher les blocs sur le bureau de l'ordinateur)


    Le script que j'ai bricolé compile et fonctionne partiellement mais ne fonctionne pas avec les textes de plus de 55 lignes.. J'ai tenté de le recopier ici avec les style de Applescript, sans succès, il est beaucoup plus lisible une fois compilé.

    Je suis certain qu'il ne manque que quelques détails et je vous serais reconnaissant d'y jeter un coup d'oeil et éventuellement me dire ce qui ne va pas dans ce script.

    Merci infiniment pour votre temps et vos conseils.



    on run
    set info to ""
    tell application "System Events"
    set runCount to count (every process whose name is "iTunes")
    end tell
    if runCount > 0 then
    tell application "iTunes"
    if player state is playing then

    set _lyrics to lyrics of current track
    set timetotal to duration of current track
    set midtime to timetotal / 2
    set thirdtime to timetotal / 3
    set quartertime to timetotal / 4
    set par_count to (count paragraphs in _lyrics)
    set AppleScript's text item delimiters to return



    if par_count ≤ 25 then
    set fParagraphs1 to paragraphs 9 thru -1 of _lyrics
    end if



    if par_count > 25 and par_count ≤ 40 then
    set fParagraphs1 to paragraphs 9 thru 25 of _lyrics
    set fParagraphs2 to paragraphs 26 thru -1 of _lyrics
    set fContentsNew1 to fParagraphs1 as string
    set fContentsNew2 to fParagraphs2 as string

    if player position ≤ midtime then
    set info to fContentsNew1 as string
    else
    set info to fContentsNew2 as string
    end if

    end if



    if par_count > 40 and par_count ≤ 55 then
    set fParagraphs1 to paragraphs 9 thru 25 of _lyrics
    set fParagraphs2 to paragraphs 26 thru 40 of _lyrics
    set fParagraphs3 to paragraphs 41 thru -1 of _lyrics
    set fContentsNew1 to fParagraphs1 as string
    set fContentsNew2 to fParagraphs2 as string
    set fContentsNew3 to fParagraphs3 as string


    if player position ≤ thirdtime then
    set info to fContentsNew1 as string
    else if player position > thirdtime and player position ≤ thirdtime * 2 then
    set info to fContentsNew2 as string
    else if player position > thirdtime * 2 then
    set info to fContentsNew3 as string
    end if

    end if
    end if




    if par_count > 55 then
    set fParagraphs1 to paragraphs 9 thru 25 of _lyrics
    set fParagraphs2 to paragraphs 26 thru 40 of _lyrics
    set fParagraphs3 to paragraphs 41 thru 55 of _lyrics
    set fParagraphs4 to paragraphs 56 thru -1 of _lyrics
    set fContentsNew1 to fParagraphs1 as string
    set fContentsNew2 to fParagraphs2 as string
    set fContentsNew3 to fParagraphs3 as string
    set fContentsNew4 to fParagraphs4 as string


    if player position ≤ quartertime then
    set info to fContentsNew1 as string
    else if player position > quartertime and player position ≤ midtime then
    set info to fContentsNew2 as string
    else if player position > midtime and player position ≤ quartertime * 3 then
    set info to fContentsNew3 as string
    else if player position > quartertime * 3 then
    set info to fContentsNew4 as string
    end if

    end if





    end tell
    end if
    return info
    end run

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir Rico739,
    Le problème de ton script est que le bloc "if par_count > 55 then" est après le "end if" qui correspond à ton "if player state is playing then"

    Je te conseille donc 2 astuces pour mettre cela en évidence :
    - ne pas mettre trop de lignes vides
    - lorsque tu as des if / end if emboîtés les uns dans les autres, mets des commentaires

    Donc avec les commentaires et le déplacement du end if (celui du player state), cela donne le code suivant :
    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
    on run    set info to ""
        tell application "System Events"
            set runCount to count (every process whose name is "iTunes")
        end tell
        if runCount > 0 then
            tell application "iTunes"
                if player state is playing then
                    
                    set _lyrics to lyrics of current track
                    set timetotal to duration of current track
                    set midtime to timetotal / 2
                    set thirdtime to timetotal / 3
                    set quartertime to timetotal / 4
                    set par_count to (count paragraphs in _lyrics)
                    set AppleScript's text item delimiters to return
                    
                    if par_count ≤ 25 then
                        set fParagraphs1 to paragraphs 9 thru -1 of _lyrics
                    end if -- coun t <= 25
                    
                    if par_count > 25 and par_count ≤ 40 then
                        set fParagraphs1 to paragraphs 9 thru 25 of _lyrics
                        set fParagraphs2 to paragraphs 26 thru -1 of _lyrics
                        set fContentsNew1 to fParagraphs1 as string
                        set fContentsNew2 to fParagraphs2 as string
                        
                        if player positionmidtime then
                            set info to fContentsNew1 as string
                        else
                            set info to fContentsNew2 as string
                        end if
                    end if -- count > 25 and <=40
                    
                    if par_count > 40 and par_count ≤ 55 then
                        set fParagraphs1 to paragraphs 9 thru 25 of _lyrics
                        set fParagraphs2 to paragraphs 26 thru 40 of _lyrics
                        set fParagraphs3 to paragraphs 41 thru -1 of _lyrics
                        set fContentsNew1 to fParagraphs1 as string
                        set fContentsNew2 to fParagraphs2 as string
                        set fContentsNew3 to fParagraphs3 as string
                        
                        
                        if player positionthirdtime then
                            set info to fContentsNew1 as string
                        else if player position > thirdtime and player positionthirdtime * 2 then
                            set info to fContentsNew2 as string
                        else if player position > thirdtime * 2 then
                            set info to fContentsNew3 as string
                        end if
                    end if -- count > 40 and <=55
                    
                    if par_count > 55 then
                        set fParagraphs1 to paragraphs 9 thru 25 of _lyrics
                        set fParagraphs2 to paragraphs 26 thru 40 of _lyrics
                        set fParagraphs3 to paragraphs 41 thru 55 of _lyrics
                        set fParagraphs4 to paragraphs 56 thru -1 of _lyrics
                        set fContentsNew1 to fParagraphs1 as string
                        set fContentsNew2 to fParagraphs2 as string
                        set fContentsNew3 to fParagraphs3 as string
                        set fContentsNew4 to fParagraphs4 as string
                        
                        
                        if player positionquartertime then
                            set info to fContentsNew1 as string
                        else if player position > quartertime and player positionmidtime then
                            set info to fContentsNew2 as string
                        else if player position > midtime and player positionquartertime * 3 then
                            set info to fContentsNew3 as string
                        else if player position > quartertime * 3 then
                            set info to fContentsNew4 as string
                        end if
                    end if -- count > 55
                    
                end if -- payer state is playing  ****** celui que j'ai déplacé
                
            end tell -- iTunes
        end if -- process run count
        return info
    end run
    Je précise que pour que le code soit lisible dans ce forum, il faut que tu le places entre des balises de codes (bouton # dans le barre des outils de rédaction de ton message)

    Il y aurait un peu plus à dire sur ton code, mais il fonctionne ! que se passe-t-il lorsque ton Lyrics compte plus de 60 lignes ?

    Cordialement

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonsoir PBell, et merci pour ta réponse!

    J'ai essayé le script (et aussi rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set fContentsNew1 to fParagraphs1 as string
    sur par_count ≤ 25.-je l'avais oublié)

    En ce qui concerne les paroles de plus de 65 lignes les dernères lignes ne seraient pas affichées mais il me suffirait de rajouter un nouveau bloc.

    Cependant le script fonctionne aléatoirement. On dirait qu'il ne veut voir qu'une seule des possibilités if..., la deuxième (-- count > 25 and <=40).

    Je suis peu expérimenté c'est pourquoi mon code a cet aspect fourre-tout Toutes les suggestions sont les bienvenues, je m'en arrache les cheveux!

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Re-bonsoir,
    J'ai regardé comment écrire quelque chose de plus générique pour ton code, c'est à dire que le code puisse fonctionner avec un nombre de lignes quelconque (de 1 à 1000 !!)

    J'en ai profité pour optimiser un peu, mais au prix d'une petite complexité dans les formules.
    L'idée est de déterminer d'abord combien il y aura de segments d'affichage : par exemple, avec 65 lignes, soit 55 utiles, il y a 4 segments (3 de 15 lignes et un restant de 10 lignes).

    Ensuite, je prends la position de la tête de lecture et je détermine le % de lecture (fois 100 pour avoir un integer).
    Enfin, je boucle sur la variable Quantieme de 1 au nombre de segments, pour déterminer sur quelle partie (segments) est positionnée la tête de lecture.
    Je termine en mettant dans "Info" les paragraphes de "Debut" à "Fin", directement en forçant le format string.

    Voici ci-dessous le code qui passe de 79 à 28 lignes ! c'est tout le but d'un algorithme comparé à une programmation "en dur": (je n'ai pas vérifié avec toutes les valeurs possibles, mais quelques test rapides semblent OK !)
    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
    on run    set info to ""
        tell application "System Events"
            if (count (every process whose name is "iTunes")) < 1 then return
        end tell
        
        tell application "iTunes"
            if player state is playing then
                set _lyrics to lyrics of current track
                set timetotal to duration of current track
                set par_count to (count paragraphs in _lyrics)
                set Nombre_Segments to ((par_count - 10) div 15) + 1 -- détermine le nombre de blocs de 15 lignes (sans les 10 premières)
                set Segment_en_cours to 100 * ((player position) / timetotal) as integer-- détermine le % de lecture courant
                repeat with Quantieme from 1 to Nombre_Segments
    -- test à quelle fraction de la lecture on en est (en fonction du nombre de segements de 15 lignes)
                    if (((100 / Nombre_Segments) * (Quantieme - 1)) ≤ Segment_en_cours) and (Segment_en_cours < ((100 / Nombre_Segments) * Quantieme)) then
    -- affichage du texte de la partie quantieme sur Nombre de Segments
                        set Debut to 9 + 15 * (Quantieme - 1) -- détermine le premier paragraphe
                        if Quantieme = Nombre_Segments then -- détermine le dernier paragraphe
                            set Fin to par_count
                        else
                            set Fin to Debut + 15
                        end if
                        set info to (paragraphs Debut thru Fin of _lyrics) as string
                    end if -- si le bon quantieme
                end repeat -- bouvle quantieme
            end if --player state is playing
        end tell -- iTunes
    end run
    Tu remarques aussi que j'ai inversé le test pour savoir si iTunes est lancé. Je regarde si il ne l'est pas et je sors du programme. Ceci peut être inversé selon tes scripts qui suivent.

    Cordialement

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Suite
    Merci beaucoup je n'en attendais pas tant, j'apprends plus vite ici en une journée qu'en des nuits de recherches effrénées!

    Le code est superbe et bien plus logique comme tu l'as écrit.

    Cependant il semble qu'il fonctionne de façon aléatoire (je veux dire que
    -les 10 premieres lignes sont élaguées à chaque fois
    -certaines chansons passent sans probleme, bien découpées, tout.
    -mais d'autres ne passent pas du tout -pas de résultats retournés, ou simplement " ".
    -certaines passent mais le texte n'est pas découpé.)

    Il semble que cela soit complètement aléatoire et ne dépende pas de la longueur du texte.
    Cela est peut-etre lié à ma version d'iTunes (10.0.1.26 sur Yosemite) ou à des fichiers audio corrompus (mais cela me surprendrait puisqu'un vieille app de lyrics fonctionne dessus).

    Je vais continuer d'expérimenter et continuer d'abuser de ta bienveillante générosité en demandant encore des astuces, si tu en as le temps et l'envie bien entendu, ta contribution m'ayant déjà ouvert pas mal d'horizons.

    Merci encore

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Quantième
    Donc j'ai regardé un peu et je pense avoir identifié le souci

    Premièrement j'ai rajouté la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set AppleScript's text item delimiters to return
    avec succès afin de préserver les retours à la ligne.

    Ensuite en lisant le script je me suis rendu compte qu'il n'y avait pas de set Quantième.

    Peut-etre que c'est la solution? Si c'est le cas, comment dois-je définir "Quantième"?

    Cordialement

  7. #7
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,

    Citation Envoyé par Rico739 Voir le message
    Ensuite en lisant le script je me suis rendu compte qu'il n'y avait pas de set Quantième.
    Il y a bien une affectation de la variable Quantieme, mais le set est implicite dans une boucle.
    Cette boucle, qui commence à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    repeat with Quantieme from 1 to Nombre_Segments
    et se termine à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    end repeat -- boucle quantieme
    assigne à Quantieme les valeurs successives de 1 à Nombre_Segments.
    Par exemple si Nombre_Segments vaut 3, Quantieme vaudra 1 au premier passage, puis 2, et enfin 3.
    A chaque fois, l'instruction "If" entre Repeat et End Repeat sera exécutée pour déterminer si la tête de lecture est sur le premier, le second ou le troisième segment. En fonction, le groupe de lignes sera assigné à Info.

    Les boucles sont l'un des outils les plus puissants et existent dans tous les langages.
    Pour être plus complet, sache qu'il existe des formes différentes de boucle : répéter tant que... (repeat while), répéter avec I de x à y... (comme ci-dessus et on peut ajouter step pour définir le pas d'incrément), répéter avec tous...(repeat with every) , répéter jusqu'à ce que (repeat until).
    A chaque fois toutes les instructions qui suivent seront répétées jusqu'au "end repeat".

    Ceci étant précisé, il est curieux que le code fonctionne aléatoirement . Il faut identifier la source.
    Pour se faire :
    - est-ce que se sont toujours les même morceaux qui posent problème à chaque fois que tu les joues ?
    - si oui, il faudrait vérifier le contenu de leur lyrics (peut être des delimiter de paragraphe incorrects) ? comme tu as du forcer ces delimiter en ajoutant l'instruction (avant la ligne 10 !) cela peut être le souci
    - tu peux aussi essayer de tracer le problème : c'est pas beau, mais efficace ! tu ajoutes des lignes display dialog avec le nom de la variable que tu veux voir. cela te permettra de tracer les valeurs et par où le programme passe.

    Reviens vers nous avec les éléments pour que l'on puisse t'aider.

    Cordialement
    Bonne journée

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut tests
    Bonjour!

    Ainsi j'ai écouté tes conseils et fait des tests avec un display dialog Quantieme.

    Et je me suis rendu compte que le script n'affiche que le dernier quantième. Si le texte est court il n'y a q'un quantième et le texte est affiché tout du long..

    Pour les longs textes, c'est systématiquement le dernier quantieme qui est affiché, donc la dernière portion de texte tout à la fin de la lecture.

    Bon j'ai aussi identifié un autre probleme puisque certains longs textes sont affichés intégralement, la raison étant qu'ils ne sont constitués que d'un quantieme.

    Cordialement

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Nouveauté
    Bonsoir!

    J'ai gambergé sur le script et de fil en aiguille j'en suis arrivé à une autre solution potentielle, mais là je ne comprends meme plus rien.

    Pour aller vite, le script que j'essaie de creer va ensuite etre utilisé avec un outil qui est GeekTool. En fait c'est une app qui invoque des scripts et affiche les résultats à l'écran après en avoir customisé l'apparence.

    Donc en cherchant sur le Web j'ai trouvé une ligne de code que l'on saisit dans le champ de Geektool dans lequel on saisit habituellement l'adresse du script que l'on veut faire tourner.
    Ce code fonctionne, il montre une info-je ne sais laquelle-qui défile de gauche à droite (en autoscrolling).
    L'auteur précise que la deuxième partie de son code peut etre réutilisée pour afficher d'autres informations en autoscrolling.

    Alors je me suis dit que peut-etre qu'il était plus judicieux de faire défiler les lyrics avec ce code.

    Là se posent plusieurs problemes:
    -je passe du coq à l'ane
    -ca devient un post qui ne concerne plus vraiment Apple Script
    -Je ne comprends RIEN à ce code que voici:


    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
    #!/bin/bash
     
    s=$( uptime )
    for i in $( echo ${s:10} ); do
    if [ $i = "days," ]
    then p=$c" días"
    else if [ $i = "day," ]
    then p=$c" día"
    else if [ $i = "hr," ]
    then p=$p" $c h"
    else if [ $i = "mins," ] || [ $i = "min," ]
    then p=$p" $c m"
    else if [ $i = "secs," ] || [ $i = "sec," ]
    then p=$p" $c s"
    else
    if [ $( expr "$i" : '[0-9]*:[0-9]*,' ) != 0 ]
    then a=${i/:/" h "}; a=${a/,/" m "}; p=$p" $a"
    fi
    fi
    fi
    fi
    fi
    fi
    c=$i
    done
    echo -n "Up: "
    s="$p                    "
    let j="$( date +%s ) % ${#s}"
    for (( i=0; i<j; i++ )); do
    s=${s:1}${s:0:1}
    done
    echo "$s"

  10. #10
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir Rico,
    Compte tenu de tes résultats, je me suis dit que j'avais peut être manqué quelque chose. Donc j'ai refais les tests sur mon iTunes avec un morceau dont les paroles sont sont "Lxx" sur chaque ligne, xx variant de 1 à 43 (donc 43 lignes en tout !)
    Oui je sais c'est bête mais j'ai connu des chansons avec des texte plus stupides !
    Dans ce cas je dois donc avoir 3 segments : de 10 à 24, de 25 à 39, de 39 à 43.

    Je lance iTunes et, pendant la lecture, je lance le script (exécuter dans l'éditeur de script).
    J'ai fait les tests avec différentes positions (et des traces sur Nombre_Segments, Segment_en_cours, Quantieme, Debut et Fin).
    Je n'ai trouvé que 2 petits problèmes :
    J'ai changé le 9 en 10 dans l'instruction : Set Debut to 10 + 15 * (Quantieme - 1)
    J'ai changé le 15 en 14 dans l'instruction : Set Fin to Debut + 14

    Mise à part ces détails, tout fonctionne. J'ai fait varier la position de la tête de lecture, et tout est OK. j'ai ensuite essayé avec un Lyric plus petit, toujours OK. A chaque fois, je récupère dans "Info" les lignes de Lyric prévues.

    Donc pour moi, le script est OK et peut être appelé à tout moment (exécuter le script) en cours de lecture du morceau.
    Par contre, je pense que le problème vient de la façon dont tu appelles ce script et même plus vraisemblablement de la façon dont tu récupères le paramètre Info dans GeekTool. Je n'ai jamais utilisé GeekTool, mais à lire le site correspondant, je ne suis pas certain que tu puisses faire ce que tu veux. C'est basé sur du shell script (comme ton exemple) ! et je suis moins à l'aise (je le lis sans trop de difficultés mais je me limite en général à écrire des syntaxes simples)

    Revenons au besoin d'origine : une fois que tu as les listes de lignes correspondant à l'avancement de la lecture, que souhaites tu en faire ?
    Les afficher simplement par bloc ? le premier quantieme, puis le second en effaçant le premier, et ainsi de suite ?
    Souhaites tu pouvoir travailler en même temps (si oui, il faut donc afficher le texte dans une fenêtre d'une application) ?
    Si non, on peut afficher avec coup d'oeil qui se fermera dès que tu sélectionnes une autre fenêtre et qui se rouvre au rafraîchissement...!

    A te lire ...

    Cordialement


  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonsoir Pbell.

    J'ai testé le script dans AppleScript, sans passer par GeekTool, mais j'obtiens les meme résultats (Seul le dernier quantieme m'est retourné).

    Oui je souhaite simplement afficher le premier quantieme, puis le second en effaçant le premier, et ainsi de suite.

    Vraiment je pense qu'on n'est pas loin du but puisque ca marche sur ton iTunes. peut-etre ma version?

    .

  12. #12
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Je vais te préparer une version de script qui intègre des traces complètes dans un fichier log texte. Tu pourras faire tourner le script chez toi et renvoyer le fichier log qui me permettra de voir ce qui ne va pas chez toi.

    Je pense te l'envoyer demain.

    Cordialement

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Excellent! Merci!

  14. #14
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    chose promise, chose due !
    Voici le script avec une trace complète. Tu copies/colle dans l'éditeur de script, tu complies.
    Ensuite, tu ouvres iTunes, tu "play" un morceau avec des paroles et pendant sa lecture, à intervalles réguliers, tu cliques sur le bouton Exécuter de l'éditeur de script.
    Si par exemple tu as 45 lignes de paroles (qui devraient se découper en 3), tu exécutes vers le début (1 ou 2 fois), vers le milieu et vers la fin.

    Chaque exécution va enregistrer toutes les variables et résultats dans un fichier Lyric_Log.txt sur ton bureau.
    Si les paroles sont longues, le fichier le sera aussi, mais ce n'est pas grave.
    Tu peux regarder le fichier pour analyser par toi même, et si tu me l'envoies en pièce jointe, je vais l'analyser pour toi.

    Cordialement

    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
    property Num_Run : 1set FLog to ((path to desktop) as text) & "Lyric_Log.txt"
    
    
    set info to ""
    tell application "System Events"
        if (count (every process whose name is "iTunes")) < 1 then return
    end tell
    
    
    tell application "iTunes"
        if player state is playing then
            set _lyrics to lyrics of current track
            set timetotal to duration of current track
            set AppleScript's text item delimiters to return
            set par_count to (count paragraphs in _lyrics)
            set Nombre_Segments to ((par_count - 10) div 15) + 1 -- détermine le nombre de blocs de 15 lignes (sans les 10 premières)
            set Lecture_Pos to player position
            set Segment_en_cours to 100 * ((Lecture_Pos) / timetotal) as integer-- détermine le % de lecture courant
            repeat with Quantieme from 1 to Nombre_Segments
    -- test à quelle fraction de la lecture on en est (en fonction du nombre de segements de 15 lignes)
                if (((100 / Nombre_Segments) * (Quantieme - 1)) ≤ Segment_en_cours) and (Segment_en_cours < ((100 / Nombre_Segments) * Quantieme)) then
    -- affichage du texte de la partie quantieme sur Nombre de Segments
                    set Debut to 10 + 15 * (Quantieme - 1) -- détermine le premier paragraphe
                    if Quantieme = Nombre_Segments then -- détermine le dernier paragraphe
                        set Fin to par_count
                    else
                        set Fin to Debut + 14
                    end if
                    set Mon_Texte to (paragraphs Debut thru Fin of _lyrics) as string
                end if -- si le bon quantieme
            end repeat -- bouvle quantieme
        end if --player state is playing
    end tell -- iTunes
    
    
    -- ajout d'une trace
    set Trace to "Run N° " & Num_Run & return & "Lyric total : " & return & _lyrics & return & return
    set Trace to Trace & "timetot=" & (timetotal as string) & return & "Nb Segments=" & (Nombre_Segments as string) & return & "Lecture=" & Lecture_Pos & return & "Segment_en_cours=" & (Segment_en_cours as string) & return
    set Trace to Trace & "debut=" & (Debut as string) & return & "Fin=" & (Fin as string) & return & "Extrait :" & return & Mon_Texte
    try
    open for accessfile the FLog with write permission
        write (Trace & return & "---------------" & return & return) to file the FLog starting at eof
    close accessfile the FLog
    on error
        try
    close accessfile the FLog
        end try
    end try
    set Num_Run to Num_Run + 1

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Log
    Bonjour,
    Merci pour le script de test!
    Je l'ai testé et lu le log (attaché)-le log ne commence pas à 1 mais à 7 mais c'est normal car j'ai joué un peu avec avant de faire un log "méthodiquement (plusieurs chansons de longueurs différentes)

    Donc deux choses apparaissent:
    -Premièrement j'ai du changer la mention"accessfile" en "access file" dans le script de test afin qu'il compile. Peut-etre que nous utilisons chacun une version légèrement différente de AppleScript ou que Yosemite a apporté des changements, ce qui expliquerait que ton script original ait du mal à passer sur ma machine.

    -Et puis en lisant le log, je peux voir que le segment en cours apparait en général comme étant supérieur au nombre de segments total.

    Voilà mon analyse (pas très poussée je te l'accorde .

    Cordialement,
    Fichiers attachés Fichiers attachés

  16. #16
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Désolé, je viens seulement de rentrer du boulot !

    Pour l'espace manquant, ne t'inquiète pas : c'est un bug aléatoire dans le copier/collé de ce forum (j'ai beau vérifier à chaque fois si le bug ne s'est pas produit, je rate souvent un espace qui a sauté ).

    Pour ton fichier, je viens de le télécharger et je le regarde demain.

    Cordialement

    PS : pour le N° de run, pour info, il suffit que tu demandes à recompiler le script et le Num_Run reprendra la valeur 1 indiquée en première ligne ! mais pas de problème pour analyser en commençant à 7

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Cool!

  18. #18
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir Rico739,
    J'ai analysé le fichier trace que tu as produit. Il y a 5 piste iTunes utilisées.


    Piste 1, run 7 à 11 : la piste dure 282 secondes et les paroles ne comptent que 19 lignes. comme on élimine les 10 premières il en reste 9 soit 1 seul segment.
    Tes tests indiquent des positions de la tête de lecture de 8, 88, 160, 215 et 258 secondes. Comme il n'y a qu'un seul segment, à chaque fois c'est toutes les lignes de 1 à 9 qui sont extraites (debut = 10, fin = 19). Donc tout va bien ! le script fonctionne


    Piste 2, run de 12 à 17 : la piste dure 469 secondes et les paroles comptent 64 lignes soit 4 segments (lignes 10 à 24, 25 à 39, 40 à 54 et 55 à 64).
    Tes tests 12 et 13 indiquent des positions de la tête de lecture de 17, 24 donc sur le premier quart donc debut = 10 et fin = 24.
    Le test 14 indique une position de la tête de lecture de 173 donc sur le second quart donc debut = 25 et fin = 39.
    Tes tests 15 et 16 indiquent des positions de la tête de lecture de 266, 340 donc sur le troisième quart donc debut = 40 et fin = 54.
    Enfin le test 17 indique une position de la tête de lecture de 423, donc sur le dernier quart, donc debut = 40 et fin = 55.
    Donc tout va bien ! le script fonctionne


    Piste 3, run de 18 à 24 : la piste dure 259 secondes et les paroles comptent 159 lignes soit 10 segments (lignes 10 à 24, 25 à 39, ... 145 à 159).
    le run 18 (10s) est au premier 1/10, le run 19 (41s) est à 2/10, le run 20 (84s) est à 4/10, le run 21 (136s) est à 6/10, le run 22 (175s) est à 7/10, le run 23 (222s) est à 9/10 et enfin le run 24 (245s) est à 10/10.
    Dans chaque cas, les valeurs debut et fin sont correctes. Donc tout va bien ! le script fonctionne


    Sur la piste 4 il y a bien un problème :
    Piste 4, run de 25 à 29 : la piste dure 161 secondes et les paroles comptent 54 lignes quand je compte les lignes, donc je devrais avoir 4 segments (lignes 10 à 24, 25 à 39, 40 à 54, 54 à 54). (peut être 3 seulement si je me suis trompé en comptant !)
    Mais le script n'en compte que 2 segments !!
    La suite de la trace est correcte dans le cas de 2 segments, en fonction de la position de la tête de lecture. Lorsqu'elle est en segment 2 (la seconde moitié de la piste) elle indique des valeurs de début / fin de 25 / 27.
    Il semble donc que ce morceau soit vu comme n'ayant que 27 lignes en tout...alors que j'en compte presque 2 fois plus !!!
    J'en déduis que ces paroles de chanson contiennent des caractères qui ne sont pas des "return" mais qui y ressemblent...peut être des linefeed (ASCII 10) sur certaines lignes, qui font que le script ne compte que 27 paragraphes, mais que j'en vois plus.


    Enfin la piste 5, run de 30 à 35, qui ne comporte que 16 lignes, donc quelque soit la position de la tête de lecture, ne donne que 1 segment des lignes 10 à 16. Pas de problème ici .


    En conclusion, je confirme que le script fonctionne correctement en fonction du nombre de paragraphes des Lyric (paragraphes séparés par des "return"). Mais le morceau de The Smiths / Cemetery Gates contient des caractères qui perturbe le comptage des paragraphes.
    Que faire ?
    Il faut déterminer quels sont ces caractères perturbants, puis les ajouter dans la liste des item text delimiters.

    Je ne peux pas les trouver dans le fichier trace car le "write" semble les éliminer.
    Compte tenu des tests effectués, sur le script tu peux supprimer les traces et juste afficher, avec un display dialog, la variable par-count (nombre de paragraphe).
    C'est celle-ci qui est perturbée. Tu peux manuellement copier /coller les paroles dans Word, t'assurer qu'il n'y as pas d'autres caractères que des return et coller le résultat dans iTunes. Cela jusqu'à ce que ce morceau indique environ 54 paragraphes dans par-count...tel que tu le vois !

    Courage ! et tiens nous informé de tes progrès.

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Salut Pbell! Une analyse bien poussée, maintenant je recherche à fond les text items délimiters et je vous tiens au courant la semaine prochaine.
    Franchement merci de t'etre penché sur mon problème!

Discussions similaires

  1. Récupérer textes dans plusieurs fichiers RTF sans les ouvrir
    Par jpvba65 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/01/2014, 17h13
  2. [Débutant] Decouper un texte en plusieurs parties
    Par Jah73 dans le forum VB.NET
    Réponses: 10
    Dernier message: 17/10/2012, 15h52
  3. Réponses: 0
    Dernier message: 31/08/2011, 17h42
  4. Créer plusieurs configurations et les afficher dans un spinner
    Par sebseb3 dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 18/06/2011, 11h25
  5. Réponses: 2
    Dernier message: 21/09/2005, 12h18

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