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