diff --git a/beets/mediafile.py b/beets/mediafile.py index 2032c78ff..9d7f35d9a 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -284,11 +284,19 @@ class MediaField(object): if self.out_type == int: if out is None: return 0 + elif isinstance(out, int) or isinstance(out, float): + # Just a number. + return int(out) else: - try: + # Process any other type as a string. + if not isinstance(out, basestring): + out = unicode(out) + # Get a number from the front of the string. + out = re.match('[0-9]*', out.strip()).group(0) + if not out: + return 0 + else: return int(out) - except: # in case out is not convertible directly to an int - return int(unicode(out)) elif self.out_type == bool: if out is None: return False diff --git a/test/rsrc/bpm.mp3 b/test/rsrc/bpm.mp3 new file mode 100755 index 000000000..1698bbe66 Binary files /dev/null and b/test/rsrc/bpm.mp3 differ diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 7d0575b23..00b1acf94 100755 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -250,6 +250,12 @@ class EdgeTest(unittest.TestCase): self.assertEqual(t_time.month, 3) self.assertEqual(t_time.day, 31) + def test_tempo_with_bpm(self): + # Some files have a string like "128 BPM" in the tempo field + # rather than just a number. + f = beets.mediafile.MediaFile(os.path.join('rsrc', 'bpm.mp3')) + self.assertEqual(f.bpm, 128) + def suite(): s = unittest.TestSuite() @@ -280,6 +286,7 @@ def suite(): s.addTest(EdgeTest('test_emptylist')) s.addTest(EdgeTest('test_release_time_with_t')) s.addTest(EdgeTest('test_release_time_with_space')) + s.addTest(EdgeTest('test_tempo_with_bpm')) return s