Browse Source

_tag_interface.OggOpus: implement set_uuid

Fabian Peter Hammerle 4 years ago
parent
commit
0983638e8b
3 changed files with 53 additions and 3 deletions
  1. 3 3
      symuid/_tag_interface.py
  2. 32 0
      symuid/_uuid.py
  3. 18 0
      tests/tag_interface/test_ogg_vorbis.py

+ 3 - 3
symuid/_tag_interface.py

@@ -5,7 +5,7 @@ import typing
 import mutagen.id3
 import mutagen.mp4
 
-from symuid._uuid import uuid_str_to_bytes
+from symuid._uuid import uuid_bytes_to_str, uuid_str_to_bytes
 
 
 class TagInterface(abc.ABC):
@@ -245,8 +245,8 @@ class OggOpus(_MutagenTagInterface):
         uuid_str = self._get_single_text(self._UUID_TAG_KEY)
         return uuid_str_to_bytes(uuid_str) if uuid_str else None
 
-    def set_track_uuid(self, uuid):
-        raise NotImplementedError()
+    def set_track_uuid(self, uuid: bytes) -> None:
+        self._mutagen_file[self._UUID_TAG_KEY] = uuid_bytes_to_str(uuid)
 
     def get_free_int(self, tag_label):
         raise NotImplementedError()

+ 32 - 0
symuid/_uuid.py

@@ -8,6 +8,18 @@ def uuid_str_to_int(uuid_str: str) -> int:
     return int(uuid_str.replace('-', ''), 16)
 
 
+def uuid_int_to_str(uuid_int: str) -> str:
+    """
+    >>> uuid_int_to_str(129260377989791042510121038559452028112)
+    '613ea4ac-a4cf-4026-8e99-1904b2bb5cd0'
+    >>> uuid_int_to_str(158993652234522396927268087548725737125)
+    '779d1046-d163-4b2b-8126-254f631cb6a5'
+    """
+    uuid_hex = hex(uuid_int)[2:]
+    return '-'.join((uuid_hex[0:8], uuid_hex[8:12], uuid_hex[12:16],
+                     uuid_hex[16:20], uuid_hex[20:]))
+
+
 def uuid_int_to_bytes(uuid_siv: int) -> bytes:
     """
     >>> uuid_int_to_bytes(129260377989791042510121038559452028112)
@@ -18,6 +30,16 @@ def uuid_int_to_bytes(uuid_siv: int) -> bytes:
     return uuid_siv.to_bytes(16, byteorder='big')
 
 
+def uuid_bytes_to_int(uuid_bytes: bytes) -> int:
+    """
+    >>> uuid_bytes_to_int(b'a>\\xa4\\xac\\xa4\\xcf@&\\x8e\\x99\\x19\\x04\\xb2\\xbb\\\\\\xd0')
+    129260377989791042510121038559452028112
+    >>> uuid_bytes_to_int(b'w\\x9d\\x10F\\xd1cK+\\x81&%Oc\\x1c\\xb6\\xa5')
+    158993652234522396927268087548725737125
+    """
+    return int.from_bytes(uuid_bytes, byteorder='big', signed=False)
+
+
 def uuid_str_to_bytes(uuid_str: str) -> bytes:
     """
     >>> uuid_str_to_bytes('613ea4ac-a4cf-4026-8e99-1904b2bb5cd0')
@@ -26,3 +48,13 @@ def uuid_str_to_bytes(uuid_str: str) -> bytes:
     b'w\\x9d\\x10F\\xd1cK+\\x81&%Oc\\x1c\\xb6\\xa5'
     """
     return uuid_int_to_bytes(uuid_str_to_int(uuid_str))
+
+
+def uuid_bytes_to_str(uuid_bytes: bytes) -> str:
+    """
+    >>> uuid_bytes_to_str(b'a>\\xa4\\xac\\xa4\\xcf@&\\x8e\\x99\\x19\\x04\\xb2\\xbb\\\\\\xd0')
+    '613ea4ac-a4cf-4026-8e99-1904b2bb5cd0'
+    >>> uuid_bytes_to_str(b'w\\x9d\\x10F\\xd1cK+\\x81&%Oc\\x1c\\xb6\\xa5')
+    '779d1046-d163-4b2b-8126-254f631cb6a5'
+    """
+    return uuid_int_to_str(uuid_bytes_to_int(uuid_bytes))

+ 18 - 0
tests/tag_interface/test_ogg_vorbis.py

@@ -59,3 +59,21 @@ def test_set_comment(empty_ogg_opus_path):
 def test_get_track_uuid(tracks_dir_path, track_name, expected_uuid):
     iface = OggOpus(mutagen.File(os.path.join(tracks_dir_path, track_name)))
     assert expected_uuid == iface.get_track_uuid()
+
+
+def test_set_track_uuid(empty_ogg_opus_path):
+    iface = OggOpus(mutagen.File(empty_ogg_opus_path))
+    assert iface.get_track_uuid() is None
+    uuid_a = b'\x9e\xa7\xc4\xf0\xda\xecE\xb7\xab\x9a\xba\x9f\xc6\xaa\xc0S'
+    iface.set_track_uuid(uuid_a)
+    assert iface.get_track_uuid() == uuid_a
+    uuid_b = b'_\xa0\xd7\xc0\xf3\x15F\x14\xbe\xe4idM=\x80\xb3'
+    iface.set_track_uuid(uuid_b)
+    assert iface.get_track_uuid() == uuid_b
+    iface.save()
+    iface_reread = OggOpus(mutagen.File(empty_ogg_opus_path))
+    assert iface_reread.get_track_uuid() == uuid_b
+    tags = mutagen.File(iface.track_path).tags
+    assert len(tags) == 1
+    assert tags.items()[0] == (
+        'symuid:uuid', ['5fa0d7c0-f315-4614-bee4-69644d3d80b3'])