diff --git a/mediafile.py b/mediafile.py index b6390f8..1fd9c92 100644 --- a/mediafile.py +++ b/mediafile.py @@ -77,6 +77,7 @@ 'asf': 'Windows Media', 'aiff': 'AIFF', 'dsf': 'DSD Stream File', + 'wav': 'WAVE', } PREFERRED_IMAGE_EXTENSIONS = {'jpeg': 'jpg'} @@ -777,7 +778,7 @@ def serialize(self, image): class MP3StorageStyle(StorageStyle): """Store data in ID3 frames. """ - formats = ['MP3', 'AIFF', 'DSF'] + formats = ['MP3', 'AIFF', 'DSF', 'WAVE'] def __init__(self, key, id3_lang=None, **kwargs): """Create a new ID3 storage style. `id3_lang` is the value for @@ -1591,6 +1592,8 @@ def __init__(self, filething, id3v23=False): self.type = 'aiff' elif type(self.mgfile).__name__ == 'DSF': self.type = 'dsf' + elif type(self.mgfile).__name__ == 'WAVE': + self.type = 'wav' else: raise FileTypeError(self.filename, type(self.mgfile).__name__) diff --git a/test/rsrc/backup.wav b/test/rsrc/backup.wav new file mode 100644 index 0000000..a7f425b Binary files /dev/null and b/test/rsrc/backup.wav differ diff --git a/test/rsrc/empty.wav b/test/rsrc/empty.wav new file mode 100644 index 0000000..969ebfc Binary files /dev/null and b/test/rsrc/empty.wav differ diff --git a/test/rsrc/full.wav b/test/rsrc/full.wav new file mode 100644 index 0000000..3599f5a Binary files /dev/null and b/test/rsrc/full.wav differ diff --git a/test/rsrc/unparseable.wav b/test/rsrc/unparseable.wav new file mode 100644 index 0000000..969ebfc Binary files /dev/null and b/test/rsrc/unparseable.wav differ diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 993a141..f6aba58 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -952,6 +952,71 @@ class AIFFTest(ReadWriteTestBase, unittest.TestCase): } +class WAVETest(ReadWriteTestBase, unittest.TestCase): + extension = 'wav' + audio_properties = { + 'length': 1.0, + 'bitrate': 88200, + 'format': u'WAVE', + 'samplerate': 44100, + 'bitdepth': 16, + 'channels': 1, + } + + full_initial_tags = { + 'title': u'full', + 'artist': u'the artist', + 'album': u'the album', + 'genre': u'the genre', + 'track': 2, + 'tracktotal': 3, + } + + tag_fields = [ + 'title', + 'artist', + 'album', + 'genre', + 'track', + 'original_year', + 'original_month', + 'original_day', + 'original_date', + ] + + # Only a small subset of fields are supported by LIST/INFO + # metadata format in WAVE, so some fields have been removed + # from the inherited test cases below. Concerned fields are + # commented above each test case. + + # Missing fields: disc, disctotal + def test_write_counters_without_total(self): + mediafile = self._mediafile_fixture('full') + self.assertEqual(mediafile.track, 2) + self.assertEqual(mediafile.tracktotal, 3) + + # Missing fields: date, year + def test_delete_year(self): + mediafile = self._mediafile_fixture('full') + + self.assertIsNotNone(mediafile.original_year) + + delattr(mediafile, 'original_year') + mediafile.save() + mediafile = MediaFile(mediafile.filename) + self.assertIsNone(mediafile.original_year) + + # Missing fields: disctotal + def test_delete_packed_total(self): + mediafile = self._mediafile_fixture('full') + + delattr(mediafile, 'tracktotal') + + mediafile.save() + mediafile = MediaFile(mediafile.filename) + self.assertEqual(mediafile.track, self.full_initial_tags['track']) + + # Check whether we have a Mutagen version with DSF support. We can # remove this once we require a version that includes the feature. try: