Browse Source

implemented library.itunes.XmlDict.values()

Fabian Peter Hammerle 5 years ago
parent
commit
e22d6fb028
2 changed files with 17 additions and 30 deletions
  1. 4 27
      symuid-import-itunes
  2. 13 3
      symuid/library/itunes.py

+ 4 - 27
symuid-import-itunes

@@ -9,35 +9,12 @@ import mutagen.mp4
 import os
 import symuid.library.itunes
 import urllib.parse
-import xml.etree.ElementTree
 
 
 def generate_play_count_tag_label(player, library_id, reg_dt):
     return 'symuid:pcnt:{}:{}:{}'.format(player, library_id, int(reg_dt.timestamp()))
 
 
-def get_itunes_dict_value_node(dict_node, key):
-    assert isinstance(dict_node, xml.etree.ElementTree.Element)
-    assert isinstance(key, str)
-    # WORKAROUND method getnext() is sadly not available
-    for child_idx, child_node in enumerate(dict_node):
-        if child_node.tag == 'key' and child_node.text == key:
-            return dict_node[child_idx + 1]
-    raise KeyError()
-
-
-def get_itunes_dict_value(dict_node, key):
-    value_node = get_itunes_dict_value_node(dict_node, key)
-    if value_node.tag == 'string':
-        return value_node.text
-    elif value_node.tag == 'integer':
-        return int(value_node.text)
-    elif value_node.tag == 'date':
-        return dateutil.parser.parse(value_node.text)
-    else:
-        return value_node
-
-
 def set_play_count_tag(track_path, player, library_id, reg_dt, play_count):
     assert isinstance(reg_dt, dt.datetime), reg_dt
     tag_label = generate_play_count_tag_label(
@@ -77,17 +54,17 @@ def set_play_count_tag(track_path, player, library_id, reg_dt, play_count):
 def symuid_import_itunes(xml_library_path, root_url, root_path):
     root_path = os.path.expanduser(root_path)
     lib = symuid.library.itunes.XmlLibrary(xml_library_path)
-    for track_node in lib._root_dict['Tracks'].iterfind('./dict'):
+    for track_dict in lib._root_dict['Tracks'].values():
         try:
-            track_url = get_itunes_dict_value(track_node, 'Location')
+            track_url = track_dict['Location']
         except KeyError:
             track_url = None
         try:
-            play_count = get_itunes_dict_value(track_node, 'Play Count')
+            play_count = track_dict['Play Count']
         except KeyError:
             play_count = 0
         try:
-            last_play_dt = get_itunes_dict_value(track_node, 'Play Date UTC')
+            last_play_dt = track_dict['Play Date UTC']
         except KeyError:
             last_play_dt = None
         # TODO create tag if last_play_dt is None

+ 13 - 3
symuid/library/itunes.py

@@ -18,16 +18,26 @@ class XmlDict:
                 return self._node[child_idx + 1]
         raise KeyError(key)
 
-    def __getitem__(self, key):
-        value_node = self._get_value_node(key)
+    @staticmethod
+    def _parse_value_node(value_node):
         if value_node.tag == 'string':
             return value_node.text
         elif value_node.tag == 'integer':
             return int(value_node.text)
         elif value_node.tag == 'date':
             return dateutil.parser.parse(value_node.text)
+        elif value_node.tag == 'dict':
+            return XmlDict(value_node)
         else:
-            return value_node
+            raise ValueError(value_node.tag)
+
+    def __getitem__(self, key):
+        value_node = self._get_value_node(key)
+        return XmlDict._parse_value_node(value_node)
+
+    def values(self):
+        for key_node, value_node in zip(*[iter(self._node)] * 2):
+            yield XmlDict._parse_value_node(value_node)
 
 
 class XmlLibrary: