Я пишу генератор списков воспроизведения Applescript. Частью процесса является чтение XML-файла iTunes Library, чтобы получить список всех жанров в пользовательской библиотеке. Это реализация Python, которая работает так, как мне хотелось бы:
#!/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
Проблема в том, что я хотел бы, чтобы Applescript был автономным и не требовал наличия этого дополнительного файла (я планирую сделать его доступным для других людей). И, насколько я могу судить, Applescript не предлагает никаких возможностей регулярных выражений из коробки. Я мог бы пройтись по каждой дорожке в библиотеке, чтобы получить все жанры, но это запредельно долгий процесс, который я уже однажды делал при создании списка воспроизведения. Итак, я ищу альтернативы.
Поскольку Applescript позволяет мне запускать сценарий оболочки и фиксировать результаты, я представляю, что могу выполнить то же поведение, используя некоторый тип команды оболочки, будь то grep, perl или что-то еще. Мои навыки работы с командной строкой * nix чрезвычайно ржавые, и я ищу какое-то руководство.
Итак, вкратце, я хотел бы найти способ перевести вышеприведенный код Python в то, что я могу вызвать непосредственно из оболочки и получить аналогичный результат. Спасибо!