diff --git a/beets/autotag/__init__.py b/beets/autotag/__init__.py index 01a700ef0..fd7ddce96 100644 --- a/beets/autotag/__init__.py +++ b/beets/autotag/__init__.py @@ -130,12 +130,17 @@ def _order_items_meta(items): for item in items: if item.track: index = item.track - 1 - ordered_items[index] = item + + # Make sure the index is valid. if index in available_indices: available_indices.remove(index) else: # Same index used twice. return None + + # Apply index. + ordered_items[index] = item + else: # If we have any item without an index, give up. return None @@ -143,6 +148,8 @@ def _order_items_meta(items): if available_indices: # Not all indices were used. return None + + return ordered_items def _order_items_match(items, trackinfo): """Orders the items based on how they match some canonical track diff --git a/test/test_autotag.py b/test/test_autotag.py index 07c80a630..1f89f7d6f 100755 --- a/test/test_autotag.py +++ b/test/test_autotag.py @@ -193,6 +193,34 @@ class AlbumsInDirTest(unittest.TestCase): else: self.assertEqual(len(album), 1) +class OrderingTest(unittest.TestCase): + def test_metaorder_fails_on_duplicated_tracknum(self): + items = [] + items.append(Item({'title': 'two', 'track': 2})) + items.append(Item({'title': 'one', 'track': 1})) + items.append(Item({'title': 'twoagain', 'track': 2})) + ordered = autotag._order_items_meta(items) + self.assertEqual(ordered, None) + + def test_metaorder_fails_on_too_high_tracknum(self): + items = [] + items.append(Item({'title': 'four', 'track': 4})) + items.append(Item({'title': 'one', 'track': 1})) + items.append(Item({'title': 'two', 'track': 2})) + ordered = autotag._order_items_meta(items) + self.assertEqual(ordered, None) + + def test_metaorder_correct(self): + items = [] + items.append(Item({'title': 'three', 'track': 3})) + items.append(Item({'title': 'one', 'track': 1})) + items.append(Item({'title': 'two', 'track': 2})) + ordered = autotag._order_items_meta(items) + self.assertEqual(ordered[0].title, 'one') + self.assertEqual(ordered[1].title, 'two') + self.assertEqual(ordered[2].title, 'three') + + def suite(): return unittest.TestLoader().loadTestsFromName(__name__)