Browse Source

implemented library.itunes.Track

Fabian Peter Hammerle 5 years ago
parent
commit
848346d3da
2 changed files with 38 additions and 17 deletions
  1. 5 17
      symuid-import-itunes
  2. 33 0
      symuid/library/itunes.py

+ 5 - 17
symuid-import-itunes

@@ -54,32 +54,20 @@ 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_dict in lib._root_dict['Tracks'].values():
-        try:
-            track_url = track_dict['Location']
-        except KeyError:
-            track_url = None
-        try:
-            play_count = track_dict['Play Count']
-        except KeyError:
-            play_count = 0
-        try:
-            last_play_dt = track_dict['Play Date UTC']
-        except KeyError:
-            last_play_dt = None
+    for track in lib.tracks:
         # TODO create tag if last_play_dt is None
-        if last_play_dt and track_url and track_url.startswith(root_url):
+        if track.last_play_dt and track.location_url and track.location_url.startswith(root_url):
             track_path = os.path.join(
                 root_path,
-                urllib.parse.unquote(track_url[len(root_url):]),
+                urllib.parse.unquote(track.location_url[len(root_url):]),
             )
             # TODO dt=dt.datetime.now()
             set_play_count_tag(
                 track_path=track_path,
                 player='itunes',
                 library_id=lib.id,
-                reg_dt=last_play_dt,
-                play_count=play_count,
+                reg_dt=track.last_play_dt,
+                play_count=track.play_count,
             )
 
 

+ 33 - 0
symuid/library/itunes.py

@@ -35,6 +35,12 @@ class XmlDict:
         value_node = self._get_value_node(key)
         return XmlDict._parse_value_node(value_node)
 
+    def get(self, key, default):
+        try:
+            return self[key]
+        except KeyError:
+            return default
+
     def items(self):
         for key_node, value_node in zip(*[iter(self._node)] * 2):
             assert key_node.tag == 'key'
@@ -47,6 +53,28 @@ class XmlDict:
             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:
 
     def __init__(self, path):
@@ -59,3 +87,8 @@ class XmlLibrary:
     @property
     def id(self):
         return self._id
+
+    @property
+    def tracks(self):
+        for track_dict in self._root_dict['Tracks'].values():
+            yield Track(track_dict)