diff --git a/picard/formats/__init__.py b/picard/formats/__init__.py index 8dd779915..8c56e9983 100644 --- a/picard/formats/__init__.py +++ b/picard/formats/__init__.py @@ -86,11 +86,13 @@ def open_(filename): from picard.formats.id3 import ( AiffFile, + DSFFile, MP3File, TrueAudioFile, ) if AiffFile: register_format(AiffFile) +register_format(DSFFile) register_format(MP3File) register_format(TrueAudioFile) diff --git a/picard/formats/id3.py b/picard/formats/id3.py index 657ed6a04..144f21142 100644 --- a/picard/formats/id3.py +++ b/picard/formats/id3.py @@ -18,6 +18,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import mutagen.apev2 +import mutagen.dsf import mutagen.mp3 import mutagen.trueaudio try: @@ -595,6 +596,36 @@ class TrueAudioFile(ID3File): metadata['~format'] = self.NAME +class DSFFile(ID3File): + + """DSF file.""" + EXTENSIONS = [".dsf", '.dff'] + NAME = "DSF" + _File = mutagen.dsf.DSF + + def _get_file(self, filename): + return mutagen.dsf.DSF(filename) + + def _info(self, metadata, file): + super()._info(metadata, file) + metadata['~format'] = self.NAME + + def _get_tags(self, filename): + file = self._get_file(filename) + if file.tags is None: + file.add_tags() + return file.tags + + def _save_tags(self, tags, filename): + if config.setting['write_id3v23']: + tags.update_to_v23() + separator = config.setting['id3v23_join_with'] + tags.save(filename, v2_version=3, v23_sep=separator) + else: + tags.update_to_v24() + tags.save(filename, v2_version=4) + + if mutagen.aiff: class AiffFile(ID3File): diff --git a/test/data/test.dsf b/test/data/test.dsf new file mode 100644 index 000000000..5d01fc46c Binary files /dev/null and b/test/data/test.dsf differ