From bbc3f1450f235eae1c2824ee81eb2c3cd759ffc8 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Mon, 8 Jun 2020 13:45:55 +0200 Subject: [PATCH] PICARD-1839: Support tagging DSDIFF (DFF) files with ID3 --- picard/formats/__init__.py | 3 +++ picard/formats/id3.py | 14 ++++++++++++++ test/data/test-dsd.dff | Bin 0 -> 14242 bytes test/data/test-dst.dff | Bin 0 -> 2214 bytes test/formats/test_id3.py | 25 +++++++++++++++++++++++++ 5 files changed, 42 insertions(+) create mode 100644 test/data/test-dsd.dff create mode 100644 test/data/test-dst.dff diff --git a/picard/formats/__init__.py b/picard/formats/__init__.py index 84b37995c..95104a50c 100644 --- a/picard/formats/__init__.py +++ b/picard/formats/__init__.py @@ -39,6 +39,7 @@ from picard.formats.apev2 import ( from picard.formats.asf import ASFFile from picard.formats.id3 import ( AiffFile, + DSDIFFFile, DSFFile, MP3File, TrueAudioFile, @@ -71,6 +72,8 @@ register_format(AACFile) register_format(AC3File) register_format(AiffFile) register_format(ASFFile) +if DSDIFFFile: + register_format(DSDIFFFile) register_format(DSFFile) register_format(FLACFile) register_format(MIDIFile) diff --git a/picard/formats/id3.py b/picard/formats/id3.py index 3f9eb2366..74f3ce9c1 100644 --- a/picard/formats/id3.py +++ b/picard/formats/id3.py @@ -736,3 +736,17 @@ class AiffFile(NonCompatID3File): EXTENSIONS = [".aiff", ".aif", ".aifc"] NAME = "Audio Interchange File Format (AIFF)" _File = mutagen.aiff.AIFF + + +try: + import mutagen.dsdiff + + class DSDIFFFile(NonCompatID3File): + + """DSF file.""" + EXTENSIONS = [".dff"] + NAME = "DSDIFF" + _File = mutagen.dsdiff.DSDIFF + +except ImportError: + DSDIFFFile = None diff --git a/test/data/test-dsd.dff b/test/data/test-dsd.dff new file mode 100644 index 0000000000000000000000000000000000000000..8a1ec7dc664da57e4f262379221efb1bdb3eee82 GIT binary patch literal 14242 zcmeIuO%B0O6b8^on3$MYKw}fkQ6gjc1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ gfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5cm^;H*38V`Tzg` literal 0 HcmV?d00001 diff --git a/test/data/test-dst.dff b/test/data/test-dst.dff new file mode 100644 index 0000000000000000000000000000000000000000..257a9d2692eec042c2e531f562933932dbd1ab2b GIT binary patch literal 2214 zcmZ<@^0i<91CCiP!7d7JVXi?CJ_8FQD+5D7kbeM_?-uL_ln+)=fXOq2DKR*E`1wHj zTntRXK5ikwLGB^Wz5y^(1YCkc6u3czYhH4GN@@y-3DqIw78K$NWwU{4Z%-Fvs4NE; fkj)Gd6#z?(5~Cq78UmvsFd71*Aut*OBP#>|dq@@h literal 0 HcmV?d00001 diff --git a/test/formats/test_id3.py b/test/formats/test_id3.py index f1349c430..70e3cb413 100644 --- a/test/formats/test_id3.py +++ b/test/formats/test_id3.py @@ -510,6 +510,31 @@ class DSFTest(CommonId3Tests.Id3TestCase): unexpected_info = ['~video'] +if id3.DSDIFFFile: + class DSDIFFTest(CommonId3Tests.Id3TestCase): + testfile = 'test-dsd.dff' + supports_ratings = True + expected_info = { + 'length': 10, + '~channels': '2', + '~sample_rate': '5644800', + '~bitrate': '11289.6', + '~bits_per_sample': '1', + } + unexpected_info = ['~video'] + + class DSDIFFDSTTest(CommonId3Tests.Id3TestCase): + testfile = 'test-dst.dff' + supports_ratings = True + expected_info = { + 'length': 0, + '~channels': '2', + '~sample_rate': '5644800', + '~bits_per_sample': '1', + } + unexpected_info = ['~video'] + + class AIFFTest(CommonId3Tests.Id3TestCase): testfile = 'test.aiff' supports_ratings = False