diff --git a/NEWS b/NEWS index 0945c9735..1f907dd7b 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,7 @@ copies afterward). This is fixed. * Fix a bug where some files would be erroneously interpreted as MP4. * Fix permission bits applied to album art files. +* Fix malformed MusicBrainz queries caused by null characters. * The old "albumify" plugin for upgrading databases was removed. 1.0b6 diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 9a34f0ab7..c290f1d14 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -127,7 +127,8 @@ def _lucene_escape(text): string. """ # Regex stolen from MusicBrainz Picard. - return re.sub(r'([+\-&|!(){}\[\]\^"~*?:\\])', r'\\\1', text) + out = re.sub(r'([+\-&|!(){}\[\]\^"~*?:\\])', r'\\\1', text) + return out.replace('\x00', '') def find_releases(criteria, limit=SEARCH_LIMIT): """Get a list of release dictionaries from the MusicBrainz diff --git a/test/test_mb.py b/test/test_mb.py index f4ab88c6e..1b87d1fd1 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -146,6 +146,15 @@ class MBReleaseDictTest(unittest.TestCase): d = mb.release_dict(release) self.assertTrue(d['va']) +class QuerySanitationTest(unittest.TestCase): + def test_special_char_escaped(self): + res = mb._lucene_escape('!') + self.assertEqual(res, '\\!') + + def test_null_character_removed(self): + res = mb._lucene_escape('\0') + self.assertEqual(res, '') + def suite(): return unittest.TestLoader().loadTestsFromName(__name__)