diff --git a/beets/mediafile.py b/beets/mediafile.py index c1be35d49..4c8b59fe8 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -154,11 +154,12 @@ def _safe_cast(out_type, val): else: if not isinstance(val, basestring): val = unicode(val) - val = re.match(r'[\+-]?[0-9\.]*', val.strip()).group(0) - if not val: - return 0.0 - else: - return float(val) + match = re.match(r'[\+-]?[0-9\.]+', val.strip()) + if match: + val = match.group(0) + if val: + return float(val) + return 0.0 else: return val diff --git a/docs/changelog.rst b/docs/changelog.rst index a7d20d923..bb2ff362e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -77,6 +77,8 @@ Little improvements and fixes: * :doc:`/plugins/convert`: A new ``--pretend`` option lets you preview the commands the plugin will execute without actually taking any action. Thanks to Dietrich Daroch. +* Fix a crash when a float-valued tag field only contained a ``+`` or ``-`` + character. diff --git a/test/test_mediafile_edge.py b/test/test_mediafile_edge.py index 0347d3836..9a7833ffe 100644 --- a/test/test_mediafile_edge.py +++ b/test/test_mediafile_edge.py @@ -107,6 +107,10 @@ class InvalidValueToleranceTest(unittest.TestCase): self.assertTrue(isinstance(us, unicode)) self.assertTrue(us.startswith(u'caf')) + def test_safe_cast_float_with_no_numbers(self): + v = _sc(float, '+') + self.assertEqual(v, 0.0) + class SafetyTest(unittest.TestCase, TestHelper): def setUp(self):