From f3130152b1b16aa21b73cbb0f0bda69d33a914f3 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Thu, 4 Aug 2011 12:04:22 -0700 Subject: [PATCH] don't count existing items/albums as duplicates (allowing update) --- beets/importer.py | 17 ++++++++++++----- test/test_importer.py | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/beets/importer.py b/beets/importer.py index 1b1cc5ae2..cf60b791a 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -106,8 +106,14 @@ def _duplicate_check(lib, task, recent=None): recent.add((artist, album)) # Look in the library. + cur_paths = set(i.path for i in task.items) for album_cand in lib.albums(artist=artist): if album_cand.album == album: + # Check whether the album is identical in contents, in which + # case it is not a duplicate (will be replaced). + other_paths = set(i.path for i in album_cand.items()) + if other_paths == cur_paths: + continue return True return False @@ -132,13 +138,14 @@ def _item_duplicate_check(lib, task, recent=None): # Check the library. item_iter = lib.items(artist=artist, title=title) try: - item_iter.next() - except StopIteration: - return False + for other_item in item_iter: + # Existing items not considered duplicates. + if other_item.path == task.item.path: + continue + return True finally: item_iter.close() - - return True + return False def _infer_album_fields(task): """Given an album and an associated import task, massage the diff --git a/test/test_importer.py b/test/test_importer.py index 62bcba7f8..15173badc 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -434,27 +434,35 @@ class DuplicateCheckTest(unittest.TestCase): self.i = _common.item() self.album = self.lib.add_album([self.i]) - def _album_task(self, asis, artist=None, album=None): - artist = artist or self.i.albumartist - album = album or self.i.album + def _album_task(self, asis, artist=None, album=None, existing=False): + if existing: + item = self.i + else: + item = _common.item() + artist = artist or item.albumartist + album = album or item.album task = importer.ImportTask(path='a path', toppath='top path', - items=[self.i]) + items=[item]) task.set_match(artist, album, None, None) if asis: task.set_choice(importer.action.ASIS) else: - task.set_choice(({'artist': artist, 'album': album}, [self.i])) + task.set_choice(({'artist': artist, 'album': album}, [item])) return task - def _item_task(self, asis, artist=None, title=None): - artist = artist or self.i.artist - title = title or self.i.title + def _item_task(self, asis, artist=None, title=None, existing=False): + if existing: + item = self.i + else: + item = _common.item() + artist = artist or item.artist + title = title or item.title - task = importer.ImportTask.item_task(self.i) + task = importer.ImportTask.item_task(item) if asis: - self.i.artist = artist - self.i.title = title + item.artist = artist + item.title = title task.set_choice(importer.action.ASIS) else: task.set_choice({'artist': artist, 'title': title}) @@ -524,6 +532,16 @@ class DuplicateCheckTest(unittest.TestCase): recent) self.assertTrue(res) + def test_duplicate_album_existing(self): + res = importer._duplicate_check(self.lib, + self._album_task(False, existing=True)) + self.assertFalse(res) + + def test_duplicate_item_existing(self): + res = importer._item_duplicate_check(self.lib, + self._item_task(False, existing=True)) + self.assertFalse(res) + def suite(): return unittest.TestLoader().loadTestsFromName(__name__)