diff --git a/cps/__init__.py b/cps/__init__.py index 851b04d8..f6df9636 100644 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -91,7 +91,7 @@ if wtf_present: else: csrf = None -ub.init_db(cli.settingspath) +ub.init_db(cli.settings_path) # pylint: disable=no-member config = config_sql.load_configuration(ub.session) @@ -106,7 +106,7 @@ log = logger.create() from . import services 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() diff --git a/cps/cli.py b/cps/cli.py index 36c03513..629fd76d 100644 --- a/cps/cli.py +++ b/cps/cli.py @@ -24,7 +24,7 @@ import socket from .constants import CONFIG_DIR as _CONFIG_DIR from .constants import STABLE_VERSION as _STABLE_VERSION from .constants import NIGHTLY_VERSION as _NIGHTLY_VERSION - +from .constants import DEFAULT_SETTINGS_FILE, DEFAULT_GDRIVE_FILE def version_info(): 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') args = parser.parse_args() -settingspath = args.p or os.path.join(_CONFIG_DIR, "app.db") -gdpath = args.g or os.path.join(_CONFIG_DIR, "gdrive.db") +settings_path = args.p or os.path.join(_CONFIG_DIR, DEFAULT_SETTINGS_FILE) +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 certfilepath = None diff --git a/cps/constants.py b/cps/constants.py index 7c1fc661..c0a75037 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -50,6 +50,8 @@ if HOME_CONFIG: else: CONFIG_DIR = os.environ.get('CALIBRE_DBPATH', BASE_DIR) +DEFAULT_SETTINGS_FILE = "app.db" +DEFAULT_GDRIVE_FILE = "gdrive.db" ROLE_USER = 0 << 0 ROLE_ADMIN = 1 << 0 diff --git a/cps/editbooks.py b/cps/editbooks.py index e2e4a534..79255178 100755 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -811,7 +811,7 @@ def edit_book(book_id): if to_save["cover_url"].endswith('/static/generic_cover.jpg'): book.has_cover = 0 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: book.has_cover = 1 modify_date = True diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index 6073777e..ee8ee953 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -35,10 +35,6 @@ except ImportError: from sqlalchemy.exc import OperationalError, InvalidRequestError, IntegrityError from sqlalchemy.sql.expression import text -#try: -# from six import __version__ as six_version -#except ImportError: -# six_version = "not installed" try: from httplib2 import __version__ as httplib2_version except ImportError: @@ -141,11 +137,12 @@ class Gdrive: def __init__(self): self.drive = getDrive(gauth=Gauth.Instance().auth) + def is_gdrive_ready(): 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() # Open session for database connection @@ -193,11 +190,11 @@ def migrate(): session.execute('ALTER TABLE gdrive_ids2 RENAME to gdrive_ids') break -if not os.path.exists(cli.gdpath): +if not os.path.exists(cli.gd_path): try: Base.metadata.create_all(engine) 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 migrate() diff --git a/cps/helper.py b/cps/helper.py index b6b95a15..9d8a1d3b 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -819,6 +819,9 @@ def save_cover_from_url(url, book_path): 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") img.raise_for_status() + # # cover_processing() + # move_coverfile(meta, db_book) + return save_cover(img, book_path) except (socket.gaierror, requests.exceptions.HTTPError, @@ -868,24 +871,23 @@ def save_cover(img, book_path): content_type = img.headers.get('content-type') 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") return False, _("Only jpg/jpeg/png/webp/bmp files are supported as coverfile") # convert to jpg because calibre only supports jpg - if content_type != 'image/jpg': - try: - if hasattr(img, 'stream'): - imgc = Image(blob=img.stream) - else: - imgc = Image(blob=io.BytesIO(img.content)) - imgc.format = 'jpeg' - imgc.transform_colorspace("rgb") - img = imgc - except (BlobError, MissingDelegateError): - log.error("Invalid cover file content") - return False, _("Invalid cover file content") + try: + if hasattr(img, 'stream'): + imgc = Image(blob=img.stream) + else: + imgc = Image(blob=io.BytesIO(img.content)) + imgc.format = 'jpeg' + imgc.transform_colorspace("rgb") + img = imgc + except (BlobError, MissingDelegateError): + log.error("Invalid cover file content") + return False, _("Invalid cover file content") 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") return False, _("Only jpg/jpeg files are supported as coverfile") diff --git a/cps/metadata_provider/lubimyczytac.py b/cps/metadata_provider/lubimyczytac.py index 90a6b2d8..4a77f4ea 100644 --- a/cps/metadata_provider/lubimyczytac.py +++ b/cps/metadata_provider/lubimyczytac.py @@ -125,6 +125,7 @@ class LubimyCzytac(Metadata): ) return final_matches return matches + return [] def _prepare_query(self, title: str) -> str: query = "" diff --git a/cps/static/js/main.js b/cps/static/js/main.js index b18cf229..91084f06 100755 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -381,8 +381,8 @@ $(function() { //extraScrollPx: 300 }); $loadMore.on( "append.infiniteScroll", function( event, response, path, data ) { + $(".pagination").addClass("hidden").html(() => $(response).find(".pagination").html()); if ($("body").hasClass("blur")) { - $(".pagination").addClass("hidden").html(() => $(response).find(".pagination").html()); $(" a:not(.dropdown-toggle) ") .removeAttr("data-toggle"); } diff --git a/cps/uploader.py b/cps/uploader.py index 992d188c..6aa811be 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -231,7 +231,7 @@ def pdf_meta(tmp_file_path, original_file_name, original_file_extension): if title == '': title = doc_info.title if doc_info.title else original_file_name if subject == '': - subject = doc_info.subject + subject = doc_info.subject or "" if tags == '' and '/Keywords' in doc_info: if isinstance(doc_info['/Keywords'], bytes): tags = doc_info['/Keywords'].decode('utf-8') diff --git a/optional-requirements.txt b/optional-requirements.txt index 208d889d..fea410e5 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,5 +1,5 @@ # 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 greenlet>=0.4.17,<1.2.0 httplib2>=0.9.2,<0.21.0 @@ -13,7 +13,7 @@ rsa>=3.4.2,<4.9.0 # Gmail 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>=0.3.2,<0.4.0 diff --git a/setup.cfg b/setup.cfg index de7dde1f..fc23e529 100644 --- a/setup.cfg +++ b/setup.cfg @@ -62,7 +62,7 @@ install_requires = [options.extras_require] 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 greenlet>=0.4.17,<1.2.0 httplib2>=0.9.2,<0.21.0 @@ -75,7 +75,7 @@ gdrive = rsa>=3.4.2,<4.9.0 gmail = 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>=0.3.2,<0.4.0 python-Levenshtein>=0.12.0,<0.13.0