# Applescript "genre dans itunes" : 2 "bugs"



## two (24 Mai 2010)

Bonjour, j'ai écrit un petit applescript qui me pose encore deux petits soucis...

```
tell application "iTunes"
    set mem_genre to "aa"
    repeat while player state is not stopped
        try
            set genre_actuel to (get current track's genre)
            set index_courant to (get index of current track)
            set in_play to current playlist
            if mem_genre is not genre_actuel then
                do shell script "/usr/local/bin/growlnotify -a iTunes  -m iTunesDMX! " & genre_actuel
                set mem_genre to genre_actuel
            else
                set en_cours to ((current track's duration) - player position)
                if (en_cours is less than 20) then
                    delay (en_cours - 8)
                    set genre_suivant to (genre of track (index_courant + 1) of in_play)
                    if genre_suivant is not genre_actuel then
                        do shell script "/usr/local/bin/growlnotify -a iTunes -m iTunesDMX " & genre_suivant
                    end if
                    set mem_genre to genre_suivant
                end if
            end if
            delay 10
        end try
    end repeat
end tell
```
Cet applescript me permet de vérifier régulièrement le genre du morceau en lecture et ce de manière a engendrer une action au plus tard 10 secondes après le changement de merceau si le changement est fait de manière manuelle et au moment du fondu enchainé si le morceau est lu jusqu'à la fin.
L'action, pour le moment,  c'est l'affichage d'un bezel growl (do shell script "/usr/local/bin/growlnotify..."). Par la suite ce sera une intervention sur une application tierce.


Mon premier souci : quand je veux mettre fin à l'exécution du script  autrement qu'en arrêtant la lecture sur iTunes; je ne peux le faire avec la fonction quitter et je suis obligé de passer par un forcer à quitter... Un remède docteur?


Mon second, un peu moins génant : la ligne suivante prends le genre du morceau suivant dans la liste de lecture. 
	
	



```
set genre_suivant to (genre of track (index_courant + 1) of in_play)
```
Comment faire pour qu'il prenne le genre du premier morceau coché après celui en cours de lecture?


Le Try englobant une bonne partie du code est là pour ne pas afficher les messages d'erreurs quand le morceau en lecture est le dernier de la liste (à ce moment là mon script ne m'est de toute façon plus utilité).


infos qui peuvent être utiles: Mac OSX 10.6.3 - Itunes 9.1.1 - Editeur applescript 2.3


----------



## Anonyme (24 Mai 2010)

Bonjour,

La solution pour tes deux soucis: 

```
property mem_genre : ""

on run
	set mem_genre to "aa"
end run

on idle
	if application "iTunes" is running then
		tell application "iTunes"
			if player state is not stopped then
				try
					set genre_actuel to (get current track's genre)
					set index_courant to (get index of current track)
					set in_play to current playlist
					if mem_genre is not genre_actuel then
						my notification(genre_actuel)
						set mem_genre to genre_actuel
					else
						set en_cours to ((current track's duration) - player position)
						if (en_cours is less than 20) then
							delay (en_cours - 8)
							if running then
								set i to index_courant + 1
								repeat
									tell track i of in_play to if enabled then --**vérifie si le morceau est coché **--
										set genre_suivant to genre
										exit repeat
									end if
									set i to i + 1
								end repeat
							else
								tell me to quit --  iTunes a  quitté
							end if
							if genre_suivant is not genre_actuel then my notification(genre_suivant)
							set mem_genre to genre_suivant
						end if
					end if
				end try
			else
				tell me to quit -- le lecteur est stopped
			end if
		end tell
	else
		tell me to quit -- iTunes a  quitté
	end if
	return 10 -- 10 secondes avant l'execution du prochain idle
end idle

on quit
	continue quit
end quit

on notification(t_genre) --- quoted form : si le genre contient un  ' 
	do shell script "/usr/local/bin/growlnotify -a iTunes  -m iTunesDMX! " & quoted form of t_genre
end notification
```

Il suffit de cocher "*Rester en arrière-plan*" lors de l'enregistrement du script au format *Application*.


----------



## two (25 Mai 2010)

Testé et adopté  
Merci Mac_Jac

Juste une question supplémetaire pour pas mourir con:
j'avais mis dans mon code 
	
	



```
set mem_genre to "aa"
```
 là ou j'aurais pu mettre 

```
set mem_genre to ""
```

dès lors n'y a t'il pas redondance dans ces lignes ci?
	
	



```
property mem_genre : ""

on run
    set mem_genre to "aa"
end run
...
```
Ne peut on pas mettre ceci? 
	
	



```
on run
    set mem_genre to ""
...
end run
```


----------



## Anonyme (25 Mai 2010)

two a dit:


> dès lors n'y a t'il pas redondance dans ces lignes ci?
> 
> 
> 
> ...


Toutes les variables qui sont définis dans l'événement "on run" doivent être déclaré au début du script comme (global ou property), parce que chaque fois que le idle est exécutée les variables locales ne seront pas définies.  
EX: set mem_genre to "aa" sans une déclaration comme global, à la première exécution du idle (erreur la variable mem_genre n'est pas défini.)

Dans un événement "on idle", même chose pour les variables qui seront utilisées  dans la prochaine exécution du 'on idle"




two a dit:


> Ne peut on pas mettre ceci?
> 
> 
> 
> ...


Oui, on peut mettre ceci, mais en gardant la ligne *property mem_genre : ""*

Si on ne réinitialise pas la variable mem_genre dans le "on run" le contenu de la variable sera celle lors de la fermeture de l'application.


----------



## two (25 Mai 2010)

ok, compris. Merci a toi


----------

