%PDF- %PDF-
Direktori : /lib/calibre/calibre/gui2/dialogs/ |
Current File : //lib/calibre/calibre/gui2/dialogs/add_from_isbn.py |
#!/usr/bin/env python3 __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' import os from qt.core import ( QApplication, QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QLineEdit, QPlainTextEdit, QPushButton, Qt, QVBoxLayout ) from calibre.constants import iswindows from calibre.ebooks.metadata import check_isbn from calibre.gui2 import error_dialog, gprefs, question_dialog class AddFromISBN(QDialog): def __init__(self, parent=None): QDialog.__init__(self, parent) self.setup_ui() path = 'C:\\Users\\kovid\\e-books\\some_book.epub' if iswindows else \ '/Users/kovid/e-books/some_book.epub' self.label.setText(str(self.label.text())%path) self.isbns = [] self.books = [] self.set_tags = [] def setup_ui(self): self.resize(678, 430) self.setWindowTitle(_("Add books by ISBN")) self.setWindowIcon(QIcon(I('add_book.png'))) self.l = l = QVBoxLayout(self) self.h = h = QHBoxLayout() l.addLayout(h) self.bb = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok|QDialogButtonBox.StandardButton.Cancel, self) bb.button(QDialogButtonBox.StandardButton.Ok).setText(_('&OK')) l.addWidget(bb), bb.accepted.connect(self.accept), bb.rejected.connect(self.reject) self.ll = l = QVBoxLayout() h.addLayout(l) self.isbn_box = i = QPlainTextEdit(self) i.setFocus(Qt.FocusReason.OtherFocusReason) l.addWidget(i) self.paste_button = b = QPushButton(_("&Paste from clipboard"), self) l.addWidget(b), b.clicked.connect(self.paste) self.lll = l = QVBoxLayout() h.addLayout(l) self.label = la = QLabel(_( "<p>Enter a list of ISBNs in the box to the left, one per line. calibre will automatically" " create entries for books based on the ISBN and download metadata and covers for them.</p>\n" "<p>Any invalid ISBNs in the list will be ignored.</p>\n" "<p>You can also specify a file that will be added with each ISBN. To do this enter the full" " path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>"), self) l.addWidget(la), la.setWordWrap(True) l.addSpacing(20) self.la2 = la = QLabel(_("&Tags to set on created book entries:"), self) l.addWidget(la) self.add_tags = le = QLineEdit(self) le.setText(', '.join(gprefs.get('add from ISBN tags', []))) la.setBuddy(le) l.addWidget(le) self._check_for_existing = ce = QCheckBox(_('Check for books with the same ISBN already in library'), self) ce.setChecked(gprefs.get('add from ISBN dup check', False)) l.addWidget(ce) l.addStretch(10) def paste(self, *args): app = QApplication.instance() c = app.clipboard() txt = str(c.text()).strip() if txt: old = str(self.isbn_box.toPlainText()).strip() new = old + '\n' + txt self.isbn_box.setPlainText(new) @property def check_for_existing(self): return self._check_for_existing.isChecked() def accept(self, *args): tags = str(self.add_tags.text()).strip().split(',') tags = list(filter(None, [x.strip() for x in tags])) gprefs['add from ISBN tags'] = tags gprefs['add from ISBN dup check'] = self.check_for_existing self.set_tags = tags bad = set() for line in str(self.isbn_box.toPlainText()).strip().splitlines(): line = line.strip() if not line: continue parts = line.split('>>') if len(parts) > 2: parts = [parts[0] + '>>'.join(parts[1:])] parts = [x.strip() for x in parts] if not parts[0]: continue isbn = check_isbn(parts[0]) if isbn is not None: isbn = isbn.upper() if isbn not in self.isbns: self.isbns.append(isbn) book = {'isbn': isbn, 'path': None} if len(parts) > 1 and parts[1] and \ os.access(parts[1], os.R_OK) and os.path.isfile(parts[1]): book['path'] = parts[1] self.books.append(book) else: bad.add(parts[0]) if bad: if self.books: if not question_dialog(self, _('Some invalid ISBNs'), _('Some of the ISBNs you entered were invalid. They will' ' be ignored. Click "Show details" to see which ones.' ' Do you want to proceed?'), det_msg='\n'.join(bad), show_copy_button=True): return else: return error_dialog(self, _('All invalid ISBNs'), _('All the ISBNs you entered were invalid. No books' ' can be added.'), show=True) QDialog.accept(self, *args)