From e94e36eca03a5dc9b5781bdd1a1b218a4449a8da Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Mon, 22 Oct 2018 17:20:36 +0200 Subject: [PATCH] PICARD-1383: Select release with matching barcode on disc ID lookup --- picard/disc.py | 5 ++++- picard/ui/cdlookup.py | 10 ++++++++-- picard/util/__init__.py | 18 ++++++++++++++++++ test/test_utils.py | 15 +++++++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/picard/disc.py b/picard/disc.py index d91fedb8e..62110457b 100644 --- a/picard/disc.py +++ b/picard/disc.py @@ -43,6 +43,7 @@ class Disc(QtCore.QObject): def __init__(self): super().__init__() self.id = None + self.mcn = None self.submission_url = None def read(self, device=None): @@ -50,9 +51,11 @@ class Disc(QtCore.QObject): device = discid.get_default_device() log.debug("Reading CD using device: %r", device) try: - disc = discid.read(device) + disc = discid.read(device, features=['mcn']) self.id = disc.id + self.mcn = disc.mcn self.submission_url = disc.submission_url + log.debug("Read disc ID %s with MCN %s", self.id, self.mcn) except discid.disc.DiscError as e: log.error("Error while reading %r: %s" % (device, str(e))) raise diff --git a/picard/ui/cdlookup.py b/picard/ui/cdlookup.py index 816b853f8..9a5a7b297 100644 --- a/picard/ui/cdlookup.py +++ b/picard/ui/cdlookup.py @@ -31,7 +31,10 @@ from picard.mbjson import ( label_info_from_node, release_dates_and_countries_from_node, ) -from picard.util import restore_method +from picard.util import ( + compare_barcodes, + restore_method, +) from picard.ui import PicardDialog from picard.ui.ui_cdlookup import Ui_Dialog @@ -61,11 +64,14 @@ class CDLookupDialog(PicardDialog): def myjoin(l): return "\n".join(l) + selected = None for release in self.releases: labels, catalog_numbers = label_info_from_node(release['label-info']) dates, countries = release_dates_and_countries_from_node(release) barcode = release['barcode'] if "barcode" in release else "" item = QtWidgets.QTreeWidgetItem(self.ui.release_list) + if disc.mcn and compare_barcodes(barcode, disc.mcn): + selected = item item.setText(0, release['title']) item.setText(1, artist_credit_from_node(release['artist-credit'])[0]) item.setText(2, myjoin(dates)) @@ -74,7 +80,7 @@ class CDLookupDialog(PicardDialog): item.setText(5, myjoin(catalog_numbers)) item.setText(6, barcode) item.setData(0, QtCore.Qt.UserRole, release['id']) - self.ui.release_list.setCurrentItem(self.ui.release_list.topLevelItem(0)) + self.ui.release_list.setCurrentItem(selected or self.ui.release_list.topLevelItem(0)) self.ui.ok_button.setEnabled(True) for i in range(self.ui.release_list.columnCount() - 1): self.ui.release_list.resizeColumnToContents(i) diff --git a/picard/util/__init__.py b/picard/util/__init__.py index c97fec387..b2ab5aa52 100644 --- a/picard/util/__init__.py +++ b/picard/util/__init__.py @@ -566,3 +566,21 @@ def reconnect(signal, newhandler=None, oldhandler=None): break if newhandler is not None: signal.connect(newhandler) + + +def compare_barcodes(barcode1, barcode2): + """ + Compares two barcodes. Returns True if they are the same, False otherwise. + + Tries to normalize UPC barcodes to EAN barcodes so e.g. "727361379704" + and "0727361379704" are considered the same. + """ + if barcode1 == barcode2: + return True + if not barcode1 or not barcode2: + return False + if len(barcode1) == 12: + barcode1 = '0' + barcode1 + if len(barcode2) == 12: + barcode2 = '0' + barcode2 + return barcode1 == barcode2 diff --git a/test/test_utils.py b/test/test_utils.py index 853f94d0b..1d7cf0571 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -225,3 +225,18 @@ class ImageInfoTest(PicardTestCase): imageinfo.identify, data) self.assertRaises(imageinfo.UnrecognizedFormat, imageinfo.identify, data) + +class CompareBarcodesTest(unittest.TestCase): + + def test_same(self): + self.assertTrue(util.compare_barcodes('0727361379704', '0727361379704')) + self.assertTrue(util.compare_barcodes('727361379704', '727361379704')) + self.assertTrue(util.compare_barcodes('727361379704', '0727361379704')) + self.assertTrue(util.compare_barcodes('0727361379704', '727361379704')) + self.assertTrue(util.compare_barcodes(None, None)) + + def test_not_same(self): + self.assertFalse(util.compare_barcodes('0727361379704', '0727361379705')) + self.assertFalse(util.compare_barcodes('727361379704', '1727361379704')) + self.assertFalse(util.compare_barcodes('0727361379704', None)) + self.assertFalse(util.compare_barcodes(None, '0727361379704'))