Pergunta

Eu estou escrevendo um gerador de playlist Applescript. Parte do processo é ler o arquivo XML iTunes Library para obter uma lista de todos os gêneros na biblioteca do usuário. Esta é a implementação python, que funciona como eu gostaria:

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

O problema é que eu gostaria que o AppleScript para ser auto-suficiente e não requer que esse arquivo adicional estar presente (Estou pensando em fazer esta disponível para outras pessoas). E, tanto quanto eu posso dizer, Applescript não oferece qualquer tipo de capacidades de expressão regular para fora da caixa. Eu poderia repetir cada faixa na biblioteca para obter todos os gêneros, mas este é um proibitivamente longo processo que eu já faço uma vez ao construir a lista de reprodução. Então, eu estou à procura de alternativas.

Desde Applescript me permite executar um script shell e capturar os resultados, eu imagino que eu posso realizar o mesmo comportamento usando algum tipo de comando shell, seja grep, perl, ou qualquer outra coisa. Minhas habilidades de linha de comando * nix são extremamente enferrujado e eu estou procurando alguma orientação.

Então, em suma, eu gostaria de encontrar uma maneira de traduzir o código python acima em algo I pode chamar diretamente a partir da casca e obter um resultado similar. Obrigado!

Foi útil?

Solução

Por que você está usando regex para XML de análise? Por que não usar uma biblioteca XML adequada? Python tem algumas grandes utilitários como ElementTree que fazer andar o DOM muito mais fácil, e ele produz agradável, objetos amigáveis ??ao invés de cordas sem tipo.

Aqui estão algumas maneiras de analisar XML usando Applescript:

Applescript XML Parser (Disponível desde Tiger aparentemente)

XML Tools você também pode usar com Applescript

Lembre-se, apenas como Applescript pode ligar para o iTunes, pode ligar para outros utilitários instalados como estes.

Por último, porque não basta escrever a coisa toda em Python já que tem muito melhores ferramentas de desenvolvimento para depuração e corre muito mais rápido. Se você estiver executando o Leopard, você tem Python 2.5.1 pré-instalado.

Outras dicas

É criar um autônomo App a solução?

Olhe para py2app:

py2app, funciona como py2exe mas tem como alvo Mac OS

Veja

Se você já está trabalhando em AppleScript, porque não basta pedir iTunes diretamente?

tell application "iTunes" to get genre of every track of library playlist 1
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top