Commit f1fac282 authored by OzzieIsaacs's avatar OzzieIsaacs

Improved error handling for renaming authors and titles (changes related to...

Improved error handling for renaming authors and titles (changes related to filesystem and not only to database)
parent b4aede78
...@@ -49,8 +49,8 @@ def process(tmp_file_path, original_file_name, original_file_extension): ...@@ -49,8 +49,8 @@ def process(tmp_file_path, original_file_name, original_file_extension):
meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension) meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension)
if ".FB2" == original_file_extension.upper() and use_fb2_meta is True: if ".FB2" == original_file_extension.upper() and use_fb2_meta is True:
meta = fb2.get_fb2_info(tmp_file_path, original_file_extension) meta = fb2.get_fb2_info(tmp_file_path, original_file_extension)
except Exception as e: except Exception as ex:
logger.warning('cannot parse metadata, using default: %s', e) logger.warning('cannot parse metadata, using default: %s', ex)
if meta and meta.title.strip() and meta.author.strip(): if meta and meta.title.strip() and meta.author.strip():
return meta return meta
...@@ -111,6 +111,7 @@ def pdf_preview(tmp_file_path, tmp_dir): ...@@ -111,6 +111,7 @@ def pdf_preview(tmp_file_path, tmp_dir):
img.save(filename=os.path.join(tmp_dir, cover_file_name)) img.save(filename=os.path.join(tmp_dir, cover_file_name))
return cover_file_name return cover_file_name
def get_versions(): def get_versions():
if not use_generic_pdf_cover: if not use_generic_pdf_cover:
IVersion=ImageVersion.MAGICK_VERSION IVersion=ImageVersion.MAGICK_VERSION
...@@ -120,4 +121,4 @@ def get_versions(): ...@@ -120,4 +121,4 @@ def get_versions():
PVersion=PyPdfVersion PVersion=PyPdfVersion
else: else:
PVersion=_(u'not installed') PVersion=_(u'not installed')
return {'ImageVersion':IVersion,'PyPdfVersion':PVersion} return {'ImageVersion': IVersion, 'PyPdfVersion': PVersion}
...@@ -26,12 +26,15 @@ def title_sort(title): ...@@ -26,12 +26,15 @@ def title_sort(title):
title = title.replace(prep, '') + ', ' + prep title = title.replace(prep, '') + ', ' + prep
return title.strip() return title.strip()
def lcase(s): def lcase(s):
return s.lower() return s.lower()
def ucase(s): def ucase(s):
return s.upper() return s.upper()
Base = declarative_base() Base = declarative_base()
books_authors_link = Table('books_authors_link', Base.metadata, books_authors_link = Table('books_authors_link', Base.metadata,
...@@ -64,6 +67,7 @@ books_publishers_link = Table('books_publishers_link', Base.metadata, ...@@ -64,6 +67,7 @@ books_publishers_link = Table('books_publishers_link', Base.metadata,
Column('publisher', Integer, ForeignKey('publishers.id'), primary_key=True) Column('publisher', Integer, ForeignKey('publishers.id'), primary_key=True)
) )
class Identifiers(Base): class Identifiers(Base):
__tablename__ = 'identifiers' __tablename__ = 'identifiers'
...@@ -197,6 +201,7 @@ class Languages(Base): ...@@ -197,6 +201,7 @@ class Languages(Base):
def __repr__(self): def __repr__(self):
return u"<Languages('{0}')>".format(self.lang_code) return u"<Languages('{0}')>".format(self.lang_code)
class Publishers(Base): class Publishers(Base):
__tablename__ = 'publishers' __tablename__ = 'publishers'
...@@ -204,7 +209,7 @@ class Publishers(Base): ...@@ -204,7 +209,7 @@ class Publishers(Base):
name = Column(String) name = Column(String)
sort = Column(String) sort = Column(String)
def __init__(self, name,sort): def __init__(self, name, sort):
self.name = name self.name = name
self.sort = sort self.sort = sort
...@@ -212,7 +217,6 @@ class Publishers(Base): ...@@ -212,7 +217,6 @@ class Publishers(Base):
return u"<Publishers('{0},{1}')>".format(self.name, self.sort) return u"<Publishers('{0},{1}')>".format(self.name, self.sort)
class Data(Base): class Data(Base):
__tablename__ = 'data' __tablename__ = 'data'
...@@ -260,7 +264,7 @@ class Books(Base): ...@@ -260,7 +264,7 @@ class Books(Base):
identifiers = relationship('Identifiers', backref='books') identifiers = relationship('Identifiers', backref='books')
def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover, def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover,
authors, tags, languages = None): authors, tags, languages=None):
self.title = title self.title = title
self.sort = sort self.sort = sort
self.author_sort = author_sort self.author_sort = author_sort
...@@ -300,7 +304,7 @@ def setup_db(): ...@@ -300,7 +304,7 @@ def setup_db():
global session global session
global cc_classes global cc_classes
if config.config_calibre_dir is None or config.config_calibre_dir == u'': if config.config_calibre_dir is None or config.config_calibre_dir == u'':
content = ub.session.query(ub.Settings).first() content = ub.session.query(ub.Settings).first()
content.config_calibre_dir = None content.config_calibre_dir = None
content.db_configured = False content.db_configured = False
...@@ -309,7 +313,7 @@ def setup_db(): ...@@ -309,7 +313,7 @@ def setup_db():
return False return False
dbpath = os.path.join(config.config_calibre_dir, "metadata.db") dbpath = os.path.join(config.config_calibre_dir, "metadata.db")
engine = create_engine('sqlite:///'+ dbpath, echo=False, isolation_level="SERIALIZABLE") engine = create_engine('sqlite:///' + dbpath, echo=False, isolation_level="SERIALIZABLE")
try: try:
conn = engine.connect() conn = engine.connect()
except Exception: except Exception:
......
...@@ -12,7 +12,7 @@ def extractCover(zipFile, coverFile, coverpath, tmp_file_name): ...@@ -12,7 +12,7 @@ def extractCover(zipFile, coverFile, coverpath, tmp_file_name):
if coverFile is None: if coverFile is None:
return None return None
else: else:
zipCoverPath = os.path.join(coverpath , coverFile).replace('\\','/') zipCoverPath = os.path.join(coverpath, coverFile).replace('\\', '/')
cf = zipFile.read(zipCoverPath) cf = zipFile.read(zipCoverPath)
prefix = os.path.splitext(tmp_file_name)[0] prefix = os.path.splitext(tmp_file_name)[0]
tmp_cover_name = prefix + '.' + os.path.basename(zipCoverPath) tmp_cover_name = prefix + '.' + os.path.basename(zipCoverPath)
...@@ -93,7 +93,7 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension): ...@@ -93,7 +93,7 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension):
coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='"+meta_cover[0]+"']/@href", namespaces=ns) coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='"+meta_cover[0]+"']/@href", namespaces=ns)
if len(coversection) > 0: if len(coversection) > 0:
filetype = coversection[0].rsplit('.', 1)[-1] filetype = coversection[0].rsplit('.', 1)[-1]
if filetype == "xhtml" or filetype == "html": #if cover is (x)html format if filetype == "xhtml" or filetype == "html": # if cover is (x)html format
markup = epubZip.read(os.path.join(coverpath, coversection[0])) markup = epubZip.read(os.path.join(coverpath, coversection[0]))
markupTree = etree.fromstring(markup) markupTree = etree.fromstring(markup)
# no matter xhtml or html with no namespace # no matter xhtml or html with no namespace
......
...@@ -3,10 +3,7 @@ ...@@ -3,10 +3,7 @@
from lxml import etree from lxml import etree
import uploader import uploader
#try:
# from io import StringIO
#except ImportError:
# import StringIO
def get_fb2_info(tmp_file_path, original_file_extension): def get_fb2_info(tmp_file_path, original_file_extension):
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -47,12 +47,9 @@ DEFAULT_PASS = "admin123" ...@@ -47,12 +47,9 @@ DEFAULT_PASS = "admin123"
DEFAULT_PORT = int(os.environ.get("CALIBRE_PORT", 8083)) DEFAULT_PORT = int(os.environ.get("CALIBRE_PORT", 8083))
DEVELOPMENT = False DEVELOPMENT = False
class UserBase: class UserBase:
@property @property
def is_authenticated(self): def is_authenticated(self):
...@@ -203,6 +200,7 @@ class Anonymous(AnonymousUserMixin, UserBase): ...@@ -203,6 +200,7 @@ class Anonymous(AnonymousUserMixin, UserBase):
def is_authenticated(self): def is_authenticated(self):
return False return False
# Baseclass representing Shelfs in calibre-web inapp.db # Baseclass representing Shelfs in calibre-web inapp.db
class Shelf(Base): class Shelf(Base):
__tablename__ = 'shelf' __tablename__ = 'shelf'
...@@ -290,7 +288,7 @@ class Settings(Base): ...@@ -290,7 +288,7 @@ class Settings(Base):
config_google_drive_folder = Column(String) config_google_drive_folder = Column(String)
config_google_drive_calibre_url_base = Column(String) config_google_drive_calibre_url_base = Column(String)
config_google_drive_watch_changes_response = Column(String) config_google_drive_watch_changes_response = Column(String)
config_columns_to_ignore = Column(String) #config_columns_to_ignore = Column(String)
config_remote_login = Column(Boolean) config_remote_login = Column(Boolean)
config_use_goodreads = Column(Boolean) config_use_goodreads = Column(Boolean)
config_goodreads_api_key = Column(String) config_goodreads_api_key = Column(String)
...@@ -403,22 +401,22 @@ class Config: ...@@ -403,22 +401,22 @@ class Config:
(self.config_default_role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS)) (self.config_default_role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS))
def mature_content_tags(self): def mature_content_tags(self):
if (sys.version_info > (3, 0)): #Python3 str, Python2 unicode if sys.version_info > (3, 0): # Python3 str, Python2 unicode
lstrip = str.lstrip lstrip = str.lstrip
else: else:
lstrip = unicode.lstrip lstrip = unicode.lstrip
return list(map(lstrip, self.config_mature_content_tags.split(","))) return list(map(lstrip, self.config_mature_content_tags.split(",")))
def get_Log_Level(self): def get_Log_Level(self):
ret_value="" ret_value = ""
if self.config_log_level == logging.INFO: if self.config_log_level == logging.INFO:
ret_value='INFO' ret_value = 'INFO'
elif self.config_log_level == logging.DEBUG: elif self.config_log_level == logging.DEBUG:
ret_value='DEBUG' ret_value = 'DEBUG'
elif self.config_log_level == logging.WARNING: elif self.config_log_level == logging.WARNING:
ret_value='WARNING' ret_value = 'WARNING'
elif self.config_log_level == logging.ERROR: elif self.config_log_level == logging.ERROR:
ret_value='ERROR' ret_value = 'ERROR'
return ret_value return ret_value
...@@ -495,7 +493,7 @@ def migrate_Database(): ...@@ -495,7 +493,7 @@ def migrate_Database():
conn = engine.connect() conn = engine.connect()
conn.execute("ALTER TABLE user ADD column `sidebar_view` Integer DEFAULT 1") conn.execute("ALTER TABLE user ADD column `sidebar_view` Integer DEFAULT 1")
session.commit() session.commit()
create=True create = True
try: try:
if create: if create:
conn = engine.connect() conn = engine.connect()
...@@ -535,11 +533,13 @@ def migrate_Database(): ...@@ -535,11 +533,13 @@ def migrate_Database():
conn = engine.connect() conn = engine.connect()
conn.execute("ALTER TABLE Settings ADD column `config_mature_content_tags` String DEFAULT ''") conn.execute("ALTER TABLE Settings ADD column `config_mature_content_tags` String DEFAULT ''")
def clean_database(): def clean_database():
# Remove expired remote login tokens # Remove expired remote login tokens
now = datetime.datetime.now() now = datetime.datetime.now()
session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete() session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete()
def create_default_config(): def create_default_config():
settings = Settings() settings = Settings()
settings.mail_server = "mail.example.com" settings.mail_server = "mail.example.com"
......
...@@ -14,17 +14,17 @@ BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, d ...@@ -14,17 +14,17 @@ BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, d
""" """
def upload(file): def upload(uploadfile):
tmp_dir = os.path.join(gettempdir(), 'calibre_web') tmp_dir = os.path.join(gettempdir(), 'calibre_web')
if not os.path.isdir(tmp_dir): if not os.path.isdir(tmp_dir):
os.mkdir(tmp_dir) os.mkdir(tmp_dir)
filename = file.filename filename = uploadfile.filename
filename_root, file_extension = os.path.splitext(filename) filename_root, file_extension = os.path.splitext(filename)
md5 = hashlib.md5() md5 = hashlib.md5()
md5.update(filename.encode('utf-8')) md5.update(filename.encode('utf-8'))
tmp_file_path = os.path.join(tmp_dir, md5.hexdigest()) tmp_file_path = os.path.join(tmp_dir, md5.hexdigest())
file.save(tmp_file_path) uploadfile.save(tmp_file_path)
meta = book_formats.process(tmp_file_path, filename_root, file_extension) meta = book_formats.process(tmp_file_path, filename_root, file_extension)
return meta return meta
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment