|
@@ -26,20 +26,24 @@ class ID3(_mutagen):
|
|
mutagen_file.tags
|
|
mutagen_file.tags
|
|
self._mutagen_file = mutagen_file
|
|
self._mutagen_file = mutagen_file
|
|
|
|
|
|
|
|
+ def _get_single_text(self, tag_label):
|
|
|
|
+ tag = self._mutagen_file.tags.get(tag_label, None)
|
|
|
|
+ if tag is None:
|
|
|
|
+ # {}.get('a') == None
|
|
|
|
+ return None
|
|
|
|
+ elif len(tag.text) == 1:
|
|
|
|
+ return tag.text[0]
|
|
|
|
+ else:
|
|
|
|
+ raise ValueError(tag)
|
|
|
|
+
|
|
def get_free_ints(self, tag_label_prefix):
|
|
def get_free_ints(self, tag_label_prefix):
|
|
for t in self._mutagen_file.tags.getall('TXXX:' + tag_label_prefix):
|
|
for t in self._mutagen_file.tags.getall('TXXX:' + tag_label_prefix):
|
|
assert len(t.text) == 1, t
|
|
assert len(t.text) == 1, t
|
|
yield (t.desc, int(t.text[0]))
|
|
yield (t.desc, int(t.text[0]))
|
|
|
|
|
|
def get_free_int(self, tag_label):
|
|
def get_free_int(self, tag_label):
|
|
- tags = [t for t in self.get_free_ints(tag_label)]
|
|
|
|
- if len(tags) == 0:
|
|
|
|
- # {}.get('a') == None
|
|
|
|
- return None
|
|
|
|
- else:
|
|
|
|
- assert len(tags) == 1, tags
|
|
|
|
- assert tags[0][0] == tag_label, tag
|
|
|
|
- return tags[0][1]
|
|
|
|
|
|
+ text = self._get_single_text('TXXX:' + tag_label)
|
|
|
|
+ return int(text) if text else None
|
|
|
|
|
|
def set_free_int(self, tag_label, data):
|
|
def set_free_int(self, tag_label, data):
|
|
# mutagen.id3._specs.EncodedTextSpec.write encodes 'desc' and 'text'
|
|
# mutagen.id3._specs.EncodedTextSpec.write encodes 'desc' and 'text'
|
|
@@ -52,6 +56,9 @@ class ID3(_mutagen):
|
|
self._mutagen_file.tags.add(tag)
|
|
self._mutagen_file.tags.add(tag)
|
|
return tag
|
|
return tag
|
|
|
|
|
|
|
|
+ def get_comment(self):
|
|
|
|
+ return self._get_single_text('COMM::eng')
|
|
|
|
+
|
|
def get_track_uuid(self):
|
|
def get_track_uuid(self):
|
|
for ufid in self._mutagen_file.tags.getall('UFID'):
|
|
for ufid in self._mutagen_file.tags.getall('UFID'):
|
|
if ufid.owner == self._UFID_OWNER_ID:
|
|
if ufid.owner == self._UFID_OWNER_ID:
|
|
@@ -75,6 +82,16 @@ class MP4(_mutagen):
|
|
mutagen_file.tags
|
|
mutagen_file.tags
|
|
self._mutagen_file = mutagen_file
|
|
self._mutagen_file = mutagen_file
|
|
|
|
|
|
|
|
+ def _get_single(self, tag_label):
|
|
|
|
+ tag = self._mutagen_file.tags.get(tag_label, None)
|
|
|
|
+ if tag is None:
|
|
|
|
+ # {}.get('a') == None
|
|
|
|
+ return None
|
|
|
|
+ elif len(tag) == 1:
|
|
|
|
+ return tag[0]
|
|
|
|
+ else:
|
|
|
|
+ raise ValueError(tag)
|
|
|
|
+
|
|
@staticmethod
|
|
@staticmethod
|
|
def _freeform_to_int(freeform):
|
|
def _freeform_to_int(freeform):
|
|
# "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
|
|
# "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
|
|
@@ -95,15 +112,7 @@ class MP4(_mutagen):
|
|
def _get_free(self, tag_label):
|
|
def _get_free(self, tag_label):
|
|
# freeform keys start with '----'
|
|
# freeform keys start with '----'
|
|
# http://mutagen.readthedocs.io/en/latest/api/mp4.html
|
|
# http://mutagen.readthedocs.io/en/latest/api/mp4.html
|
|
- try:
|
|
|
|
- tags = self._mutagen_file.tags['----:' + tag_label]
|
|
|
|
- except KeyError:
|
|
|
|
- # {}.get('a') == None
|
|
|
|
- return None
|
|
|
|
- if len(tags) == 1:
|
|
|
|
- return tags[0]
|
|
|
|
- else:
|
|
|
|
- raise ValueError(tags)
|
|
|
|
|
|
+ return self._get_single('----:' + tag_label)
|
|
|
|
|
|
def get_free_int(self, tag_label):
|
|
def get_free_int(self, tag_label):
|
|
t = self._get_free(tag_label)
|
|
t = self._get_free(tag_label)
|
|
@@ -138,6 +147,9 @@ class MP4(_mutagen):
|
|
data=data,
|
|
data=data,
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+ def get_comment(self):
|
|
|
|
+ return self._get_single('\xa9cmt')
|
|
|
|
+
|
|
def get_track_uuid(self):
|
|
def get_track_uuid(self):
|
|
return self._get_free_uuid(self._UUID_TAG_KEY)
|
|
return self._get_free_uuid(self._UUID_TAG_KEY)
|
|
|
|
|