Hatena::Groupborn1981

gamellaの日記

 | 

2008-10-19

iTunes Music Library.xmlをPythonでパースする方法

15:48

調べてなかなか見つけることができなかったので、iTunesのコンテンツ情報が記載されたXMLpythonパースする方法を記載しておきます。

# -*- coding: utf-8 -*-

from xml.etree.cElementTree import iterparse
import base64, datetime, re, urllib

unmarshallers = {
  # collections
  "array": lambda x: [v.text for v in x],
  "dict": lambda x:
      dict((x[i].text, x[i+1].text) for i in range(0, len(x), 2)),
  "key": lambda x: x.text or "",
  # simple types
  "string": lambda x: x.text or "",
  "data": lambda x: base64.decodestring(x.text or ""),
  "date": lambda x: datetime.datetime(*map(int, re.findall("\d+", x.text))),
  "true": lambda x: True,
  "false": lambda x: False,
  "real": lambda x: float(x.text),
  "integer": lambda x: int(x.text),
}

def load(file):
  parser = iterparse(file)
  for action, elem in parser:
    unmarshal = unmarshallers.get(elem.tag)
    if unmarshal:
      data = unmarshal(elem)
      elem.clear()
      elem.text = data
    elif elem.tag != "plist":
      raise IOError("unknown plist type: %r" % elem.tag)
  return parser.root[0].text

# usage

itunes = load("iTunes Music Library.xml")

tracks = itunes["Tracks"]
tracks_keys = tracks.keys()
for i in tracks_keys:
  #FIXME: encode problem
  try:
    print i, tracks[i]["Artist"], "-", tracks[i]["Name"]
    print tracks[i]["Location"]
  except:
    pass

playlists = itunes["Playlists"]
for playlist in playlists:
  #FIXME: encode problem
  try:
    print "Playlist - ", playlist["Name"]
    for track_id in playlist["Playlist Items"]:
      print track_id["Track ID"],
  except:
    pass

ソースコードを簡単にするため、encodeの問題でprint内でエラーが起きたときは無視してます。これで各曲と各プレイリストの情報が取得できます。elementtreeを知らない人は黒魔術に見えるかもしれません。ただ、現状でPythonXMLを近代的に扱う場合、xpathのサブセットをサポートするelementtreeの一択なので、Python使う方は覚えておいて損ないです。

JeannieJeannie 2012/01/06 15:46 Whoveer edits and publishes these articles really knows what they're doing.

ktmqaateabktmqaateab 2012/01/06 20:04 82mThF <a href="http://dmwafblfmywr.com/">dmwafblfmywr</a>

iyrramzdmiyrramzdm 2012/01/07 23:15 TkeEKl , [url=http://ydykgwyptiic.com/]ydykgwyptiic[/url], [link=http://lbulyjlhlyat.com/]lbulyjlhlyat[/link], http://czarmxssrcjj.com/

kghcgxhbkghcgxhb 2012/01/09 22:30 iP3dq3 <a href="http://odtskzuokckk.com/">odtskzuokckk</a>

ゲスト



トラックバック - http://born1981.g.hatena.ne.jp/gamella/20081019
 |