mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Linux: When adding books from directories ignore files that have undecodable names. Fixes #1685819 [adding books from directory crashes with unicode error](https://bugs.launchpad.net/calibre/+bug/1685819)
This commit is contained in:
parent
5f313b64af
commit
5a07f6a39c
@ -10,6 +10,8 @@ import os, time, re
|
|||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from future_builtins import map
|
from future_builtins import map
|
||||||
|
|
||||||
|
from calibre import prints
|
||||||
|
from calibre.constants import iswindows, isosx, filesystem_encoding
|
||||||
from calibre.ebooks import BOOK_EXTENSIONS
|
from calibre.ebooks import BOOK_EXTENSIONS
|
||||||
|
|
||||||
|
|
||||||
@ -56,6 +58,7 @@ def filter_filename(compiled_rules, filename):
|
|||||||
if q(filename):
|
if q(filename):
|
||||||
return action
|
return action
|
||||||
|
|
||||||
|
|
||||||
_metadata_extensions = None
|
_metadata_extensions = None
|
||||||
|
|
||||||
|
|
||||||
@ -68,8 +71,21 @@ def metadata_extensions():
|
|||||||
return _metadata_extensions
|
return _metadata_extensions
|
||||||
|
|
||||||
|
|
||||||
|
if iswindows or isosx:
|
||||||
|
unicode_listdir = os.listdir
|
||||||
|
else:
|
||||||
|
def unicode_listdir(root):
|
||||||
|
root = root.encode(filesystem_encoding)
|
||||||
|
for x in os.listdir(root):
|
||||||
|
try:
|
||||||
|
yield x.decode(filesystem_encoding)
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
prints('Ignoring un-decodable file:', x)
|
||||||
|
|
||||||
|
|
||||||
def listdir(root, sort_by_mtime=False):
|
def listdir(root, sort_by_mtime=False):
|
||||||
items = (os.path.join(root, x) for x in os.listdir(root))
|
|
||||||
|
items = (os.path.join(root, x) for x in unicode_listdir(root))
|
||||||
if sort_by_mtime:
|
if sort_by_mtime:
|
||||||
def safe_mtime(x):
|
def safe_mtime(x):
|
||||||
try:
|
try:
|
||||||
@ -236,5 +252,3 @@ def add_news(cache, path, arg, dbapi=None):
|
|||||||
if not hasattr(path, 'read'):
|
if not hasattr(path, 'read'):
|
||||||
stream.close()
|
stream.close()
|
||||||
return db_id
|
return db_id
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ from future_builtins import map
|
|||||||
from PyQt5.Qt import QObject, Qt, pyqtSignal
|
from PyQt5.Qt import QObject, Qt, pyqtSignal
|
||||||
|
|
||||||
from calibre import prints, as_unicode
|
from calibre import prints, as_unicode
|
||||||
from calibre.constants import DEBUG
|
from calibre.constants import DEBUG, iswindows, isosx, filesystem_encoding
|
||||||
from calibre.customize.ui import run_plugins_on_postimport, run_plugins_on_postadd
|
from calibre.customize.ui import run_plugins_on_postimport, run_plugins_on_postadd
|
||||||
from calibre.db.adding import find_books_in_directory, compile_rule
|
from calibre.db.adding import find_books_in_directory, compile_rule
|
||||||
from calibre.db.utils import find_identical_books
|
from calibre.db.utils import find_identical_books
|
||||||
@ -129,12 +129,27 @@ class Adder(QObject):
|
|||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
|
if iswindows or isosx:
|
||||||
def find_files(root):
|
def find_files(root):
|
||||||
for dirpath, dirnames, filenames in os.walk(root):
|
for dirpath, dirnames, filenames in os.walk(root):
|
||||||
for files in find_books_in_directory(dirpath, self.single_book_per_directory, compiled_rules=compiled_rules):
|
for files in find_books_in_directory(dirpath, self.single_book_per_directory, compiled_rules=compiled_rules):
|
||||||
if self.abort_scan:
|
if self.abort_scan:
|
||||||
return
|
return
|
||||||
self.file_groups[len(self.file_groups)] = files
|
self.file_groups[len(self.file_groups)] = files
|
||||||
|
else:
|
||||||
|
def find_files(root):
|
||||||
|
if isinstance(root, type(u'')):
|
||||||
|
root = root.encode(filesystem_encoding)
|
||||||
|
for dirpath, dirnames, filenames in os.walk(root):
|
||||||
|
try:
|
||||||
|
dirpath = dirpath.decode(filesystem_encoding)
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
prints('Ignoring non-decodable directory:', dirpath)
|
||||||
|
continue
|
||||||
|
for files in find_books_in_directory(dirpath, self.single_book_per_directory, compiled_rules=compiled_rules):
|
||||||
|
if self.abort_scan:
|
||||||
|
return
|
||||||
|
self.file_groups[len(self.file_groups)] = files
|
||||||
|
|
||||||
def extract(source):
|
def extract(source):
|
||||||
tdir = tempfile.mkdtemp(suffix='_archive', dir=self.tdir)
|
tdir = tempfile.mkdtemp(suffix='_archive', dir=self.tdir)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user