|
@@ -27,6 +27,17 @@ class Track:
|
|
def has_mp4_tags(self):
|
|
def has_mp4_tags(self):
|
|
return self.has_tags and isinstance(self._mutagen.tags, mutagen.mp4.MP4Tags)
|
|
return self.has_tags and isinstance(self._mutagen.tags, mutagen.mp4.MP4Tags)
|
|
|
|
|
|
|
|
+ def _set_mp4_freeform_int(self, tag_label, data):
|
|
|
|
+ assert isinstance(data, int)
|
|
|
|
+ tag = mutagen.mp4.MP4FreeForm(
|
|
|
|
+ # "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
|
|
|
|
+ dataformat=mutagen.mp4.AtomDataType.INTEGER,
|
|
|
|
+ # TODO set byte length properly
|
|
|
|
+ data=data.to_bytes(1, byteorder='big', signed=True),
|
|
|
|
+ )
|
|
|
|
+ self._mutagen.tags['----:' + tag_label] = tag
|
|
|
|
+ return tag
|
|
|
|
+
|
|
def register_play_count(self, player, library_id, register_dt, play_count, tag_set_cb=None):
|
|
def register_play_count(self, player, library_id, register_dt, play_count, tag_set_cb=None):
|
|
assert isinstance(register_dt, dt.datetime), register_dt
|
|
assert isinstance(register_dt, dt.datetime), register_dt
|
|
assert isinstance(play_count, int), play_count
|
|
assert isinstance(play_count, int), play_count
|
|
@@ -63,13 +74,9 @@ class Track:
|
|
)
|
|
)
|
|
assert reg_count == play_count, (reg_count, play_count)
|
|
assert reg_count == play_count, (reg_count, play_count)
|
|
else:
|
|
else:
|
|
- self._mutagen.tags[tag_label_mp4] = tag = mutagen.mp4.MP4FreeForm(
|
|
|
|
- # "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
|
|
|
|
- # TODO set byte length properly
|
|
|
|
- # setting signed=True just to be explicit here
|
|
|
|
- # (irrelevant for positive integers)
|
|
|
|
- data=play_count.to_bytes(1, byteorder='big', signed=True),
|
|
|
|
- dataformat=mutagen.mp4.AtomDataType.INTEGER,
|
|
|
|
|
|
+ tag = self._set_mp4_freeform_int(
|
|
|
|
+ tag_label=tag_label,
|
|
|
|
+ data=play_count,
|
|
)
|
|
)
|
|
self._mutagen.save()
|
|
self._mutagen.save()
|
|
if tag_set_cb:
|
|
if tag_set_cb:
|