diff --git a/beets/mediafile.py b/beets/mediafile.py index 9e3f81db34..59959b8f52 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -40,7 +40,6 @@ import mutagen.mp4 import mutagen.flac import mutagen.asf - import codecs import datetime import re @@ -73,6 +72,7 @@ 'mpc': 'Musepack', 'asf': 'Windows Media', 'aiff': 'AIFF', + 'dsf': 'DSD Stream File', } PREFERRED_IMAGE_EXTENSIONS = {'jpeg': 'jpg'} @@ -728,7 +728,7 @@ def serialize(self, image): class MP3StorageStyle(StorageStyle): """Store data in ID3 frames. """ - formats = ['MP3', 'AIFF'] + formats = ['MP3', 'AIFF', 'DSF'] def __init__(self, key, id3_lang=None, **kwargs): """Create a new ID3 storage style. `id3_lang` is the value for @@ -1475,6 +1475,8 @@ def __init__(self, path, id3v23=False): self.type = 'asf' elif type(self.mgfile).__name__ == 'AIFF': self.type = 'aiff' + elif type(self.mgfile).__name__ == 'DSF': + self.type = 'dsf' else: raise FileTypeError(path, type(self.mgfile).__name__) diff --git a/test/rsrc/empty.dsf b/test/rsrc/empty.dsf new file mode 100644 index 0000000000..4cbceb3c97 Binary files /dev/null and b/test/rsrc/empty.dsf differ diff --git a/test/rsrc/full.dsf b/test/rsrc/full.dsf new file mode 100644 index 0000000000..a90e6946fc Binary files /dev/null and b/test/rsrc/full.dsf differ diff --git a/test/rsrc/unparseable.dsf b/test/rsrc/unparseable.dsf new file mode 100644 index 0000000000..3b6292e32d Binary files /dev/null and b/test/rsrc/unparseable.dsf differ diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 5fcb14187b..fa55d3cdbb 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -886,6 +886,26 @@ class AIFFTest(ReadWriteTestBase, unittest.TestCase): 'channels': 1, } +try: + import mutagen.dsf +except: + HAVE_DSF = False +else: + HAVE_DSF = True + +@unittest.skipIf(not HAVE_DSF, "mutagen < 1.37") +class DSFTest(ReadWriteTestBase, + ExtendedImageStructureTestMixin, unittest.TestCase): + extension = 'dsf' + audio_properties = { + 'length': 0.01, + 'bitrate': 11289600, + 'format': u'DSD Stream File', + 'samplerate': 5644800, + 'bitdepth': 1, + 'channels': 2, + } + class MediaFieldTest(unittest.TestCase):