Merge branch 'master' into cover_thumbnail

This commit is contained in:
Ozzie Isaacs 2022-04-13 18:37:44 +02:00
commit fe5d684d2c
11 changed files with 42 additions and 33 deletions

View File

@ -91,7 +91,7 @@ if wtf_present:
else: else:
csrf = None csrf = None
ub.init_db(cli.settingspath) ub.init_db(cli.settings_path)
# pylint: disable=no-member # pylint: disable=no-member
config = config_sql.load_configuration(ub.session) config = config_sql.load_configuration(ub.session)
@ -106,7 +106,7 @@ log = logger.create()
from . import services from . import services
db.CalibreDB.update_config(config) db.CalibreDB.update_config(config)
db.CalibreDB.setup_db(config.config_calibre_dir, cli.settingspath) db.CalibreDB.setup_db(config.config_calibre_dir, cli.settings_path)
calibre_db = db.CalibreDB() calibre_db = db.CalibreDB()

View File

@ -24,7 +24,7 @@ import socket
from .constants import CONFIG_DIR as _CONFIG_DIR from .constants import CONFIG_DIR as _CONFIG_DIR
from .constants import STABLE_VERSION as _STABLE_VERSION from .constants import STABLE_VERSION as _STABLE_VERSION
from .constants import NIGHTLY_VERSION as _NIGHTLY_VERSION from .constants import NIGHTLY_VERSION as _NIGHTLY_VERSION
from .constants import DEFAULT_SETTINGS_FILE, DEFAULT_GDRIVE_FILE
def version_info(): def version_info():
if _NIGHTLY_VERSION[1].startswith('$Format'): if _NIGHTLY_VERSION[1].startswith('$Format'):
@ -51,8 +51,15 @@ parser.add_argument('-d', action='store_true', help='Dry run of updater to check
parser.add_argument('-r', action='store_true', help='Enable public database reconnect route under /reconnect') parser.add_argument('-r', action='store_true', help='Enable public database reconnect route under /reconnect')
args = parser.parse_args() args = parser.parse_args()
settingspath = args.p or os.path.join(_CONFIG_DIR, "app.db") settings_path = args.p or os.path.join(_CONFIG_DIR, DEFAULT_SETTINGS_FILE)
gdpath = args.g or os.path.join(_CONFIG_DIR, "gdrive.db") gd_path = args.g or os.path.join(_CONFIG_DIR, DEFAULT_GDRIVE_FILE)
if os.path.isdir(settings_path):
settings_path = os.path.join(settings_path, DEFAULT_SETTINGS_FILE)
if os.path.isdir(gd_path):
gd_path = os.path.join(gd_path, DEFAULT_GDRIVE_FILE)
# handle and check parameter for ssl encryption # handle and check parameter for ssl encryption
certfilepath = None certfilepath = None

View File

@ -50,6 +50,8 @@ if HOME_CONFIG:
else: else:
CONFIG_DIR = os.environ.get('CALIBRE_DBPATH', BASE_DIR) CONFIG_DIR = os.environ.get('CALIBRE_DBPATH', BASE_DIR)
DEFAULT_SETTINGS_FILE = "app.db"
DEFAULT_GDRIVE_FILE = "gdrive.db"
ROLE_USER = 0 << 0 ROLE_USER = 0 << 0
ROLE_ADMIN = 1 << 0 ROLE_ADMIN = 1 << 0

View File

@ -811,7 +811,7 @@ def edit_book(book_id):
if to_save["cover_url"].endswith('/static/generic_cover.jpg'): if to_save["cover_url"].endswith('/static/generic_cover.jpg'):
book.has_cover = 0 book.has_cover = 0
else: else:
result, error = helper.save_cover_from_url(to_save["cover_url"], book.path) result, error = helper.save_cover_from_url(to_save["cover_url"].strip(), book.path)
if result is True: if result is True:
book.has_cover = 1 book.has_cover = 1
modify_date = True modify_date = True

View File

@ -35,10 +35,6 @@ except ImportError:
from sqlalchemy.exc import OperationalError, InvalidRequestError, IntegrityError from sqlalchemy.exc import OperationalError, InvalidRequestError, IntegrityError
from sqlalchemy.sql.expression import text from sqlalchemy.sql.expression import text
#try:
# from six import __version__ as six_version
#except ImportError:
# six_version = "not installed"
try: try:
from httplib2 import __version__ as httplib2_version from httplib2 import __version__ as httplib2_version
except ImportError: except ImportError:
@ -141,11 +137,12 @@ class Gdrive:
def __init__(self): def __init__(self):
self.drive = getDrive(gauth=Gauth.Instance().auth) self.drive = getDrive(gauth=Gauth.Instance().auth)
def is_gdrive_ready(): def is_gdrive_ready():
return os.path.exists(SETTINGS_YAML) and os.path.exists(CREDENTIALS) return os.path.exists(SETTINGS_YAML) and os.path.exists(CREDENTIALS)
engine = create_engine('sqlite:///{0}'.format(cli.gdpath), echo=False) engine = create_engine('sqlite:///{0}'.format(cli.gd_path), echo=False)
Base = declarative_base() Base = declarative_base()
# Open session for database connection # Open session for database connection
@ -193,11 +190,11 @@ def migrate():
session.execute('ALTER TABLE gdrive_ids2 RENAME to gdrive_ids') session.execute('ALTER TABLE gdrive_ids2 RENAME to gdrive_ids')
break break
if not os.path.exists(cli.gdpath): if not os.path.exists(cli.gd_path):
try: try:
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
except Exception as ex: except Exception as ex:
log.error("Error connect to database: {} - {}".format(cli.gdpath, ex)) log.error("Error connect to database: {} - {}".format(cli.gd_path, ex))
raise raise
migrate() migrate()

View File

@ -819,6 +819,9 @@ def save_cover_from_url(url, book_path):
log.error("python modul advocate is not installed but is needed") log.error("python modul advocate is not installed but is needed")
return False, _("Python modul 'advocate' is not installed but is needed for cover downloads") return False, _("Python modul 'advocate' is not installed but is needed for cover downloads")
img.raise_for_status() img.raise_for_status()
# # cover_processing()
# move_coverfile(meta, db_book)
return save_cover(img, book_path) return save_cover(img, book_path)
except (socket.gaierror, except (socket.gaierror,
requests.exceptions.HTTPError, requests.exceptions.HTTPError,
@ -868,24 +871,23 @@ def save_cover(img, book_path):
content_type = img.headers.get('content-type') content_type = img.headers.get('content-type')
if use_IM: if use_IM:
if content_type not in ('image/jpeg', 'image/png', 'image/webp', 'image/bmp'): if content_type not in ('image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/bmp'):
log.error("Only jpg/jpeg/png/webp/bmp files are supported as coverfile") log.error("Only jpg/jpeg/png/webp/bmp files are supported as coverfile")
return False, _("Only jpg/jpeg/png/webp/bmp files are supported as coverfile") return False, _("Only jpg/jpeg/png/webp/bmp files are supported as coverfile")
# convert to jpg because calibre only supports jpg # convert to jpg because calibre only supports jpg
if content_type != 'image/jpg': try:
try: if hasattr(img, 'stream'):
if hasattr(img, 'stream'): imgc = Image(blob=img.stream)
imgc = Image(blob=img.stream) else:
else: imgc = Image(blob=io.BytesIO(img.content))
imgc = Image(blob=io.BytesIO(img.content)) imgc.format = 'jpeg'
imgc.format = 'jpeg' imgc.transform_colorspace("rgb")
imgc.transform_colorspace("rgb") img = imgc
img = imgc except (BlobError, MissingDelegateError):
except (BlobError, MissingDelegateError): log.error("Invalid cover file content")
log.error("Invalid cover file content") return False, _("Invalid cover file content")
return False, _("Invalid cover file content")
else: else:
if content_type not in 'image/jpeg': if content_type not in ['image/jpeg', 'image/jpg']:
log.error("Only jpg/jpeg files are supported as coverfile") log.error("Only jpg/jpeg files are supported as coverfile")
return False, _("Only jpg/jpeg files are supported as coverfile") return False, _("Only jpg/jpeg files are supported as coverfile")

View File

@ -125,6 +125,7 @@ class LubimyCzytac(Metadata):
) )
return final_matches return final_matches
return matches return matches
return []
def _prepare_query(self, title: str) -> str: def _prepare_query(self, title: str) -> str:
query = "" query = ""

View File

@ -381,8 +381,8 @@ $(function() {
//extraScrollPx: 300 //extraScrollPx: 300
}); });
$loadMore.on( "append.infiniteScroll", function( event, response, path, data ) { $loadMore.on( "append.infiniteScroll", function( event, response, path, data ) {
$(".pagination").addClass("hidden").html(() => $(response).find(".pagination").html());
if ($("body").hasClass("blur")) { if ($("body").hasClass("blur")) {
$(".pagination").addClass("hidden").html(() => $(response).find(".pagination").html());
$(" a:not(.dropdown-toggle) ") $(" a:not(.dropdown-toggle) ")
.removeAttr("data-toggle"); .removeAttr("data-toggle");
} }

View File

@ -231,7 +231,7 @@ def pdf_meta(tmp_file_path, original_file_name, original_file_extension):
if title == '': if title == '':
title = doc_info.title if doc_info.title else original_file_name title = doc_info.title if doc_info.title else original_file_name
if subject == '': if subject == '':
subject = doc_info.subject subject = doc_info.subject or ""
if tags == '' and '/Keywords' in doc_info: if tags == '' and '/Keywords' in doc_info:
if isinstance(doc_info['/Keywords'], bytes): if isinstance(doc_info['/Keywords'], bytes):
tags = doc_info['/Keywords'].decode('utf-8') tags = doc_info['/Keywords'].decode('utf-8')

View File

@ -1,5 +1,5 @@
# GDrive Integration # GDrive Integration
google-api-python-client>=1.7.11,<2.43.0 google-api-python-client>=1.7.11,<2.44.0
gevent>20.6.0,<22.0.0 gevent>20.6.0,<22.0.0
greenlet>=0.4.17,<1.2.0 greenlet>=0.4.17,<1.2.0
httplib2>=0.9.2,<0.21.0 httplib2>=0.9.2,<0.21.0
@ -13,7 +13,7 @@ rsa>=3.4.2,<4.9.0
# Gmail # Gmail
google-auth-oauthlib>=0.4.3,<0.6.0 google-auth-oauthlib>=0.4.3,<0.6.0
google-api-python-client>=1.7.11,<2.43.0 google-api-python-client>=1.7.11,<2.44.0
# goodreads # goodreads
goodreads>=0.3.2,<0.4.0 goodreads>=0.3.2,<0.4.0

View File

@ -62,7 +62,7 @@ install_requires =
[options.extras_require] [options.extras_require]
gdrive = gdrive =
google-api-python-client>=1.7.11,<2.43.0 google-api-python-client>=1.7.11,<2.44.0
gevent>20.6.0,<22.0.0 gevent>20.6.0,<22.0.0
greenlet>=0.4.17,<1.2.0 greenlet>=0.4.17,<1.2.0
httplib2>=0.9.2,<0.21.0 httplib2>=0.9.2,<0.21.0
@ -75,7 +75,7 @@ gdrive =
rsa>=3.4.2,<4.9.0 rsa>=3.4.2,<4.9.0
gmail = gmail =
google-auth-oauthlib>=0.4.3,<0.6.0 google-auth-oauthlib>=0.4.3,<0.6.0
google-api-python-client>=1.7.11,<2.43.0 google-api-python-client>=1.7.11,<2.44.0
goodreads = goodreads =
goodreads>=0.3.2,<0.4.0 goodreads>=0.3.2,<0.4.0
python-Levenshtein>=0.12.0,<0.13.0 python-Levenshtein>=0.12.0,<0.13.0