Merge branch 'master' into cover_thumbnail
This commit is contained in:
commit
fe5d684d2c
|
@ -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()
|
||||||
|
|
13
cps/cli.py
13
cps/cli.py
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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 = ""
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user