|
@@ -35,6 +35,12 @@ class XmlDict:
|
|
value_node = self._get_value_node(key)
|
|
value_node = self._get_value_node(key)
|
|
return XmlDict._parse_value_node(value_node)
|
|
return XmlDict._parse_value_node(value_node)
|
|
|
|
|
|
|
|
+ def get(self, key, default):
|
|
|
|
+ try:
|
|
|
|
+ return self[key]
|
|
|
|
+ except KeyError:
|
|
|
|
+ return default
|
|
|
|
+
|
|
def items(self):
|
|
def items(self):
|
|
for key_node, value_node in zip(*[iter(self._node)] * 2):
|
|
for key_node, value_node in zip(*[iter(self._node)] * 2):
|
|
assert key_node.tag == 'key'
|
|
assert key_node.tag == 'key'
|
|
@@ -47,6 +53,28 @@ class XmlDict:
|
|
yield value
|
|
yield value
|
|
|
|
|
|
|
|
|
|
|
|
+class Track:
|
|
|
|
+
|
|
|
|
+ def __init__(self, track_dict):
|
|
|
|
+ assert isinstance(track_dict, XmlDict)
|
|
|
|
+ self._dict = track_dict
|
|
|
|
+ self._location_url = self._dict.get('Location', None)
|
|
|
|
+ self._play_count = self._dict.get('Play Count', 0)
|
|
|
|
+ self._last_play_dt = self._dict.get('Play Date UTC', None)
|
|
|
|
+
|
|
|
|
+ @property
|
|
|
|
+ def location_url(self):
|
|
|
|
+ return self._location_url
|
|
|
|
+
|
|
|
|
+ @property
|
|
|
|
+ def play_count(self):
|
|
|
|
+ return self._play_count
|
|
|
|
+
|
|
|
|
+ @property
|
|
|
|
+ def last_play_dt(self):
|
|
|
|
+ return self._last_play_dt
|
|
|
|
+
|
|
|
|
+
|
|
class XmlLibrary:
|
|
class XmlLibrary:
|
|
|
|
|
|
def __init__(self, path):
|
|
def __init__(self, path):
|
|
@@ -59,3 +87,8 @@ class XmlLibrary:
|
|
@property
|
|
@property
|
|
def id(self):
|
|
def id(self):
|
|
return self._id
|
|
return self._id
|
|
|
|
+
|
|
|
|
+ @property
|
|
|
|
+ def tracks(self):
|
|
|
|
+ for track_dict in self._root_dict['Tracks'].values():
|
|
|
|
+ yield Track(track_dict)
|