mirror of
https://github.com/fergalmoran/picard.git
synced 2025-12-26 11:18:20 +00:00
PICARD-1383: Select release with matching barcode on disc ID lookup
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'))
|
||||
|
||||
Reference in New Issue
Block a user