Pregunta

Estoy escribiendo un generador de lista de reproducción Applescript. Parte del proceso es leer el archivo XML de la biblioteca de iTunes para obtener una lista de todos los géneros en la biblioteca de un usuario. Esta es la implementación de Python, que trabaja como me gustaría:

    #!/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

El problema es que me gustaría que el Applescript ser autónomo y no requiere que este archivo adicional esté presente (planeo hacer esto a disposición de otras personas). Y, por lo que yo puedo decir, Applescript no ofrece ningún tipo de capacidades de expresiones regulares fuera de la caja. Podría bucle sobre cada pista en la biblioteca para obtener todos los géneros, pero esto es un proceso excesivamente largo que ya lo hago una vez al construir la lista de reproducción. Por lo tanto, estoy buscando alternativas.

Desde Applescript me permite ejecutar un script de shell y la captura de los resultados, me imagino que puedo lograr el mismo comportamiento utilizando algún tipo de comando shell, ya sea grep, Perl, o alguna otra cosa. Mis comando * nix habilidades de línea son muy oxidado y estoy en busca de alguna orientación.

Así que, en resumen, me gustaría encontrar una manera de traducir el código Python anterior en algo que pueda llamar directamente de la cáscara y conseguir un resultado similar. Gracias!

¿Fue útil?

Solución

¿Por qué utiliza expresiones regulares para analizar XML? ¿Por qué no usar una librería XML adecuado? Python tiene algunas utilidades como elementtree que hacen caminar el DOM mucho más fácil, y se produce agradable, objetos amigables en lugar de cadenas sin tipo.

Estas son algunas formas de análisis sintáctico XML utilizando Applescript:

Applescript Analizador XML (Disponible desde que Tiger aparentemente)

herramientas XML también se puede utilizar con Applescript

Recuerde que, al igual que Applescript puede conectar a iTunes, que puede colgarse en otras utilidades instaladas como estos.

Por último, ¿por qué no escribir todo el asunto en Python, ya que tiene mucho mejores herramientas de desarrollo para la depuración y corre mucho más rápido. Si está ejecutando Leopard, usted tiene pre-instalado Python 2.5.1.

Otros consejos

es la creación de una aplicación independiente de la solución?

Mira py2app:

py2app, funciona como py2exe pero se dirige a Mac OS

Ver

Si ya está trabajando en AppleScript, ¿por qué no pedir directamente de iTunes?

tell application "iTunes" to get genre of every track of library playlist 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top