PICARD-1383: Select release with matching barcode on disc ID lookup

This commit is contained in:
Philipp Wolfer
2018-10-22 17:20:36 +02:00
parent 820dd45199
commit e94e36eca0
4 changed files with 45 additions and 3 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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'))