replaygain: separate out r128 tests into a mixin to clarify which backends are tested

This commit is contained in:
Šarūnas Nejus 2024-07-15 15:44:49 +01:00
parent d716475f3d
commit 06cf9c4ea8
No known key found for this signature in database
GPG key ID: DD28F6704DBE3435

View file

@ -31,17 +31,94 @@ def reset_replaygain(item):
class GstBackendMixin:
backend = "gstreamer"
has_r128_support = True
class CmdBackendMixin:
backend = "command"
has_r128_support = False
class FfmpegBackendMixin:
backend = "ffmpeg"
has_r128_support = True
class R128Test:
def test_cli_does_not_skip_wrong_tag_type(self):
"""Check that items that have tags of the wrong type won't be skipped."""
album_rg = self._add_album(1)
item_rg = album_rg.items()[0]
album_r128 = self._add_album(1, ext="opus")
item_r128 = album_r128.items()[0]
item_rg.r128_track_gain = 0.0
item_rg.store()
item_r128.rg_track_gain = 0.0
item_r128.rg_track_peak = 42.0
item_r128.store()
self.run_command("replaygain")
item_rg.load()
item_r128.load()
self.assertIsNotNone(item_rg.rg_track_gain)
self.assertIsNotNone(item_rg.rg_track_peak)
# FIXME: Should the plugin null this field?
# self.assertIsNone(item_rg.r128_track_gain)
self.assertIsNotNone(item_r128.r128_track_gain)
# FIXME: Should the plugin null these fields?
# self.assertIsNone(item_r128.rg_track_gain)
# self.assertIsNone(item_r128.rg_track_peak)
def test_cli_writes_only_r128_tags(self):
album = self._add_album(2, ext="opus")
self.run_command("replaygain", "-a")
for item in album.items():
mediafile = MediaFile(item.path)
# does not write REPLAYGAIN_* tags
self.assertIsNone(mediafile.rg_track_gain)
self.assertIsNone(mediafile.rg_album_gain)
# writes R128_* tags
self.assertIsNotNone(mediafile.r128_track_gain)
self.assertIsNotNone(mediafile.r128_album_gain)
def test_r128_targetlevel_has_effect(self):
album = self._add_album(1, ext="opus")
item = album.items()[0]
def analyse(target_level):
self.config["replaygain"]["r128_targetlevel"] = target_level
self.run_command("replaygain", "-f")
item.load()
return item.r128_track_gain
gain_relative_to_84 = analyse(84)
gain_relative_to_89 = analyse(89)
self.assertNotEqual(gain_relative_to_84, gain_relative_to_89)
def test_r128_cli_skips_calculated_tracks(self):
album_r128 = self._add_album(1, ext="opus")
item_r128 = album_r128.items()[0]
self.run_command("replaygain")
item_r128.load()
self.assertIsNotNone(item_r128.r128_track_gain)
self.assertIsNone(item_r128.rg_track_gain)
self.assertIsNone(item_r128.rg_track_peak)
item_r128.r128_track_gain += 1.0
item_r128.store()
r128_track_gain = item_r128.r128_track_gain
self.run_command("replaygain")
item_r128.load()
self.assertEqual(item_r128.r128_track_gain, r128_track_gain)
class ReplayGainCliTestBase(TestHelper):
@ -96,10 +173,6 @@ class ReplayGainCliTestBase(TestHelper):
album_rg = self._add_album(1)
item_rg = album_rg.items()[0]
if self.has_r128_support:
album_r128 = self._add_album(1, ext="opus")
item_r128 = album_r128.items()[0]
self.run_command("replaygain")
item_rg.load()
@ -113,64 +186,12 @@ class ReplayGainCliTestBase(TestHelper):
rg_track_gain = item_rg.rg_track_gain
rg_track_peak = item_rg.rg_track_peak
if self.has_r128_support:
item_r128.load()
self.assertIsNotNone(item_r128.r128_track_gain)
self.assertIsNone(item_r128.rg_track_gain)
self.assertIsNone(item_r128.rg_track_peak)
item_r128.r128_track_gain += 1.0
item_r128.store()
r128_track_gain = item_r128.r128_track_gain
self.run_command("replaygain")
item_rg.load()
self.assertEqual(item_rg.rg_track_gain, rg_track_gain)
self.assertEqual(item_rg.rg_track_peak, rg_track_peak)
if self.has_r128_support:
item_r128.load()
self.assertEqual(item_r128.r128_track_gain, r128_track_gain)
def test_cli_does_not_skip_wrong_tag_type(self):
"""Check that items that have tags of the wrong type won't be skipped."""
if not self.has_r128_support:
# This test is a lot less interesting if the backend cannot write
# both tag types.
self.skipTest(
"r128 tags for opus not supported on backend {}".format(
self.backend
)
)
album_rg = self._add_album(1)
item_rg = album_rg.items()[0]
album_r128 = self._add_album(1, ext="opus")
item_r128 = album_r128.items()[0]
item_rg.r128_track_gain = 0.0
item_rg.store()
item_r128.rg_track_gain = 0.0
item_r128.rg_track_peak = 42.0
item_r128.store()
self.run_command("replaygain")
item_rg.load()
item_r128.load()
self.assertIsNotNone(item_rg.rg_track_gain)
self.assertIsNotNone(item_rg.rg_track_peak)
# FIXME: Should the plugin null this field?
# self.assertIsNone(item_rg.r128_track_gain)
self.assertIsNotNone(item_r128.r128_track_gain)
# FIXME: Should the plugin null these fields?
# self.assertIsNone(item_r128.rg_track_gain)
# self.assertIsNone(item_r128.rg_track_peak)
def test_cli_saves_album_gain_to_file(self):
self._add_album(2)
@ -195,27 +216,6 @@ class ReplayGainCliTestBase(TestHelper):
self.assertNotEqual(max(gains), 0.0)
self.assertNotEqual(max(peaks), 0.0)
def test_cli_writes_only_r128_tags(self):
if not self.has_r128_support:
self.skipTest(
"r128 tags for opus not supported on backend {}".format(
self.backend
)
)
album = self._add_album(2, ext="opus")
self.run_command("replaygain", "-a")
for item in album.items():
mediafile = MediaFile(item.path)
# does not write REPLAYGAIN_* tags
self.assertIsNone(mediafile.rg_track_gain)
self.assertIsNone(mediafile.rg_album_gain)
# writes R128_* tags
self.assertIsNotNone(mediafile.r128_track_gain)
self.assertIsNotNone(mediafile.r128_album_gain)
def test_targetlevel_has_effect(self):
album = self._add_album(1)
item = album.items()[0]
@ -231,28 +231,6 @@ class ReplayGainCliTestBase(TestHelper):
self.assertNotEqual(gain_relative_to_84, gain_relative_to_89)
def test_r128_targetlevel_has_effect(self):
if not self.has_r128_support:
self.skipTest(
"r128 tags for opus not supported on backend {}".format(
self.backend
)
)
album = self._add_album(1, ext="opus")
item = album.items()[0]
def analyse(target_level):
self.config["replaygain"]["r128_targetlevel"] = target_level
self.run_command("replaygain", "-f")
item.load()
return item.r128_track_gain
gain_relative_to_84 = analyse(84)
gain_relative_to_89 = analyse(89)
self.assertNotEqual(gain_relative_to_84, gain_relative_to_89)
def test_per_disc(self):
# Use the per_disc option and add a little more concurrency.
album = self._add_album(track_count=4, disc_count=3)
@ -267,7 +245,7 @@ class ReplayGainCliTestBase(TestHelper):
class ReplayGainGstCliTest(
ReplayGainCliTestBase, unittest.TestCase, GstBackendMixin
R128Test, ReplayGainCliTestBase, unittest.TestCase, GstBackendMixin
):
FNAME = "full" # file contains only silence
@ -279,13 +257,13 @@ class ReplayGainCmdCliTest(
class ReplayGainFfmpegCliTest(
ReplayGainCliTestBase, unittest.TestCase, FfmpegBackendMixin
R128Test, ReplayGainCliTestBase, unittest.TestCase, FfmpegBackendMixin
):
FNAME = "full" # file contains only silence
class ReplayGainFfmpegNoiseCliTest(
ReplayGainCliTestBase, unittest.TestCase, FfmpegBackendMixin
R128Test, ReplayGainCliTestBase, unittest.TestCase, FfmpegBackendMixin
):
FNAME = "whitenoise"