diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index e2db770d..b82f13f1 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -344,7 +344,7 @@ def getFileFromEbooksFolder(path, fileName): def moveGdriveFileRemote(origin_file_id, new_title): - origin_file_id['title']= new_title + origin_file_id['title'] = new_title origin_file_id.Upload() @@ -422,7 +422,7 @@ def copyToDrive(drive, uploadFile, createRoot, replaceFiles, driveFile.Upload() -def uploadFileToEbooksFolder(destFile, f): +def uploadFileToEbooksFolder(destFile, f, string=False): drive = getDrive(Gdrive.Instance().drive) parent = getEbooksFolder(drive) splitDir = destFile.split('/') @@ -435,7 +435,10 @@ def uploadFileToEbooksFolder(destFile, f): else: driveFile = drive.CreateFile({'title': x, 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}], }) - driveFile.SetContentFile(f) + if not string: + driveFile.SetContentFile(f) + else: + driveFile.SetContentString(f) driveFile.Upload() else: existing_Folder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % diff --git a/cps/tasks/metadata_backup.py b/cps/tasks/metadata_backup.py index 162d4852..1751feeb 100644 --- a/cps/tasks/metadata_backup.py +++ b/cps/tasks/metadata_backup.py @@ -17,10 +17,9 @@ # along with this program. If not, see . import os -from lxml import objectify from urllib.request import urlopen from lxml import etree -from html import escape + from cps import config, db, gdriveutils, logger from cps.services.worker import CalibreTask @@ -102,50 +101,29 @@ class TaskBackupMetadata(CalibreTask): self.calibre_db.session.close() def open_metadata(self, book, custom_columns): + package = self.create_new_metadata_backup(book, custom_columns) if config.config_use_google_drive: if not gdriveutils.is_gdrive_ready(): raise Exception('Google Drive is configured but not ready') - web_content_link = gdriveutils.get_metadata_backup_via_gdrive(book.path) - if not web_content_link: - raise Exception('Google Drive cover url not found') - - stream = None - try: - stream = urlopen(web_content_link) - except Exception as ex: - # Bubble exception to calling function - self.log.debug('Error reading metadata.opf: ' + str(ex)) # ToDo Check whats going on - raise ex - finally: - if stream is not None: - stream.close() + gdriveutils.uploadFileToEbooksFolder(os.path.join(book.path, 'metadata.opf').replace("\\", "/"), + etree.tostring(package, + xml_declaration=True, + encoding='utf-8', + pretty_print=True).decode('utf-8'), + True) else: # ToDo: Handle book folder not found or not readable book_metadata_filepath = os.path.join(config.config_calibre_dir, book.path, 'metadata.opf') - #if not os.path.isfile(book_metadata_filepath): - self.create_new_metadata_backup(book, custom_columns, book_metadata_filepath) - # else: - '''namespaces = {'dc': PURL_NAMESPACE, 'opf': OPF_NAMESPACE} - test = etree.parse(book_metadata_filepath) - root = test.getroot() - for i in root.iter(): - self.log.info(i) - title = root.find("dc:metadata", namespaces) - pass - with open(book_metadata_filepath, "rb") as f: - xml = f.read() + # prepare finalize everything and output + doc = etree.ElementTree(package) + try: + with open(book_metadata_filepath, 'wb') as f: + doc.write(f, xml_declaration=True, encoding='utf-8', pretty_print=True) + except Exception as ex: + raise Exception('Writing Metadata failed with error: {} '.format(ex)) - root = objectify.fromstring(xml) - # root.metadata['{http://purl.org/dc/elements/1.1/}title'] - # root.metadata[PURL + 'title'] - # getattr(root.metadata, PURL +'title') - # test = objectify.parse() - pass - # backup not found has to be created - #raise Exception('Book cover file not found')''' - - def create_new_metadata_backup(self, book, custom_columns, book_metadata_filepath): + def create_new_metadata_backup(self, book, custom_columns): # generate root package element package = etree.Element(OPF + "package", nsmap=OPF_NS) package.set("unique-identifier", "uuid_id") @@ -230,14 +208,7 @@ class TaskBackupMetadata(CalibreTask): guide = etree.SubElement(package, "guide") etree.SubElement(guide, "reference", type="cover", title=self.translated_title, href="cover.jpg") - # prepare finalize everything and output - doc = etree.ElementTree(package) - # doc = etree.tostring(package, xml_declaration=True, encoding='utf-8', pretty_print=True) # .replace(b""", b""") - try: - with open(book_metadata_filepath, 'wb') as f: - doc.write(f, xml_declaration=True, encoding='utf-8', pretty_print=True) - except Exception as ex: - raise Exception('Writing Metadata failed with error: {} '.format(ex)) + return package @property def name(self):