From fa4918a2dbbcd583a0b1956a2cda9c5cf93aecbc Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sun, 6 Jan 2019 15:00:34 +0100 Subject: [PATCH] File renaming according to title and author (#654) - gdrive is missing --- cps/gdriveutils.py | 25 ++++++++++++++++--------- cps/helper.py | 40 +++++++++++++++++++++++++++++++++++----- cps/web.py | 37 +------------------------------------ 3 files changed, 52 insertions(+), 50 deletions(-) diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index 8da2d282..cfe2564b 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -112,7 +112,8 @@ def migrate(): sql=sql[0].replace(currUniqueConstraint, 'UNIQUE (gdrive_id, path)') sql=sql.replace(GdriveId.__tablename__, GdriveId.__tablename__ + '2') session.execute(sql) - session.execute('INSERT INTO gdrive_ids2 (id, gdrive_id, path) SELECT id, gdrive_id, path FROM gdrive_ids;') + session.execute("INSERT INTO gdrive_ids2 (id, gdrive_id, path) SELECT id, " + "gdrive_id, path FROM gdrive_ids;") session.commit() session.execute('DROP TABLE %s' % 'gdrive_ids') session.execute('ALTER TABLE gdrive_ids2 RENAME to gdrive_ids') @@ -165,7 +166,8 @@ def getFolderInFolder(parentId, folderName, drive): query="" if folderName: query = "title = '%s' and " % folderName.replace("'", "\\'") - folder = query + "'%s' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" % parentId + folder = query + "'%s' in parents and mimeType = 'application/vnd.google-apps.folder'" \ + " and trashed = false" % parentId fileList = drive.ListFile({'q': folder}).GetList() if fileList.__len__() == 0: return None @@ -191,7 +193,6 @@ def getEbooksFolderId(drive=None): def getFile(pathId, fileName, drive): metaDataFile = "'%s' in parents and trashed = false and title = '%s'" % (pathId, fileName.replace("'", "\\'")) - fileList = drive.ListFile({'q': metaDataFile}).GetList() if fileList.__len__() == 0: return None @@ -299,9 +300,11 @@ def copyToDrive(drive, uploadFile, createRoot, replaceFiles, if not parent: parent = getEbooksFolder(drive) if os.path.isdir(os.path.join(prevDir,uploadFile)): - existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (os.path.basename(uploadFile), parent['id'])}).GetList() + existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % + (os.path.basename(uploadFile), parent['id'])}).GetList() if len(existingFolder) == 0 and (not isInitial or createRoot): - parent = drive.CreateFile({'title': os.path.basename(uploadFile), 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}], + parent = drive.CreateFile({'title': os.path.basename(uploadFile), + 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}], "mimeType": "application/vnd.google-apps.folder"}) parent.Upload() else: @@ -312,11 +315,13 @@ def copyToDrive(drive, uploadFile, createRoot, replaceFiles, copyToDrive(drive, f, True, replaceFiles, ignoreFiles, parent, os.path.join(prevDir, uploadFile)) else: if os.path.basename(uploadFile) not in ignoreFiles: - existingFiles = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (os.path.basename(uploadFile), parent['id'])}).GetList() + existingFiles = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % + (os.path.basename(uploadFile), parent['id'])}).GetList() if len(existingFiles) > 0: driveFile = existingFiles[0] else: - driveFile = drive.CreateFile({'title': os.path.basename(uploadFile), 'parents': [{"kind":"drive#fileLink", 'id': parent['id']}], }) + driveFile = drive.CreateFile({'title': os.path.basename(uploadFile), + 'parents': [{"kind":"drive#fileLink", 'id': parent['id']}], }) driveFile.SetContentFile(os.path.join(prevDir, uploadFile)) driveFile.Upload() @@ -327,7 +332,8 @@ def uploadFileToEbooksFolder(destFile, f): splitDir = destFile.split('/') for i, x in enumerate(splitDir): if i == len(splitDir)-1: - existingFiles = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (x, parent['id'])}).GetList() + existingFiles = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % + (x, parent['id'])}).GetList() if len(existingFiles) > 0: driveFile = existingFiles[0] else: @@ -335,7 +341,8 @@ def uploadFileToEbooksFolder(destFile, f): driveFile.SetContentFile(f) driveFile.Upload() else: - existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (x, parent['id'])}).GetList() + existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % + (x, parent['id'])}).GetList() if len(existingFolder) == 0: parent = drive.CreateFile({'title': x, 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}], "mimeType": "application/vnd.google-apps.folder"}) diff --git a/cps/helper.py b/cps/helper.py index 26a3aa23..8a4fd5dd 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -284,22 +284,39 @@ def update_dir_structure_file(book_id, calibrepath, first_author): web.app.logger.info("Copying title: " + path + " into existing: " + new_title_path) for dir_name, subdir_list, file_list in os.walk(path): for file in file_list: - os.renames(os.path.join(dir_name, file), os.path.join(new_title_path + dir_name[len(path):], file)) + os.renames(os.path.join(dir_name, file), + os.path.join(new_title_path + dir_name[len(path):], file)) path = new_title_path localbook.path = localbook.path.split('/')[0] + '/' + new_titledir except OSError as ex: web.app.logger.error("Rename title from: " + path + " to " + new_title_path + ": " + str(ex)) web.app.logger.debug(ex, exc_info=True) - return _("Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s", src=path, dest=new_title_path, error=str(ex)) + return _("Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s", + src=path, dest=new_title_path, error=str(ex)) if authordir != new_authordir: try: - new_author_path = os.path.join(os.path.join(calibrepath, new_authordir), os.path.basename(path)) + new_author_path = os.path.join(calibrepath, new_authordir, os.path.basename(path)) os.renames(path, new_author_path) localbook.path = new_authordir + '/' + localbook.path.split('/')[1] except OSError as ex: web.app.logger.error("Rename author from: " + path + " to " + new_author_path + ": " + str(ex)) web.app.logger.debug(ex, exc_info=True) - return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", src=path, dest=new_author_path, error=str(ex)) + return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", + src=path, dest=new_author_path, error=str(ex)) + # Rename all files from old names to new names + if authordir != new_authordir or titledir != new_titledir: + try: + for format in localbook.data: + path_name = os.path.join(calibrepath, new_authordir, os.path.basename(path)) + new_name = get_valid_filename(localbook.title) + ' - ' + get_valid_filename(new_authordir) + os.renames(os.path.join(path_name, format.name + '.' + format.format.lower()), + os.path.join(path_name,new_name + '.' + format.format.lower())) + format.name = new_name + except OSError as ex: + web.app.logger.error("Rename file in path " + path + " to " + new_name + ": " + str(ex)) + web.app.logger.debug(ex, exc_info=True) + return _("Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s", + src=path, dest=new_name, error=str(ex)) return False @@ -324,7 +341,7 @@ def update_dir_structure_gdrive(book_id, first_author): book.path = book.path.split('/')[0] + '/' + new_titledir gd.updateDatabaseOnEdit(gFile['id'], book.path) # only child folder affected else: - error = _(u'File %(file)s not found on Google Drive', file= book.path) # file not found + error = _(u'File %(file)s not found on Google Drive', file=book.path) # file not found if authordir != new_authordir: gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path), titledir) @@ -334,6 +351,19 @@ def update_dir_structure_gdrive(book_id, first_author): gd.updateDatabaseOnEdit(gFile['id'], book.path) else: error = _(u'File %(file)s not found on Google Drive', file=authordir) # file not found + # Rename all files from old names to new names + # ToDo: Rename also all bookfiles with new author name and new title name + ''' + if authordir != new_authordir or titledir != new_titledir: + for format in book.data: + # path_name = os.path.join(calibrepath, new_authordir, os.path.basename(path)) + new_name = get_valid_filename(book.title) + ' - ' + get_valid_filename(book) + format.name = new_name + if gFile: + pass + else: + error = _(u'File %(file)s not found on Google Drive', file=format.name) # file not found + break''' return error diff --git a/cps/web.py b/cps/web.py index bd80068e..d8a5b2f5 100644 --- a/cps/web.py +++ b/cps/web.py @@ -525,18 +525,6 @@ def fill_indexpage(page, database, db_filter, order, *join): .filter(common_filters()).order_by(*order).offset(off).limit(config.config_books_per_page).all() for book in entries: book = order_authors(book) - '''sort_authors = book.author_sort.split('&') - authors_ordered = list() - error = False - for auth in sort_authors: - # ToDo: How to handle not found authorname - result = db.session.query(db.Authors).filter(db.Authors.sort == auth.lstrip().strip()).first() - if not result: - error = True - break - authors_ordered.append(result) - if not error: - book.authors = authors_ordered''' return entries, randm, pagination @@ -1689,18 +1677,6 @@ def show_book(book_id): entries.tags = sort(entries.tags, key = lambda tag: tag.name) entries = order_authors(entries) - '''sort_authors = entries.author_sort.split('&') - authors_ordered = list() - error = False - for auth in sort_authors: - # ToDo: How to handle not found authorname - result = db.session.query(db.Authors).filter(db.Authors.sort == auth.lstrip().strip()).first() - if not result: - error = True - break - authors_ordered.append(result) - if not error: - entries.authors = authors_ordered''' kindle_list = helper.check_send_to_kindle(entries) reader_list = helper.check_read_formats(entries) @@ -3480,19 +3456,8 @@ def render_edit_book(book_id): for indx in range(0, len(book.languages)): book.languages[indx].language_name = language_table[get_locale()][book.languages[indx].lang_code] + book = order_authors(book) - '''sort_authors = book.author_sort.split('&') - authors_ordered = list() - error = False - for auth in sort_authors: - # ToDo: How to handle not found authorname - result = db.session.query(db.Authors).filter(db.Authors.sort == auth.lstrip().strip()).first() - if not result: - error = True - break - authors_ordered.append(result) - if not error: - book.authors = authors_ordered''' author_names = [] for authr in book.authors: