#!/usr/bin/python # Parse Apple's plist XML format, as used by iTunes for storing music # information. # Written by Fredrik Lundh as originally documented at # http://online.effbot.org/2005_03_01_archive.htm # That's not available anymore, though the Wayback Machine has it. try: from xml.etree.cElementTree import iterparse except ImportError: from xml.etree import iterparse import base64, datetime, re, os 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