12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- # -*- coding: utf-8 -*-
- import mutagen.id3
- import mutagen.mp4
- class _mutagen:
- @property
- def track_path(self):
- return self._mutagen_file.filename
- def save(self):
- self._mutagen_file.save()
- class ID3(_mutagen):
- def __init__(self, mutagen_file):
- assert mutagen_file.tags, mutagen_file
- assert isinstance(mutagen_file.tags, mutagen.id3.ID3), \
- mutagen_file.tags
- self._mutagen_file = mutagen_file
- def get_free_int(self, tag_label):
- values = self._mutagen_file.tags['TXXX:' + tag_label].text
- assert len(values) == 1, values
- return int(values[0])
- def set_free_int(self, tag_label, data):
- # mutagen.id3._specs.EncodedTextSpec.write encodes 'desc' and 'text'
- tag = mutagen.id3.TXXX(
- encoding=mutagen.id3.Encoding.LATIN1,
- desc=tag_label,
- text=[str(data)],
- )
- self._mutagen_file.tags.add(tag)
- return tag
- class MP4(_mutagen):
- def __init__(self, mutagen_file):
- assert mutagen_file.tags, mutagen_file
- assert isinstance(mutagen_file.tags, mutagen.mp4.MP4Tags), \
- mutagen_file.tags
- self._mutagen_file = mutagen_file
- def get_free_int(self, tag_label):
- tag, = self._mutagen_file.tags['----:' + tag_label]
- # "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
- assert tag.dataformat == mutagen.mp4.AtomDataType.INTEGER, tag.dataformat
- return int.from_bytes(tag, byteorder='big', signed=True)
- def set_free_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_file.tags['----:' + tag_label] = tag
- return tag
|