diff --git a/beets/mediafile.py b/beets/mediafile.py index 45feb5c36..80f750f19 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -225,9 +225,13 @@ class MediaField(object): # possibly index the list if style.list_elem: - return entry[0] + if entry: # List must have at least one value. + return entry[0] + else: + return None else: return entry + except KeyError: # the tag isn't present return None diff --git a/test/rsrc/emptylist.mp3 b/test/rsrc/emptylist.mp3 new file mode 100644 index 000000000..083c6c2e0 Binary files /dev/null and b/test/rsrc/emptylist.mp3 differ diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 580f857f9..1b9d4fe4e 100755 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -222,6 +222,19 @@ def suite_for_file(path, correct_dict, writing=True): s.addTest(MakeWritingTest(path, correct_dict, field)()) 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 + self.assertEqual(genre, '') + + def suite(): s = unittest.TestSuite() @@ -250,6 +263,9 @@ def suite(): path = os.path.join('rsrc', fname) for field, value in correct_dict.iteritems(): s.addTest(MakeReadOnlyTest(path, field, value)()) + + # Edge cases. + s.addTest(EdgeTest('test_emptylist')) return s