diff --git a/picard/disc.py b/picard/disc.py index 28269fd3e..90fe80ad7 100644 --- a/picard/disc.py +++ b/picard/disc.py @@ -24,6 +24,9 @@ from PyQt4 import QtCore from picard.ui.cdlookup import CDLookupDialog +_libdiscid = None + + class DiscError(IOError): pass @@ -36,16 +39,17 @@ class Disc(QtCore.QObject): self.submission_url = None def read(self, device): - libdiscid = _openLibrary() - handle = libdiscid.discid_new() + global _libdiscid + if _libdiscid is None: + _libdiscid = _openLibrary() + handle = _libdiscid.discid_new() assert handle != 0, "libdiscid: discid_new() returned NULL" - res = libdiscid.discid_read(handle, device) + res = _libdiscid.discid_read(handle, device) if res == 0: - raise DiscError(libdiscid.discid_get_error_msg(handle)) - self.id = libdiscid.discid_get_id(handle) - self.submission_url = libdiscid.discid_get_submission_url(handle) - print self.submission_url - libdiscid.discid_free(handle) + raise DiscError(_libdiscid.discid_get_error_msg(handle)) + self.id = _libdiscid.discid_get_id(handle) + self.submission_url = _libdiscid.discid_get_submission_url(handle) + _libdiscid.discid_free(handle) def lookup(self): self.tagger.xmlws.find_releases(self._lookup_finished, discid=self.id) diff --git a/picard/tagger.py b/picard/tagger.py index 11bedaf83..f7041e7a1 100644 --- a/picard/tagger.py +++ b/picard/tagger.py @@ -58,6 +58,7 @@ from picard.browser.browser import BrowserIntegration from picard.browser.filelookup import FileLookup from picard.cluster import Cluster, ClusterList, UnmatchedFiles from picard.config import Config +from picard.disc import Disc, DiscError from picard.file import File from picard.formats import open as open_file from picard.metadata import Metadata @@ -551,6 +552,7 @@ class Tagger(QtGui.QApplication): return album return None + def remove_files(self, files): """Remove files from the tagger.""" for file in files: @@ -588,28 +590,34 @@ class Tagger(QtGui.QApplication): if files: self.remove_files(files) + def lookup_cd(self, action=None): - from picard.disc import Disc + """Reads CD from the selected drive and tries to lookup the DiscID on MusicBrainz.""" if action is None: device = self.config.setting["cd_lookup_device"].split(",", 1)[0] else: device = unicode(action.text()) + + def read_disc_error(self, error): + self.restore_cursor() + QtGui.QMessageBox.critical(self.window, _(u"CD Lookup Error"), _(u"Error while reading CD:\n\n%s") % error) + + def read_disc_finished(self, disc): + self.restore_cursor() + disc.lookup() + + def read_disc_thread(self, disc, device): + try: + disc.read(encode_filename(device)) + except (NotImplementedError, DiscError), e: + self.thread_assist.proxy_to_main(read_disc_error, self, str(e)) + else: + self.thread_assist.proxy_to_main(read_disc_finished, self, disc) + disc = Disc() self.set_wait_cursor() - self.util_thread.add_task(self._read_disc_thread, disc, device) + self.util_thread.add_task(read_disc_thread, self, disc, device) - def _read_disc_thread(self, disc, device): - from picard.disc import DiscError - try: - disc.read(encode_filename(device)) - except (NotImplementedError, DiscError), e: - self.thread_assist.proxy_to_main(self._read_disc_error, str(e)) - return - self.thread_assist.proxy_to_main(disc.lookup) - - def _read_disc_error(self, error): - self.restore_cursor() - QtGui.QMessageBox.critical(self.window, _(u"CD Lookup Error"), _("Error while reading CD:\n\n%s") % error) def analyze(self, objs): """Analyze the file(s)."""