tag_interface.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. import mutagen.id3
  3. import mutagen.mp4
  4. class _mutagen:
  5. @property
  6. def track_path(self):
  7. return self._mutagen_file.filename
  8. def save(self):
  9. self._mutagen_file.save()
  10. class ID3(_mutagen):
  11. def __init__(self, mutagen_file):
  12. assert mutagen_file.tags, mutagen_file
  13. assert isinstance(mutagen_file.tags, mutagen.id3.ID3), \
  14. mutagen_file.tags
  15. self._mutagen_file = mutagen_file
  16. def get_free_int(self, tag_label):
  17. values = self._mutagen_file.tags['TXXX:' + tag_label].text
  18. assert len(values) == 1, values
  19. return int(values[0])
  20. def set_free_int(self, tag_label, data):
  21. # mutagen.id3._specs.EncodedTextSpec.write encodes 'desc' and 'text'
  22. tag = mutagen.id3.TXXX(
  23. encoding=mutagen.id3.Encoding.LATIN1,
  24. desc=tag_label,
  25. text=[str(data)],
  26. )
  27. self._mutagen_file.tags.add(tag)
  28. return tag
  29. class MP4(_mutagen):
  30. def __init__(self, mutagen_file):
  31. assert mutagen_file.tags, mutagen_file
  32. assert isinstance(mutagen_file.tags, mutagen.mp4.MP4Tags), \
  33. mutagen_file.tags
  34. self._mutagen_file = mutagen_file
  35. def get_free_int(self, tag_label):
  36. tag, = self._mutagen_file.tags['----:' + tag_label]
  37. # "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
  38. assert tag.dataformat == mutagen.mp4.AtomDataType.INTEGER, tag.dataformat
  39. return int.from_bytes(tag, byteorder='big', signed=True)
  40. def set_free_int(self, tag_label, data):
  41. assert isinstance(data, int)
  42. tag = mutagen.mp4.MP4FreeForm(
  43. # "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
  44. dataformat=mutagen.mp4.AtomDataType.INTEGER,
  45. # TODO set byte length properly
  46. data=data.to_bytes(1, byteorder='big', signed=True),
  47. )
  48. self._mutagen_file.tags['----:' + tag_label] = tag
  49. return tag