def __init__(self, source, single_book_per_directory=True, db=None, parent=None, callback=None, pool=None, list_of_archives=False): if isinstance(source, str): source = make_long_path_useable(source) else: source = list(map(make_long_path_useable, source)) if not validate_source(source, parent): return QObject.__init__(self, parent) self.author_map_rules = None if gprefs.get('author_map_on_add_rules'): from calibre.ebooks.metadata.author_mapper import compile_rules as acr self.author_map_rules = acr(gprefs['author_map_on_add_rules']) self.single_book_per_directory = single_book_per_directory self.ignore_opf = False self.list_of_archives = list_of_archives self.callback = callback self.add_formats_to_existing = prefs['add_formats_to_existing'] self.do_one_signal.connect(self.tick, type=Qt.ConnectionType.QueuedConnection) self.pool = pool self.pd = ProgressDialog(_('Adding books...'), _('Scanning for files...'), min=0, max=0, parent=parent, icon='add_book.png') self.db = getattr(db, 'new_api', None) if self.db is not None: self.dbref = weakref.ref(db) self.source = source self.tdir = PersistentTemporaryDirectory('_add_books') self.scan_error = None self.file_groups = OrderedDict() self.abort_scan = False self.duplicates = [] self.report = [] self.items = [] self.added_book_ids = set() self.merged_formats_added_to = set() self.merged_books = set() self.added_duplicate_info = set() self.pd.show() self.scan_thread = Thread(target=self.scan, name='ScanBooks') self.scan_thread.daemon = True self.scan_thread.start() self.do_one = self.monitor_scan self.do_one_signal.emit() if DEBUG: self.start_time = time.time()
def run_import_plugins(formats): from calibre.ebooks.metadata.worker import run_import_plugins import_ctx['group_id'] += 1 ans = run_import_plugins(formats, import_ctx['group_id'], import_ctx['tdir']) fm = import_ctx['format_map'] for old_path, new_path in zip(formats, ans): new_path = make_long_path_useable(new_path) fm[new_path] = old_path return ans
def export_settings(self): name, ok = QInputDialog.getText(self, _('Name for these settings'), _('Theme name:'), text=_('My cover style')) if ok: base = os.path.join(config_dir, 'cover-generation-themes') os.makedirs(base, exist_ok=True) path = make_long_path_useable(os.path.join(base, name + '.json')) raw = self.settings.serialized_prefs with open(path, 'wb') as f: f.write(raw)
def path_from_qurl(qurl, allow_remote=False): lf = qurl.toLocalFile() if lf: if iswindows: from calibre_extensions.winutil import get_long_path_name lf = get_long_path_name(lf) lf = make_long_path_useable(lf) return lf if not allow_remote: return '' if qurl.scheme() in remote_protocols: path = qurl.path() if path and '.' in path: return path.rpartition('.')[-1] return ''
def listdir(root, sort_by_mtime=False): items = (make_long_path_useable(os.path.join(root, x)) for x in unicode_listdir(root)) if sort_by_mtime: def safe_mtime(x): try: return os.path.getmtime(x) except OSError: return time.time() items = sorted(items, key=safe_mtime) for path in items: if path_ok(path): yield path
def find_books_in_directory(dirpath, single_book_per_directory, compiled_rules=(), listdir_impl=listdir): dirpath = make_long_path_useable(os.path.abspath(dirpath)) if single_book_per_directory: formats = {} for path in listdir_impl(dirpath): key, ext = splitext(path) if allow_path(path, ext, compiled_rules): formats[ext] = path if formats_ok(formats): yield list(itervalues(formats)) else: books = defaultdict(dict) for path in listdir_impl(dirpath, sort_by_mtime=True): key, ext = splitext(path) if allow_path(path, ext, compiled_rules): books[icu_lower(key) if isinstance(key, str) else key.lower( )][ext] = path for formats in itervalues(books): if formats_ok(formats): yield list(itervalues(formats))