Question

J'écris un générateur de playlist AppleScript. Une partie du processus est de lire le fichier XML bibliothèque iTunes pour obtenir une liste de tous les genres dans la bibliothèque d'un utilisateur. Ceci est la mise en œuvre du python, qui fonctionne comme je voudrais:

    #!/usr/bin/env python

# script to get all of the genres from itunes

import re,sys,sets


## Boosted from the internet to handle HTML entities in Genre names
def unescape(text):
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # character reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # named entity
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # leave as is
    return re.sub("&#?\w+;", fixup, text)


# probably faster to use a regex than to try to walk
# the entire xml document and aggregate the genres
try:
    xml_path = "/Users/%s/Music/iTunes/iTunes Music Library.xml" % sys.argv[1]
except:
    print '\tUsage: python '+sys.argv[0]+' <your OSX username>'
    raise SystemExit

pattern = "<key>Genre</key><string>([^<]+)</string>" 

try:
    xml = file(xml_path,'r').read()
except:
    print '\tUnable to load your iTunes Library XML file'
    raise SystemExit

matches = re.findall(pattern,xml)
uniques = map(unescape,list(sets.Set(matches)))
## need to write these out somewhere so the applescript can read them
sys.stdout.write('|'.join(uniques))
raise SystemExit

Le problème est, je voudrais le AppleScript être autonome et ne nécessite pas que ce fichier supplémentaire soit présent (je prévois de les mettre à disposition d'autres personnes). Et, pour autant que je peux dire, AppleScript ne propose aucun type de capacités d'expression régulière hors de la boîte. Je pourrais boucler sur chaque piste dans la bibliothèque pour obtenir tous les genres, mais ce processus est beaucoup trop longtemps que je fais déjà une fois lors de la construction de la liste de lecture. Donc, je suis à la recherche d'alternatives.

Depuis AppleScript me permet de lancer un script shell et capturer les résultats, je pense que je peux accomplir le même comportement en utilisant un certain type de commande shell, que ce soit grep, perl, ou autre chose. Mes compétences * de ligne de commande nix sont extrêmement rouillés et je suis à la recherche de quelques conseils.

Donc, en bref, je voudrais trouver un moyen de traduire le code Python ci-dessus dans quelque chose que je peux appeler directement à partir du shell et d'obtenir un résultat similaire. Merci!

Était-ce utile?

La solution

Pourquoi utilisez-vous regex pour analyser XML? Pourquoi ne pas utiliser une bibliothèque XML appropriée? Python a quelques grands utilitaires comme ElementTree qui font marcher les DOM beaucoup plus facile, et il donne bien, des objets sympathiques plutôt que des chaînes non typées.

Voici quelques façons de XML d'analyse syntaxique en utilisant AppleScript:

AppleScript XML Parser (Disponible depuis Tiger apparemment)

Outils XML, vous pouvez également utiliser avec AppleScript

Rappelez-vous, tout comme AppleScript peut accrocher dans iTunes, il peut se connecter à d'autres utilitaires installés comme ceux-ci.

Enfin, pourquoi ne pas simplement écrire la chose en Python, car il a bien meilleurs outils de développement pour le débogage et fonctionne beaucoup plus vite. Si vous utilisez Leopard, vous avez Python 2.5.1 pré-installé.

Autres conseils

crée une application autonome de la solution?

Regardez py2app:

py2app, fonctionne comme py2exe mais cible Mac OS

Voir

Si vous travaillez déjà en AppleScript, pourquoi ne pas simplement demander iTunes directement?

tell application "iTunes" to get genre of every track of library playlist 1
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top