|
@@ -155,15 +155,6 @@ class MP4(_MutagenTagInterface):
|
|
|
mutagen_file.tags
|
|
|
super().__init__(mutagen_file)
|
|
|
|
|
|
- def _get_single(self, tag_label):
|
|
|
- tag = self._mutagen_file.tags.get(tag_label, None)
|
|
|
- if tag is None:
|
|
|
-
|
|
|
- return None
|
|
|
- if len(tag) == 1:
|
|
|
- return tag[0]
|
|
|
- raise ValueError(tag)
|
|
|
-
|
|
|
@staticmethod
|
|
|
def _freeform_to_int(freeform):
|
|
|
|
|
@@ -181,18 +172,36 @@ class MP4(_MutagenTagInterface):
|
|
|
value = MP4._freeform_to_int(values[0])
|
|
|
yield (re.sub(r'^----:', '', label), value)
|
|
|
|
|
|
- def _get_free(self, tag_label):
|
|
|
+ def _get_free(self, tag_label) -> typing.List[mutagen.mp4.MP4FreeForm]:
|
|
|
|
|
|
|
|
|
- return self._get_single('----:' + tag_label)
|
|
|
+ tag = self._mutagen_file.tags.get('----:' + tag_label, None)
|
|
|
+ if not tag:
|
|
|
+ raise KeyError(tag_label)
|
|
|
+ return tag
|
|
|
+
|
|
|
+ def _get_free_ints(self, tag_label) -> typing.Tuple[int]:
|
|
|
+ return tuple(self._freeform_to_int(i) for i in self._get_free(tag_label))
|
|
|
|
|
|
def get_free_int(self, tag_label):
|
|
|
- tag = self._get_free(tag_label)
|
|
|
- return None if tag is None else MP4._freeform_to_int(tag)
|
|
|
+ try:
|
|
|
+ ints = self._get_free_ints(tag_label)
|
|
|
+ except KeyError:
|
|
|
+ return None
|
|
|
+ if len(ints) != 1:
|
|
|
+ raise ValueError((tag_label, ints))
|
|
|
+ return ints[0]
|
|
|
|
|
|
- def _get_free_uuid(self, tag_label):
|
|
|
- tag = self._get_free(tag_label)
|
|
|
- assert tag is None or tag.dataformat == mutagen.mp4.AtomDataType.UUID, tag.dataformat
|
|
|
+ def get_free_int_ratio(self, tag_label) -> typing.Tuple[int, int]:
|
|
|
+ ints = self._get_free_ints(tag_label)
|
|
|
+ if len(ints) != 2:
|
|
|
+ raise ValueError((tag_label, ints))
|
|
|
+ return ints
|
|
|
+
|
|
|
+ def _get_free_uuid(self, tag_label) -> mutagen.mp4.MP4FreeForm:
|
|
|
+ tag, = self._get_free(tag_label)
|
|
|
+ if tag.dataformat != mutagen.mp4.AtomDataType.UUID:
|
|
|
+ raise ValueError(tag)
|
|
|
return tag
|
|
|
|
|
|
def _set_free(self, tag_label, dataformat, data):
|
|
@@ -220,13 +229,21 @@ class MP4(_MutagenTagInterface):
|
|
|
)
|
|
|
|
|
|
def get_comment(self):
|
|
|
- return self._get_single(self._COMMENT_TAG_KEY)
|
|
|
+ tag = self._mutagen_file.tags.get(self._COMMENT_TAG_KEY, None)
|
|
|
+ if tag is None:
|
|
|
+ return None
|
|
|
+ if len(tag) == 1:
|
|
|
+ return tag[0]
|
|
|
+ raise ValueError(tag)
|
|
|
|
|
|
def set_comment(self, comment: str) -> None:
|
|
|
self._mutagen_file[self._COMMENT_TAG_KEY] = [comment]
|
|
|
|
|
|
def get_track_uuid(self):
|
|
|
- return self._get_free_uuid(self._UUID_TAG_KEY)
|
|
|
+ try:
|
|
|
+ return self._get_free_uuid(self._UUID_TAG_KEY)
|
|
|
+ except KeyError:
|
|
|
+ return None
|
|
|
|
|
|
def set_track_uuid(self, uuid):
|
|
|
return self._set_free_uuid(self._UUID_TAG_KEY, uuid)
|