Enable embedd metadata of kepub file during conversion

This commit is contained in:
Ozzie Isaacs 2024-01-08 20:51:38 +01:00
parent bf2ac97c47
commit e0327db08f
3 changed files with 19 additions and 14 deletions

View File

@ -179,8 +179,6 @@ STABLE_VERSION = {'version': '0.6.22b'}
NIGHTLY_VERSION = dict() NIGHTLY_VERSION = dict()
NIGHTLY_VERSION[0] = '$Format:%H$' NIGHTLY_VERSION[0] = '$Format:%H$'
NIGHTLY_VERSION[1] = '$Format:%cI$' NIGHTLY_VERSION[1] = '$Format:%cI$'
# NIGHTLY_VERSION[0] = 'bb7d2c6273ae4560e83950d36d64533343623a57'
# NIGHTLY_VERSION[1] = '2018-09-09T10:13:08+02:00'
# CACHE # CACHE
CACHE_TYPE_THUMBNAILS = 'thumbnails' CACHE_TYPE_THUMBNAILS = 'thumbnails'

View File

@ -948,7 +948,7 @@ def do_download_file(book, book_format, client, data, headers):
os.makedirs(output_path) os.makedirs(output_path)
output = os.path.join(config.config_calibre_dir, book.path, book_name + "." + book_format) output = os.path.join(config.config_calibre_dir, book.path, book_name + "." + book_format)
gd.downloadFile(book.path, book_name + "." + book_format, output) gd.downloadFile(book.path, book_name + "." + book_format, output)
filename, download_name = do_calibre_export(book, book_format) filename, download_name = do_calibre_export(book.id, book_format)
else: else:
return gd.do_gdrive_download(df, headers) return gd.do_gdrive_download(df, headers)
else: else:
@ -963,7 +963,7 @@ def do_download_file(book, book_format, client, data, headers):
headers["Content-Disposition"] = headers["Content-Disposition"].replace(".kepub", ".kepub.epub") headers["Content-Disposition"] = headers["Content-Disposition"].replace(".kepub", ".kepub.epub")
if config.config_binariesdir and config.config_embed_metadata: if config.config_binariesdir and config.config_embed_metadata:
filename, download_name = do_calibre_export(book, book_format) filename, download_name = do_calibre_export(book.id, book_format)
else: else:
download_name = book_name download_name = book_name
@ -975,7 +975,7 @@ def do_download_file(book, book_format, client, data, headers):
return response return response
def do_calibre_export(book, book_format): def do_calibre_export(book_id, book_format):
try: try:
quotes = [3, 5, 7, 9] quotes = [3, 5, 7, 9]
tmp_dir = get_temp_dir() tmp_dir = get_temp_dir()
@ -983,7 +983,7 @@ def do_calibre_export(book, book_format):
temp_file_name = str(uuid4()) temp_file_name = str(uuid4())
opf_command = [calibredb_binarypath, 'export', '--dont-write-opf', '--with-library', config.config_calibre_dir, opf_command = [calibredb_binarypath, 'export', '--dont-write-opf', '--with-library', config.config_calibre_dir,
'--to-dir', tmp_dir, '--formats', book_format, "--template", "{}".format(temp_file_name), '--to-dir', tmp_dir, '--formats', book_format, "--template", "{}".format(temp_file_name),
str(book.id)] str(book_id)]
p = process_open(opf_command, quotes) p = process_open(opf_command, quotes)
_, err = p.communicate() _, err = p.communicate()
if err: if err:

View File

@ -22,6 +22,7 @@ from glob import glob
from shutil import copyfile, copyfileobj from shutil import copyfile, copyfileobj
from markupsafe import escape from markupsafe import escape
from time import time from time import time
from uuid import uuid4
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from flask_babel import lazy_gettext as N_ from flask_babel import lazy_gettext as N_
@ -36,7 +37,7 @@ from cps.ub import init_db_thread
from cps.file_helper import get_temp_dir from cps.file_helper import get_temp_dir
from cps.tasks.mail import TaskEmail from cps.tasks.mail import TaskEmail
from cps import gdriveutils from cps import gdriveutils, helper
from cps.constants import SUPPORTED_CALIBRE_BINARIES from cps.constants import SUPPORTED_CALIBRE_BINARIES
log = logger.create() log = logger.create()
@ -124,7 +125,7 @@ class TaskConvert(CalibreTask):
# check to see if destination format already exists - or if book is in database # check to see if destination format already exists - or if book is in database
# if it does - mark the conversion task as complete and return a success # if it does - mark the conversion task as complete and return a success
# this will allow send to E-Reader workflow to continue to work # this will allow to send to E-Reader workflow to continue to work
if os.path.isfile(file_path + format_new_ext) or\ if os.path.isfile(file_path + format_new_ext) or\
local_db.get_book_format(self.book_id, self.settings['new_book_format']): local_db.get_book_format(self.book_id, self.settings['new_book_format']):
log.info("Book id %d already converted to %s", book_id, format_new_ext) log.info("Book id %d already converted to %s", book_id, format_new_ext)
@ -207,8 +208,15 @@ class TaskConvert(CalibreTask):
return return
def _convert_kepubify(self, file_path, format_old_ext, format_new_ext): def _convert_kepubify(self, file_path, format_old_ext, format_new_ext):
if config.config_embed_metadata:
tmp_dir, temp_file_name = helper.do_calibre_export(self.book_id, format_old_ext[1:])
filename = os.path.join(tmp_dir, temp_file_name + format_old_ext)
temp_file_path = tmp_dir
else:
filename = file_path + format_old_ext
temp_file_path = os.path.dirname(file_path)
quotes = [1, 3] quotes = [1, 3]
command = [config.config_kepubifypath, (file_path + format_old_ext), '-o', os.path.dirname(file_path)] command = [config.config_kepubifypath, filename, '-o', temp_file_path, '-i']
try: try:
p = process_open(command, quotes) p = process_open(command, quotes)
except OSError as e: except OSError as e:
@ -222,13 +230,12 @@ class TaskConvert(CalibreTask):
if p.poll() is not None: if p.poll() is not None:
break break
# ToD Handle
# process returncode # process returncode
check = p.returncode check = p.returncode
# move file # move file
if check == 0: if check == 0:
converted_file = glob(os.path.join(os.path.dirname(file_path), "*.kepub.epub")) converted_file = glob(os.path.splitext(filename)[0] + "*.kepub.epub")
if len(converted_file) == 1: if len(converted_file) == 1:
copyfile(converted_file[0], (file_path + format_new_ext)) copyfile(converted_file[0], (file_path + format_new_ext))
os.unlink(converted_file[0]) os.unlink(converted_file[0])
@ -238,17 +245,17 @@ class TaskConvert(CalibreTask):
return check, None return check, None
def _convert_calibre(self, file_path, format_old_ext, format_new_ext, has_cover): def _convert_calibre(self, file_path, format_old_ext, format_new_ext, has_cover):
book_id = self.book_id
try: try:
# path_tmp_opf = self._embed_metadata()
if config.config_embed_metadata: if config.config_embed_metadata:
quotes = [3, 5] quotes = [3, 5]
tmp_dir = get_temp_dir() tmp_dir = get_temp_dir()
calibredb_binarypath = os.path.join(config.config_binariesdir, SUPPORTED_CALIBRE_BINARIES["calibredb"]) calibredb_binarypath = os.path.join(config.config_binariesdir, SUPPORTED_CALIBRE_BINARIES["calibredb"])
opf_command = [calibredb_binarypath, 'show_metadata', '--as-opf', str(book_id), opf_command = [calibredb_binarypath, 'show_metadata', '--as-opf', str(self.book_id),
'--with-library', config.config_calibre_dir] '--with-library', config.config_calibre_dir]
p = process_open(opf_command, quotes) p = process_open(opf_command, quotes)
p.wait() p.wait()
path_tmp_opf = os.path.join(tmp_dir, "metadata_" + str(current_milli_time()) + ".opf") path_tmp_opf = os.path.join(tmp_dir, "metadata_" + str(uuid4()) + ".opf")
with open(path_tmp_opf, 'w') as fd: with open(path_tmp_opf, 'w') as fd:
copyfileobj(p.stdout, fd) copyfileobj(p.stdout, fd)