Browse Source

added abstract symuid._tag_interface.TagInterface

Fabian Peter Hammerle 4 years ago
parent
commit
9a3b2f978f
3 changed files with 61 additions and 16 deletions
  1. 11 8
      symuid/__init__.py
  2. 45 3
      symuid/_tag_interface.py
  3. 5 5
      tests/tag_interface/id3.py

+ 11 - 8
symuid/__init__.py

@@ -4,7 +4,7 @@ import re
 
 import mutagen
 
-import symuid.tag_interface
+from symuid import _tag_interface
 
 
 def _timestamp_to_utc_dt(ts_sec):
@@ -46,15 +46,18 @@ class Track:
     PATH_DEFAULT_IGNORE_REGEX = r'\.(itdb|itc2|itl|jpg|midi?|plist|xml|zip)$'
 
     def __init__(self, path):
-        mutagen_file = mutagen.File(path)
+        self._iface = self._select_tag_interface(path)
+
+    @staticmethod
+    def _select_tag_interface(track_path) -> _tag_interface.TagInterface:
+        mutagen_file = mutagen.File(track_path)
         if mutagen_file is None:
-            raise NotImplementedError(path)
+            raise NotImplementedError(track_path)
         if isinstance(mutagen_file.tags, mutagen.id3.ID3):
-            self._iface = symuid.tag_interface.ID3(mutagen_file)
-        elif isinstance(mutagen_file.tags, mutagen.mp4.MP4Tags):
-            self._iface = symuid.tag_interface.MP4(mutagen_file)
-        else:
-            raise NotImplementedError((path, type(mutagen_file)))
+            return _tag_interface.ID3(mutagen_file)
+        if isinstance(mutagen_file.tags, mutagen.mp4.MP4Tags):
+            return _tag_interface.MP4(mutagen_file)
+        raise NotImplementedError((track_path, type(mutagen_file)))
 
     @property
     def path(self):

+ 45 - 3
symuid/tag_interface.py → symuid/_tag_interface.py

@@ -1,10 +1,52 @@
+import abc
 import re
 
 import mutagen.id3
 import mutagen.mp4
 
 
-class _mutagen:
+class TagInterface(abc.ABC):
+
+    @abc.abstractproperty
+    def track_path(self):
+        pass
+
+    @abc.abstractmethod
+    def get_comment(self):
+        pass
+
+    @abc.abstractmethod
+    def set_comment(self, comment):
+        pass
+
+    @abc.abstractmethod
+    def get_track_uuid(self):
+        pass
+
+    @abc.abstractmethod
+    def set_track_uuid(self, uuid):
+        pass
+
+    @abc.abstractmethod
+    def save(self):
+        pass
+
+    @abc.abstractmethod
+    def get_free_int(self, tag_label):
+        pass
+
+    @abc.abstractmethod
+    def set_free_int(self, tag_label, data):
+        pass
+
+    @abc.abstractmethod
+    def get_free_ints(self, tag_label_prefix):
+        pass
+
+
+class _MutagenTagInterface(TagInterface):
+
+    # pylint: disable=abstract-method
 
     def __init__(self, mutagen_file):
         self._mutagen_file = mutagen_file
@@ -17,7 +59,7 @@ class _mutagen:
         self._mutagen_file.save()
 
 
-class ID3(_mutagen):
+class ID3(_MutagenTagInterface):
 
     # http://id3.org/id3v2.4.0-frames#4.1.
     _UFID_OWNER_ID = 'symuid'
@@ -81,7 +123,7 @@ class ID3(_mutagen):
         return tag
 
 
-class MP4(_mutagen):
+class MP4(_MutagenTagInterface):
 
     _UUID_TAG_KEY = 'symuid:uuid'
 

+ 5 - 5
tests/tag_interface/id3.py

@@ -1,11 +1,11 @@
-import pytest
-
-from symuid.tag_interface import ID3
-
-import mutagen
 import os
 import shutil
 
+import mutagen
+import pytest
+
+from symuid._tag_interface import ID3
+
 
 @pytest.fixture
 def empty_id3_iface(tmpdir, tracks_dir_path):