À la découverte d'AppleScript

Jean-Philippe Moreux

Apprenez comment piloter applications et système d'exploitation avec AppleScript, le couteau suisse du Mac ! D'un apprentissage aisé, d'un usage quasi universel, AppleScript automatise vos tâches répétitives et vous fait gagner du temps.

- Titre : À la découverte d'AppleScript

- Auteur : Jean-Philippe Moreux

- Parution : 7 novembre 2008

- Mise à jour : 25 novembre 2008

- Licence : Copyright ® 2008 Jean-Philippe Moreux. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction à AppleScript

- I-A. Introduction

- I-B. Les concepts d'AppleScript

- I-B-1. La programmation de base

- I-C. Programmer avec AppleScript

- I-C-1. Configuration d'AppleScript et menu des scripts

- I-C-2. L'éditeur de scripts

- I-C-3. L'édition de scripts

- I-C-4. Les fenêtres

- I-C-5. Les dictionnaires de pilotage

- I-C-6. Déboguer des scripts

- I-C-7. Scripting Additions

- I-D. Références

- II. Renommer des morceaux iTunes

- II-A. Objectif

- II-B. Algorithme

- II-C. Le script

- II-C-1. Obtenir les morceaux sélectionnés par l'utilisateur.

- II-C-2. Demander à l'utilisateur quel champ il souhaite éditer, parmi les champs Nom, Artiste, Album.

- II-C-3. Demander à l'utilisateur combien de caractères il souhaite supprimer dans le champ, et à quel endroit (en tête ou en fin de champ).

- II-C-4. Appliquer l'édition du champ sur tous les morceaux sélectionnés.

- III. Télécharger des couvertures d'album

- III-A. Objectif

- III-B. Algorithme

- III-C. Le script

- III-C-1. Obtenir le morceau sélectionné par l'utilisateur.

- III-C-2. Obtenir les champs Artiste et Album du morceau.

- III-C-3. Construire le critère de recherche.

- III-C-4. Exécuter la recherche dans Safari.

- IV. Révéler l'emplacement de morceaux

- IV-A. Objectif

- IV-B. Algorithme

- IV-C. Le script

- IV-C-1. Obtenir les morceaux sélectionnés par l'utilisateur.

- IV-C-2. Obtenir leur emplacement de stockage.

- IV-C-3. Révéler l'emplacement dans le Finder.

I - Introduction à AppleScript

I-A - Introduction

AppleScript est le langage de script fourni avec Mac OS depuis la version 7 (1992). Issu du projet HyperCard, il permet aux développeurs d'applications de rendre ces dernières scriptables et aux utilisateurs de contrôler par le moyen de scripts leur ordinateur et les applications qu'il exécute.

AppleScript permet de réaliser tout ce qu'un utilisateur peut accomplir avec un clavier et une souris. Mais comme tout langage de script, il offre de nombreux avantages comparé à un opérateur humain :

- Il accomplit tout travail répétitif, qu'il soit simple ou complexe, sans rechigner

- Il automatise des enchaînements de tâches complexes, nécessitant des interactions entre différentes applications. À ce titre, il sert de " glue " logicielle entre applications et/ou système d'exploitation.

- Il peut agir en l'absence de l'utilisateur, selon un planning préétabli ou à la survenue d'événements particuliers.

Par ailleurs, il offre aussi l'avantage d'être le langage de script natif du système d'exploitation Mac OS, ce qui le rend compatible avec la majorité des applications Mac.

Au chapitre de ses faiblesses, notons sa lenteur, le fait que certaines applications ne sont pas scriptables et, bien sûr, qu'il ne fonctionne que sur les ordinateurs Apple...

Mac OS X Leopard (10.5) inclut AppleScript 2.0, une mise à jour importante du langage proposant notamment le support d'Unicode, une évolution des bibliothèques de pilotage, la possibilité de scripter de nouveaux panneaux des Préférences Système et une implémentation plus fiable des actions de dossier. La page https://developer.apple.com/library/mac/releasenotes/AppleScript/RN-AppleScript/index.html détaille cette nouvelle version d'AppleScript.

I-B - Les concepts d'AppleScript

AppleScript repose sur le concept de dictionnaire de pilotage d'applications. Toute application scriptable publie un dictionnaire des actions et des objets qu'elle manipule et sur lesquels AppleScript pourra agir. AppleScript ne se fonde donc pas sur l'enregistrement des actions de l'utilisateur sur l'interface graphique des applications (bien qu'un bouton Enregistrer un script soit apparu avec les versions récentes de l'éditeur de scripts, ces enregistrements ne fonctionnent qu'avec un nombre limité d'applications).

AppleScript a été conçu pour des utilisateurs non-programmeurs, en adoptant une méthode " langage naturel ". Sa syntaxe est donc très proche de l'anglais, ce qui est à la fois un avantage, puisque programmer un script revient quasiment à décrire ce que l'on veut lui faire accomplir :

tell application "iTunes"
set duree to (duration of playlist 1) / 60 / 60
-- calcul de la durée de la bibliothèque en heures
end tell

et un inconvénient (les scripts sont parfois verbeux) :

if the nom begins with the texte then

I-B-1 - La programmation de base

AppleScript offre :

- Plusieurs types de base, sans contrôle de type strict : entier, réel, chaîne de caractères, booléen, liste, enregistrement (liste de paires de valeurs).

- Les notions de variables locales et globales.

- Des structures de contrôle et de répétition classiques : if/else, repeat, try, exit.

- Des structures de bloc : tell/end tell, on/end, to/end.

- Des fonctions (ou sous-routines), dotées d'un nom et de paramètres, permettant d'écrire du code selon un style de programmation structurée.

- Des gestionnaires : run, quit, open, idle (un gestionnaire est une fonction déclenchée par AppleScript à la survenue d'événements particuliers : exécution d'un scrip, survenue d'une erreur, etc.).

Il fonctionne selon une syntaxe verbe ou verbe+nom (ou méthode/objet, commande/cible) :

beep
print document

Pour désigner l'application cible d'une commande, AppleScript utilise un bloc tell :

tell application "iTunes" to quit

Le concept de hiérarchie d'objets est exprimé à l'aide de prépositions (of, first, last, etc.) :

pages 1 of document 2
track 1 thru 5 of first library playlist

I-C - Programmer avec AppleScript

I-C-1 - Configuration d'AppleScript et menu des scripts

AppleScript est livré avec tous les Mac OS X. Il est situé dans le dossier Applications/AppleScript, qui contient les éléments suivants :

- Config. actions de dossier. Permet d'activer la fonctionnalité d'actions de dossier.

- Éditeur de scripts. L'éditeur AppleScript par défaut. Il est possible d'utiliser un autre éditeur en le spécifiant à l'aide de l'Utilitaire AppleScript.

- Example Scripts. Alias vers le dossier Bibliothèque/Scripts, qui contient une compilation de scripts AppleScript classés par thèmes.

- Utilitaire AppleScript. Règle les préférences AppleScript : éditeur utilisé, activation des fonctions GUI Scripting et actions de dossier, paramétrage du menu des scripts.

Le menu des scripts regroupe les scripts d'exemples du dossier Bibliothèque/Scripts, qui concernent diverses thématiques : Finder, Internet, Mail, navigation, impression, etc. Il peut être étendu par vos propres scripts et réorganisé (ordre des sous-menus, emplacement des scripts, etc.). Pour y avoir accès, il faut au préalable avoir cliqué sur " Afficher le menu des scripts dans la barre de menus " dans l'Utilitaire AppleScript.

Le menu des scripts présente certaines astuces de fonctionnement intéressantes, quoique cachées :

- Cliquer sur un sous-menu ouvre le sous-dossier correspondant dans le Finder.

- Majuscule+clic sur un script du menu ouvre le sous-dossier qui le contient dans le Finder et présélectionne le script.

- Option+clic ouvre le script dans l'éditeur de scripts.

Par ailleurs, le dossier des scripts de l'utilisateur courant (~Bibliothèque/Scripts) peut être utilisé pour stocker, outre des scripts, des raccourcis, des applications, etc. La figure suivante montre un menu de scripts personnalisé et le dossier ~Bibliothèque/Scripts correspondant.

I-C-2 - L'éditeur de scripts

L'éditeur de scripts est l'outil privilégié pour visualiser et écrire des scripts. Ses menus offrent l'accès aux commandes de base. On remarquera en particulier :

- Fichier > Enregistrer permet d'enregistrer le script sous forme texte.

- Fichier > Enregistrer sous permet d'enregistrer le script sous forme de script compilé ou d'application (également appelée applet). Attention, si la case Exécutable uniquement est cochée, le script ne sera plus éditable.

- Le menu Script permet d'exécuter (Pomme+R), d'arrêter et de compiler (vérification de la syntaxe) un script. Des boutons situés sur la fenêtre d'édition du script reprennent ces commandes.

Le meilleur moyen de débuter avec AppleScript est d'ouvrir dans l'éditeur les scripts d'exemple du menu des scripts, de les exécuter et de les analyser. Des scripts élémentaires peuvent également être trouvés sur ces pages : http://www.apple.com/osx/apps/#automator.

I-C-3 - L'édition de scripts

La fenêtre d'édition offre une aide à la programmation par le moyen de codes couleur distinguant mots clés, variables, valeurs, etc. Dès lors qu'un script a été compilé, il est automatiquement indenté et sa syntaxe est mise en couleurs.

Une autre aide à la programmation existe par le biais d'un menu contextuel (clic droit ou Ctrl+clic). Celui-ci permet d'insérer des routines prédéfinies dans le code (contrôle de flot, itération, gestionnaire d'erreurs, etc.). Ces routines sont contenues dans le dossier Bibliothèque/Scripts/Script Editor Scripts, dont le contenu est modifiable. Il est donc possible d'y ajouter des portions de code que vous prévoyez de régulièrement réutiliser.

Enfin, une fonction de saisie semi-automatique (Assistant Script) peut être activée dans l'onglet Modification des Préférences de l'éditeur. Elle suggère les termes complétant ce que le programmeur est en train de saisir. La touche Escape permet d'accepter la suggestion ; une suggestion multiple est indiquée par des points de suspension, la touche F5 affichant la liste et la touche Retour validant un choix effectué dans cette liste à l'aide des flèches haut et bas.

I-C-4 - Les fenêtres

L'onglet Résultat affiche le résultat de la dernière commande.
Dans notre cas, la durée de la playlist n° 1 d'iTunes, exprimées en heures.

Remarque. Lors de la première exécution d'un script appelant une application (ici iTunes), celle-ci se lance automatiquement. Le temps d'exécution du script peut donc être relativement long...

Pour suivre l'enchaînement des événements et de leur résultat, il convient d'afficher la fenêtre Historique des événements (menu Fenêtre ou Alt+Pomme+L).

La fenêtre Bibliothèque (menu Fenêtre ou Maj+Pomme+L) donne accès aux principales applications ainsi qu'à leur dictionnaire de pilotage). Cliquer sur une application la lance et ouvre son dictionnaire. Les boutons + et - permettent d'ajouter et de supprimer des bibliothèques d'applications.

I-C-5 - Les dictionnaires de pilotage

Les dictionnaires de pilotage détaillent la syntaxe d'une application scriptable. Ils sont accessibles à partir de la fenêtre Bibliothèque (Maj+Pomme+L) ou du menu Fichier > Ouvrir un dictionnaire. Dans ce dernier cas, la liste de toutes les applications disponibles sur votre Mac et possédant un dictionnaire est présentée. La figure suivante présente le dictionnaire d'iTunes.

Les dictionnaires de pilotage détaillent la syntaxe d'une application scriptable, c'est-à-dire la liste des commandes et des classes d'objets que l'application propose. Ils sont organisés en " suites ", énumérées dans la colonne de gauche de la fenêtre (et précédées d'une icône S). La suite Standard contient les termes communs à toutes les applications scriptables avec AppleScript. Les autres suites sont conçues et créées par les concepteurs d'applications, en fonction des objectifs et besoins de ces dernières.

La colonne centrale de la fenêtre énumère les commandes (icône C sur fond bleu) et les classes (icône C sur fond violet) d'une suite donnée. Enfin, cliquer sur une classe affiche dans la colonne de droite la liste de ses propriétés (icône P) et éléments (icône E). Ici, cliquer sur la classe track (morceau) permet de lister ses nombreuses propriétés (album, artist, etc.).

Cliquer sur une suite, une commande, une classe, etc., affiche sa description dans la zone de texte inférieure. Cette zone contient des liens hypertextes permettant de naviguer dans la structure hiérarchique des objets.

Le champ de recherche en haut à droite de la fenêtre est très utile pour retrouver un élément de programmation par son nom.

I-C-6 - Déboguer des scripts

Les fenêtres Historique des événements et Historique des résultats de l'éditeur de scripts permettent de suivre pas à pas le déroulement d'un script. Mais il n'est pas possible de poser des points d'arrêt.

Smile et Script Debugger sont une alternative intéressante à l'Éditeur de scripts. Ils offrent de bonnes fonctionnalités de débogage :

- Smile : http://www.satimage.fr/software/en.

- Script Debugger : http://www.latenightsw.com/sd4.

- Xcode, l'outil de développement Apple, permet également de gérer des projets AppleScript.

I-C-7 - Scripting Additions

Les compléments de pilotage (scripting additions, ou encore osax, pour Open Scripting Architecture eXtension) sont des modules fournis par des développeurs tiers et qui permettent d'étendre les fonctionnalités d'AppleScript. Ces modules, stockés dans le dossier Bibliothèque/ScriptingAdditions, ne sont pas propres à une application particulière mais disponibles globalement. Mac OS X inclut un complément nommé Standard Additions. Son contenu peut être consulté avec le menu Fichier > Ouvrir un dictionnaire. Il propose des commandes d'interaction avec l'utilisateur, de gestion de fichiers, des routines mathématiques, etc.

I-D - Références

Le site http://www.apple.com/osx/apps/ est un bon point de départ pour explorer les possibilités d'AppleScript. Des scripts et des routines élémentaires peuvent être trouvés sur ces pages : http://www.apple.com/osx/apps/#automator.

La documentation du langage (guide, tutorial) se trouve ici : https://developer.apple.com/search/index.php?q=applescript et là : http://macscripter.net/.

Le site http://www.macscripter.net/ contient de nombreux tutoriaux et des exemples de scripts. Il est associé à http://macscripter.net, qui regroupe différents sites, forums, FAQ, etc., liste des applications scriptables - ainsi que leur dictionnaire -, et une bibliothèque de 1 500 scripts téléchargeables.

Le site http://www.scriptweb.org, qui recense les nombreuses possibilités de scripting sur Macintosh sous forme de liens, s'intéresse bien sûr à AppleScript.

La page https://developer.apple.com/technologies/mac/cocoa.html expose comment un développeur doit procéder pour permettre à AppleScript d'accéder à ses applications.

Quelques livres en français traitent de la programmation AppleScript :

- AppleScript, Jesse Feiler (Peachpit Press/Pearson Éducation France, 2003).

- AppleScript - Maîtrise complète, Adam Goldstein (O'Reilly, 2005).

- Mac OS X programmation - Version 10.5 Leopard - WebKit, Cocoa, AppleScript, Dashboard, Core-Animation, Étienne Vautherin (Dunod, 2007).

- Automatisez vos tâches sous Mac OS X, Bernard Desgraupes et Jean-Philippe Moreux (Pearson Éducation France, 2008).

II - Renommer des morceaux iTunes

Nous allons voir dans cette deuxième partie comment AppleScript permet d'automatiser des tâches répétitives et donc fastidieuses, tel renommer des morceaux dans une bibliothèque iTunes.

II-A - Objectif

Importer un album ou des fichiers audio dans iTunes conduit parfois à ce que les informations associées aux morceaux (titre, auteur, etc.) soient mal formatées. Un numéro peut avoir été collé au titre du morceau, ou ce dernier se trouver collé au nom de l'artiste.

Éditer ces informations à la main peut s'avérer fastidieux… Nous allons donc réaliser un script AppleScript permettant de supprimer des caractères à la fin ou au début des champs titre, artiste et album, cela pour tous les morceaux sélectionnés dans la fenêtre iTunes.

II-B - Algorithme

Le script suit l'algorithme suivant :

1. Obtenir les morceaux sélectionnés par l'utilisateur.

2. Demander à l'utilisateur quel champ il souhaite éditer, parmi les champs Nom, Artiste, Album.

3. Demander à l'utilisateur combien de caractères il souhaite supprimer dans le champ, et à quel endroit (en tête ou en fin de champ).

4. Appliquer l'édition du champ sur tous les morceaux sélectionnés.

II-C - Le script

Nous allons maintenant réaliser cet algorithme, étape par étape.

II-C-1 - Obtenir les morceaux sélectionnés par l'utilisateur.

Le script commence par une instruction tell, qui indique à AppleScript quelle application est l'objet de nos actions :

tell application "iTunes"

L'instruction suivante permet d'obtenir d'iTunes la liste des morceaux sélectionnés par l'utilisateur, et de l'affecter à la variable morceaux :

set morceaux to selection

selection est une propriété de la classe application, mais aussi des classes browser window et playlist window. On obtient des informations à son sujet en la recherchant dans le dictionnaire de pilotage d'iTunes.

Remarque. Pour prendre en compte le cas où l'utilisateur aurait ouvert plusieurs fenêtres, il faudrait utiliser une instruction du type :

set morceaux to selection of window i

Il convient ensuite de tester que l'utilisateur a bien sélectionné des morceaux. Cela se fait en testant que la variable morceaux est une liste vide :

if morceaux is {} then
display dialog "Vous devez sélectionner des morceaux !"
buttons {"OK"} with icon caution giving up after 15
return
end if

Dans ce cas, on affiche un message à l'aide de la commande display dialog. Celle-ci comprend un certain nombre d'options, permettant de paramétrer les boutons affichés, une éventuelle icône et le temps d'affichage du message.

Remarque. On pourrait aussi envisager de tester la cardinalité de la variable morceaux, afin d'identifier le cas où l'utilisateur aurait sélectionné un très grand nombre de morceaux, ce qui serait suspect. La cardinalité d'une liste est donnée par l'instruction length of liste.

II-C-2 - Demander à l'utilisateur quel champ il souhaite éditer, parmi les champs Nom, Artiste, Album.

On définit d'abord une variable de type liste, champs, contenant les noms des champs éditables :

set champs to {"Nom", "Artiste", "Album"}

Puis on demande à l'utilisateur de sélectionner un champ dans cette liste, à l'aide de la commande choose from list

set champ to (choose from list champs with prompt "Quel champ éditer ?"
default items "Nom") as string

Remarque. Les capacités de dialogue avec l'utilisateur d'AppleScript sont assez limitées. Pour définir des IHM plus élaborées, il faudra se tourner vers AppleScript Studio.

La commande choose renvoie une liste contenant un des chaînes de caractères de la liste champs, ou bien le booléen false, si l'utilisateur a cliqué sur le bouton Annuler. En transtypant en type string, on peut ensuite tester la réponse de l'utilisateur, et quitter éventuellement le script avec la commande return:

if champ is "false" then
display dialog "Abandon du script !" buttons {"OK"} with icon note
giving up after 15
return
end if

II-C-3 - Demander à l'utilisateur combien de caractères il souhaite supprimer dans le champ, et à quel endroit (en tête ou en fin de champ).

Une variante de la commande display dialog va permettre de faire saisir une valeur par l'utilisateur. En précisant l'option default answer, un champ de saisie apparaît dans la fenêtre de message :

set choix to display dialog "Combien de caractères supprimer dans \""
& champ & "\" ?" default answer "2"
buttons {"Au début", "À la fin", "Annuler"}

Après interaction avec l'utilisateur, la variable choix contient une liste du type :

{text returned:"2", button returned:"À la fin"}

Il est ensuite possible d'obtenir les informations qui nous intéressent avec ces deux instructions :

-- le nombre de caractères à couper
set longueur to text returned of choix
-- en début ou en fin de champ
set ou to button returned of choix

Remarque. La marque des commentaires de code est -- dans AppleScript.

Si le bouton Annuler a été cliqué, une erreur est déclenchée par la commande display dialog - laquelle se base sur l'intitulé du bouton lui-même : seuls les intitulés « Annuler » et « Cancel » fonctionnent.

Cette erreur peut être capturée par un gestionnaire on error, afin de détecter le cas où l'utilisateur a annulé la saisie :

try
set choix to display dialog ...
on error
display dialog "Abandon du script !" with icon caution buttons {"OK"}
return
end try

Il reste ensuite à vérifier que la valeur saisie par l'utisateur est bien un entier naturel. On procède également à l'aide d'un bloc try, d'un gestionnaire on error et d'une boucle repeat :

repeat
try
set longueur to (longueur as integer) + 1
exit repeat
on error
display dialog "Vous devez entrer une valeur numérique !"
with icon caution buttons {"OK"}
set choix to display dialog "Combien de caractères supprimer ?"
default answer "2" buttons {"OK"}
set longueur to text returned of choix
end try
end repeat

Ce code est basé sur le fait que la tentative de transtypage de longueur déclenchera une erreur si celui-ci n'est pas un nombre.

II-C-4 - Appliquer l'édition du champ sur tous les morceaux sélectionnés.

L'édition de tous les morceaux sélectionnés se fait à l'aide d'une boucle repeat with, qui permet d'appliquer un traitement à tous les éléments d'une liste :

repeat with un_morceau in morceaux
tell un_morceau
...
end repeat

L'édition du champ est réalisée avec la commande text thru, qui permet d'extraire une portion d'une chaîne de caractères :

text idx1 thru idx2 of chaine

L'utilisation d'index à valeur négative permet de réaliser ce que nous souhaitons, soit couper des caractères au début ou à la fin d'une chaîne :

if ou is "Au début" then
set idx1 to longueur
set idx2 to -1
else
set idx1 to 1
set idx2 to -longueur
end if

Il reste finalement à identifier quel champ iTunes à éditer, à l'aide d'un test conditionnel sur la variable champ, et à positionner le champ considéré avec une commande set, à partir de la valeur obtenue par une commande get et modifiée par text thru :

if champ is item 1 of champs then
try
set name to text idx1 thru idx2 of (get name)
end try
else if champ is item 2 of champs then
try
set artist to text idx1 thru idx2 of (get artist)
end try
else
try
set album to text idx1 thru idx2 of (get album)
end try
end if

Voilà, le script est terminé ! La figure suivante montre son application à un jeu d'essai (suppression des numéros de piste).

Ce script pourra facilement être généralisé à d'autres champs éditables des morceaux iTunes, selon vos besoins.

III - Télécharger des couvertures d'album

III-A - Objectif

Bien qu'iTunes dispose de fonctionnalités d'importation automatique d'illustrations d'album, il arrive qu'elles soient inopérantes. Ce script AppleScript permet de rechercher sur le Web de telles illustrations.
L'idée consiste à sélectionner un morceau dans iTunes, puis à lancer le script pour qu'une recherche soit lancée sur Google Image, à l'aide des informations Artiste et Album extraites du morceau.

III-B - Algorithme

Le script suit l'algorithme suivant :

1. Obtenir le morceau sélectionné par l'utilisateur.

2. Obtenir les champs Artiste et Album du morceau.

3. Construire le critère de recherche.

4. Exécuter la recherche dans Safari.

III-C - Le script

III-C-1 - Obtenir le morceau sélectionné par l'utilisateur.

Le script commence par une instruction tell, qui indique à AppleScript quelle application est l'objet de nos actions :

tell application "iTunes"

L'instruction suivante, activate, permet de placer iTunes au premier plan.

Puis on demande à iTunes la liste des morceaux sélectionnés par l'utilisateur, et on l'affecte à la variable morceaux :

set morceaux to selection

On vérifie ensuite que l'utilisateur a bien sélectionné un morceau, et un seul, à l'aide d'une construction if-else if-else :

if morceaux is {} then
display dialog "Sélectionnez un morceau dans iTunes !"
with icon caution buttons {"Ok"}
else if morceaux's length ≠ 1 then
display dialog "Sélectionnez un seul morceau dans iTunes !"
with icon caution buttons {"Ok"}

La variable morceaux étant une liste, on teste si elle est vide (morceaux is {}) et si sa cardinalité est différente de 1 ( morceaux's length ≠ 1).

Une relvar R est en forme normale de Boyce-Codd (BCNF) si et seulement si les seules dépendances fonctionnelles non triviales auxquelles elle satisfait sont de la forme X ➔ Y, où X représente une surclé et Y un sous-ensemble d'attributs de l'en-tête de R.

Une relvar R est en forme normale de Boyce-Codd (BCNF) si et seulement si les seules dépendances fonctionnelles non triviales auxquelles elle satisfait sont de la forme X → Y, où X représente une surclé et Y un sous-ensemble d'attributs de l'en-tête de R.

Remarque. Dans l'Éditeur de scripts, le signe "différent de" est obtenu avec les touches Alt+=.

Si un seul morceau a été sélectionné, on l'obtient à l'aide d'un accès indexé à la liste :

else
set morceau to item 1 of morceaux

III-C-2 - Obtenir les champs Artiste et Album du morceau.

On extrait les champs Album et Artiste du morceau, contenus dans les propriétés album et artist de la classe track :

set lAlbum to (album of morceau) as string
set lArtist to (artist of morceau) as string

III-C-3 - Construire le critère de recherche.

On construit ensuite le critère de recherche, stocké dans une variable recherche, en tenant compte des cas où les champs Album et Artiste seraient vides :

if lAlbum is "" and lArtist is "" then
display dialog "Les champs Artiste et Albums sont vides.
Recherche impossible !" with icon caution buttons {"Ok"}
return
else if lAlbum is "" then
set recherche to lArtist as string
else if lArtist is "" then
set recherche to lAlbum as string
else
set recherche to (lArtist & " " & lAlbum)
end if

Ce critère de recherche est ensuite concaténé à l'URL du moteur de recherche, stockée sous la forme d'une propriété. L'opérateur & est utilisé pour concaténer ces deux chaînes de caractères :

property URL_recherche : "http://images.google.com/images?ie=ISO-8859-
1&hl=en&btnG=Google+Search&q="
set recherche to (URL_recherche & recherche)
log "URL : " & recherche

Remarque. La commande log permet d'afficher dans l'onglet Historique des événements une chaîne de caractères ou valeur d'une variable, à des fins de débogage. Ces affichages sont encadrés par des (* *). Voici ce que produit le log de notre script :

(*URL : http://images.google.com/images?ie=ISO-8859-
1&hl=en&btnG=Google+Search&q=Autechre Tri Repetae*)

III-C-4 - Exécuter la recherche dans Safari.

La recherche est lancée dans la navigateur Safari, à l'aide de la commande open :

tell application "Safari" to open location recherche

Remarque. La commande open fait partie de la plupart des bibliothèques de pilotage d'application. Elle présente parfois des paramètres ou des variantes, comme ici avec Safari, pour ouvrir une URL distante. Écrire open recherche conduirait Safari à tenter d'ouvrir un fichier sur l'ordinateur.

Il reste à l'utilisateur à sélectionner une image parmi celle proposées par Google Images, à l'afficher en taille réelle dans Safari, puis à la faire glisser dans la zone Illustration d'iTunes, en bas à gauche de la fenêtre. Il est possible de sélectionner tous les morceaux d'un album et de mettre à jour leur couverture avec un seul glisser-déposer.

Remarque. La recherche des paroles d'un morceau sélectionné peut être réalisée selon le même principe. Il suffit de lancer la recherche sur www.google.com et non plus images.google.com et d'utiliser les champs name et artist au lieu de album et artist.

IV - Révéler l'emplacement de morceaux

IV-A - Objectif

Ce script permet de révéler dans le Finder les fichiers audio associés aux morceaux ou à la liste d'écoute sélectionnés. Il est pratique pour changer leur emplacement sur le disque dur, récupérer certains morceaux puis les copier sur un support amovible, les envoyer par courrier, etc.

IV-B - Algorithme

Le script suit l'algorithme suivant :

- Obtenir les morceaux sélectionnés par l'utilisateur.

- Obtenir leur emplacement de stockage.

- Le révéler dans le Finder.

IV-C - Le script

IV-C-1 - Obtenir les morceaux sélectionnés par l'utilisateur.

On obtient les morceaux sélectionné dans la fenêtre iTunes, ainsi que leur nombre :

set liste to the selection of browser window 1
set nbre to (count liste)

Si l'utilisateur n'a pas sélectionné de morceaux, le script cherche si une éventuelle liste de lecture est sélectionnée :

if (nbre = 0) then
set liste to every track of view of front window

Remarque. Le mot-clé every permet d'obtenir tous les éléments d'un type d'objet particulier. Associé à la commande count, il permet de dénombrer. Ainsi, pour calculer le nombre de morceaux contenus dans la bibliothèque iTunes, on écrira :

tell application "iTunes" to count every track of playlist "Musique"

On teste ensuite les cas où la liste ne contient aucun morceau ou beaucoup trop, le seuil étant défini par une propriété MAX :

property MAX : 20
[...]
if (nbre = 0) then
display dialog "Vous devez sélectionner des morceaux à extraire
ou une liste de lecture !" with icon caution buttons {"Oups"}
return
else if (nbre > MAX) then
display dialog ("Trop de morceaux sont sélectionnés ! ("
& nbre as string) & ")" with icon caution buttons {"Oups"}
return
end if

Une boucle repeat with permet de parcourir la liste des morceaux et de les traiter un par un :

repeat with morceau in liste

IV-C-2 - Obtenir leur emplacement de stockage.

L'emplacement de chaque morceau est obtenu à l'aide de la propriété location :

set chemin_morceau to (location of morceau)

IV-C-3 - Révéler l'emplacement dans le Finder.

La commande reveal, contenue dans le dictionnaire de pilotage du Finder, est utilisée pour révéler un fichier à l'écran :

tell application "Finder"
try
reveal chemin_morceau

Remarque. Les morceaux sont simplement révélés dans leur dossier. Le script peut être adapté pour les déplacer (avec la commande move file) ou les dupliquer (avec la commande duplicate file).