From f6b53142a938b77bb3f1a4b2a9b7501eb14e2e4c Mon Sep 17 00:00:00 2001 From: "adrian.sampson" Date: Tue, 21 Apr 2009 07:21:23 +0000 Subject: [PATCH] now tolerates space-separated release times --HG-- extra : convert_revision : svn%3A41726ec3-264d-0410-9c23-a9f1637257cc/trunk%40221 --- beets/mediafile.py | 4 ++-- test/rsrc/space_time.mp3 | Bin 0 -> 12820 bytes test/rsrc/{time.m4a => t_time.m4a} | Bin test/test_mediafile.py | 32 +++++++++++++++++++++-------- 4 files changed, 25 insertions(+), 11 deletions(-) create mode 100755 test/rsrc/space_time.mp3 rename test/rsrc/{time.m4a => t_time.m4a} (100%) diff --git a/beets/mediafile.py b/beets/mediafile.py index 80f750f19..2032c78ff 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -117,8 +117,8 @@ class Packed(object): items = self.items if self.packstyle == packing.DATE: # Remove time information from dates. Usually delimited by - # a "T". - items = re.sub(r'[Tt].*$', '', unicode(items)) + # a "T" or a space. + items = re.sub(r'[Tt ].*$', '', unicode(items)) # transform from a string packing into a list we can index into if self.packstyle == packing.SLASHED: diff --git a/test/rsrc/space_time.mp3 b/test/rsrc/space_time.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..f0fecfe0fb1cbdcaea0ce3c1e4a124f6f2fe4eb1 GIT binary patch literal 12820 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 HNB#U?$?XtN literal 0 HcmV?d00001 diff --git a/test/rsrc/time.m4a b/test/rsrc/t_time.m4a similarity index 100% rename from test/rsrc/time.m4a rename to test/rsrc/t_time.m4a diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 1b9d4fe4e..7d0575b23 100755 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -223,17 +223,33 @@ def suite_for_file(path, correct_dict, writing=True): return s class EdgeTest(unittest.TestCase): - def setUp(self): - self.emptylist = beets.mediafile.MediaFile( - os.path.join('rsrc', 'emptylist.mp3')) - def test_emptylist(self): # Some files have an ID3 frame that has a list with no elements. # This is very hard to produce, so this is just the first 8192 # bytes of a file found "in the wild". - genre = self.emptylist.genre + emptylist = beets.mediafile.MediaFile( + os.path.join('rsrc', 'emptylist.mp3')) + genre = emptylist.genre self.assertEqual(genre, '') + def test_release_time_with_space(self): + # Ensures that release times delimited by spaces are ignored. + # Amie Street produces such files. + space_time = beets.mediafile.MediaFile( + os.path.join('rsrc', 'space_time.mp3')) + self.assertEqual(space_time.year, 2009) + self.assertEqual(space_time.month, 9) + self.assertEqual(space_time.day, 4) + + def test_release_time_with_t(self): + # Ensures that release times delimited by Ts are ignored. + # The iTunes Store produces such files. + t_time = beets.mediafile.MediaFile( + os.path.join('rsrc', 't_time.m4a')) + self.assertEqual(t_time.year, 1987) + self.assertEqual(t_time.month, 3) + self.assertEqual(t_time.day, 31) + def suite(): s = unittest.TestSuite() @@ -254,10 +270,6 @@ def suite(): s.addTest(suite_for_file(os.path.join('rsrc', 'date.mp3'), correct_dicts['date'])) - # Test for dates that include times (like iTunes purchases). - s.addTest(suite_for_file(os.path.join('rsrc', 'time.m4a'), - correct_dicts['date'])) - # Read-only attribute tests. for fname, correct_dict in read_only_correct_dicts.iteritems(): path = os.path.join('rsrc', fname) @@ -266,6 +278,8 @@ def suite(): # Edge cases. s.addTest(EdgeTest('test_emptylist')) + s.addTest(EdgeTest('test_release_time_with_t')) + s.addTest(EdgeTest('test_release_time_with_space')) return s