From 94b071493b2d36250f54638a2a918a0a2e9afda4 Mon Sep 17 00:00:00 2001 From: "adrian.sampson" Date: Tue, 12 May 2009 19:56:49 +0000 Subject: [PATCH] int casting is now more tolerant (allowing "0 BPM" in "It's Blitz") --HG-- extra : convert_revision : svn%3A41726ec3-264d-0410-9c23-a9f1637257cc/trunk%40225 --- beets/mediafile.py | 14 +++++++++++--- test/rsrc/bpm.mp3 | Bin 0 -> 12820 bytes test/test_mediafile.py | 7 +++++++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100755 test/rsrc/bpm.mp3 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 0000000000000000000000000000000000000000..1698bbe66ea1a48e2d652915b0250da5fa661137 GIT binary patch literal 12820 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 C7!N4` literal 0 HcmV?d00001 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