Browse Source

_tag_interface.OggOpus: implement get_free_ints()

Fabian Peter Hammerle 4 years ago
parent
commit
0a0e7191b4
2 changed files with 24 additions and 3 deletions
  1. 9 3
      symuid/_tag_interface.py
  2. 15 0
      tests/tag_interface/test_ogg_vorbis.py

+ 9 - 3
symuid/_tag_interface.py

@@ -252,8 +252,14 @@ class OggOpus(_MutagenTagInterface):
         dec = self._get_single_text(tag_label)
         return int(dec) if dec else None
 
+    def get_free_ints(self, tag_label_prefix: str) \
+            -> typing.Iterator[typing.Tuple[str, int]]:
+        for tag_key, tag_value in self._mutagen_file.items():
+            if tag_key == tag_label_prefix \
+                    or tag_key.startswith(tag_label_prefix + ':'):
+                if len(tag_value) > 1:
+                    raise ValueError((self.track_path, tag_key, tag_value))
+                yield (tag_key, int(tag_value[0]))
+
     def set_free_int(self, tag_label: str, data: int) -> None:
         self._mutagen_file[tag_label] = str(data)
-
-    def get_free_ints(self, tag_label_prefix):
-        raise NotImplementedError()

+ 15 - 0
tests/tag_interface/test_ogg_vorbis.py

@@ -90,6 +90,21 @@ def test_get_free_int(tracks_dir_path, track_name, tag_label, expected_int):
     assert expected_int == iface.get_free_int(tag_label)
 
 
+def test_get_free_ints(tracks_dir_path):
+    iface = OggOpus(mutagen.File(os.path.join(
+        tracks_dir_path, 'ogg-opus-typical.opus')))
+    assert not list(iface.get_free_ints('symuid:none'))
+    assert list(iface.get_free_ints('tracknumber')) == [('tracknumber', 21)]
+    assert not list(iface.get_free_ints('tracknum'))
+    pcnt_tags = {('symuid:pcnt:player:library:1572098158', 42),
+                 ('symuid:pcnt:player:library:1572098177', 43)}
+    assert set(iface.get_free_ints('symuid:pcnt:player:library')) == pcnt_tags
+    assert set(iface.get_free_ints('symuid:pcnt:player')) == pcnt_tags
+    assert set(iface.get_free_ints('symuid:pcnt')) == pcnt_tags
+    assert set(iface.get_free_ints('symuid:pcnt:player:library:1572098158')) \
+        == {('symuid:pcnt:player:library:1572098158', 42)}
+
+
 def test_set_free_int(empty_ogg_opus_path):
     iface = OggOpus(mutagen.File(empty_ogg_opus_path))
     assert iface.get_free_int('tracknumber') is None