From 7509a4bf0d2709378828239e58d08123e6b16cbb Mon Sep 17 00:00:00 2001 From: Julien Cassette Date: Sat, 20 Nov 2021 17:16:10 +0100 Subject: [PATCH 1/2] Add the properties bitrate_mode, encoder_info and encoder_settings --- docs/index.rst | 7 +++++- mediafile.py | 40 +++++++++++++++++++++++++++++++- test/rsrc/cbr.mp3 | Bin 0 -> 13343 bytes test/test_mediafile.py | 51 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 test/rsrc/cbr.mp3 diff --git a/docs/index.rst b/docs/index.rst index 15461b0..32e4cc7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,7 +30,7 @@ The metadata schema is generally based on MusicBrainz' schema with similar namin * ``lyrics``, ``copyright``, ``url`` * calculated metadata like ``bpm`` (beats per minute) and ``r128_track_gain`` (ReplayGain), * embedded images (e.g. album art), -* file metadata like ``bitrate`` and ``length``. +* file metadata like ``samplerate``, ``bitdepth``, ``channels``, ``bitrate``, ``bitrate_mode``, ``encoder_info``, ``encoder_settings`` and ``length``. Compatibility ------------- @@ -135,6 +135,11 @@ To copy tags from one MediaFile to another: Changelog --------- +v0.8.2 +'''''' + +- Add the properties ``bitrate_mode``, ``encoder_info`` and ``encoder_settings``. + v0.8.1 '''''' diff --git a/mediafile.py b/mediafile.py index 4d3f936..907a2d9 100644 --- a/mediafile.py +++ b/mediafile.py @@ -37,6 +37,7 @@ import mutagen import mutagen.id3 +import mutagen.mp3 import mutagen.mp4 import mutagen.flac import mutagen.asf @@ -1721,7 +1722,8 @@ def readable_fields(cls): for property in cls.fields(): yield property for property in ('length', 'samplerate', 'bitdepth', 'bitrate', - 'channels', 'format'): + 'bitrate_mode', 'channels', 'encoder_info', + 'encoder_settings', 'format'): yield property @classmethod @@ -2326,6 +2328,42 @@ def bitrate(self): return 0 return int(self.filesize * 8 / self.length) + @property + def bitrate_mode(self): + """The mode of the bitrate used in the audio coding + (a string, eg. "CBR", "VBR" or "ABR"). + Only available for the MP3 file format (empty where unavailable). + """ + if hasattr(self.mgfile.info, 'bitrate_mode'): + return { + mutagen.mp3.BitrateMode.CBR: 'CBR', + mutagen.mp3.BitrateMode.VBR: 'VBR', + mutagen.mp3.BitrateMode.ABR: 'ABR', + }.get(self.mgfile.info.bitrate_mode, '') + else: + return '' + + @property + def encoder_info(self): + """The name and/or version of the encoder used + (a string, eg. "LAME 3.97.0"). + Only available for some formats (empty where unavailable). + """ + if hasattr(self.mgfile.info, 'encoder_info'): + return self.mgfile.info.encoder_info + else: + return '' + + @property + def encoder_settings(self): + """A guess of the settings used for the encoder (a string, eg. "-V2"). + Only available for the MP3 file format (empty where unavailable). + """ + if hasattr(self.mgfile.info, 'encoder_settings'): + return self.mgfile.info.encoder_settings + else: + return '' + @property def format(self): """A string describing the file format/codec.""" diff --git a/test/rsrc/cbr.mp3 b/test/rsrc/cbr.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5edf46a4e1015b11191fbef4994933bfa97eb9e2 GIT binary patch literal 13343 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 (1, 45, 0) else 0, @@ -933,6 +972,9 @@ class OpusTest(ReadWriteTestBase, unittest.TestCase): audio_properties = { 'length': 1.0, 'bitrate': 66792, + 'bitrate_mode': '', + 'encoder_info': '', + 'encoder_settings': '', 'format': u'Opus', 'samplerate': 48000, 'bitdepth': 0, @@ -945,6 +987,9 @@ class AIFFTest(ReadWriteTestBase, unittest.TestCase): audio_properties = { 'length': 1.0, 'bitrate': 705600, + 'bitrate_mode': '', + 'encoder_info': '', + 'encoder_settings': '', 'format': u'AIFF', 'samplerate': 44100, 'bitdepth': 16, @@ -957,6 +1002,9 @@ class WAVETest(ReadWriteTestBase, unittest.TestCase): audio_properties = { 'length': 1.0, 'bitrate': 88200, + 'bitrate_mode': '', + 'encoder_info': '', + 'encoder_settings': '', 'format': u'WAVE', 'samplerate': 44100, 'bitdepth': 16, @@ -1033,6 +1081,9 @@ class DSFTest(ReadWriteTestBase, unittest.TestCase): audio_properties = { 'length': 0.01, 'bitrate': 11289600, + 'bitrate_mode': '', + 'encoder_info': '', + 'encoder_settings': '', 'format': u'DSD Stream File', 'samplerate': 5644800, 'bitdepth': 1, From 989a548879913820bfb2000afb69c340397eb8d8 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Mon, 22 Nov 2021 16:50:42 -0500 Subject: [PATCH 2/2] Version bump: 0.9.0 --- docs/conf.py | 4 ++-- docs/index.rst | 5 +++-- mediafile.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 4ab1e0c..62578b1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,8 +17,8 @@ copyright = '2016, the beets project' author = 'the beets project' -version = '0.5' -release = '0.5.0' +version = '0.9' +release = '0.9.0' pygments_style = 'sphinx' htmlhelp_basename = 'mediafiledoc' diff --git a/docs/index.rst b/docs/index.rst index 32e4cc7..b8226f2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -135,10 +135,11 @@ To copy tags from one MediaFile to another: Changelog --------- -v0.8.2 +v0.9.0 '''''' -- Add the properties ``bitrate_mode``, ``encoder_info`` and ``encoder_settings``. +- Add the properties ``bitrate_mode``, ``encoder_info`` and + ``encoder_settings``. v0.8.1 '''''' diff --git a/mediafile.py b/mediafile.py index 907a2d9..ca3747d 100644 --- a/mediafile.py +++ b/mediafile.py @@ -59,7 +59,7 @@ import traceback -__version__ = '0.8.1' +__version__ = '0.9.0' __all__ = ['UnreadableFileError', 'FileTypeError', 'MediaFile'] log = logging.getLogger(__name__)