diff --git a/beetsplug/convert.py b/beetsplug/convert.py index fe9d91d25..9b0e17a89 100644 --- a/beetsplug/convert.py +++ b/beetsplug/convert.py @@ -89,12 +89,11 @@ def should_transcode(item, fmt): """Determine whether the item should be transcoded as part of conversion (i.e., its bitrate is high or it has the wrong format). """ - no_convert_queries = config["convert"]["no_convert"].as_str_seq() - if no_convert_queries: - for query_string in no_convert_queries: - query, _ = parse_query_string(query_string, Item) - if query.match(item): - return False + no_convert_query = config["convert"]["no_convert"].as_str() + if no_convert_query: + query, _ = parse_query_string(no_convert_query, Item) + if query.match(item): + return False if ( config["convert"]["never_convert_lossy_files"] and item.format.lower() not in LOSSLESS_FORMATS diff --git a/test/plugins/test_convert.py b/test/plugins/test_convert.py index 725318eac..10c3b95b9 100644 --- a/test/plugins/test_convert.py +++ b/test/plugins/test_convert.py @@ -335,3 +335,49 @@ class NeverConvertLossyFilesTest(ConvertTestCase, ConvertCommand): self.run_convert_path(item.path) converted = os.path.join(self.convert_dest, b"converted.ogg") self.assertNoFileTag(converted, "mp3") + + +@_common.slow_test() +class NoConvertTest(ConvertTestCase, ConvertCommand): + """Test the effect of the `no_convert` option.""" + + def setUp(self): + super().setUp() + + self.convert_dest = os.path.join(self.temp_dir, b"convert_dest") + self.config["convert"] = { + "dest": self.convert_dest, + "no_convert": "format:OGG", + "paths": {"default": "converted"}, + "format": "mp3", + "formats": { + "mp3": self.tagged_copy_cmd("mp3"), + }, + } + + def test_no_transcode_when_no_convert_set(self): + [item] = self.add_item_fixtures(ext="ogg") + with control_stdin("y"): + self.run_convert_path(item.path) + converted = os.path.join(self.convert_dest, b"converted.mp3") + self.assertFalse(os.path.exists(converted)) + + def test_no_transcode_when_multi_no_convert_set(self): + self.config["convert"]["no_convert"] = "format:OGG bitrate:..256" + [item] = self.add_item_fixtures(ext="ogg") + item.bitrate = 128 + item.store() + with control_stdin("y"): + self.run_convert_path(item.path) + converted = os.path.join(self.convert_dest, b"converted.mp3") + self.assertFalse(os.path.exists(converted)) + + def test_transcode_when_multi_no_convert_set_partial_match(self): + self.config["convert"]["no_convert"] = "format:OGG bitrate:..256" + [item] = self.add_item_fixtures(ext="ogg") + item.bitrate = 320 + item.store() + with control_stdin("y"): + self.run_convert_path(item.path) + converted = os.path.join(self.convert_dest, b"converted.mp3") + self.assertTrue(os.path.exists(converted))