diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index cb36a413..c1c0268d 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -31,6 +31,7 @@ from ub import config import cli import shutil from flask import Response, stream_with_context +import time from sqlalchemy import * from sqlalchemy.ext.declarative import declarative_base @@ -187,7 +188,7 @@ def getFolderInFolder(parentId, folderName, drive): # drive = getDrive(drive) query="" if folderName: - query = "title = '%s' and " % folderName.replace("'", "\\'") + query = "title = '%s' and " % folderName.replace("'", r"\'") folder = query + "'%s' in parents and mimeType = 'application/vnd.google-apps.folder'" \ " and trashed = false" % parentId fileList = drive.ListFile({'q': folder}).GetList() @@ -214,7 +215,7 @@ def getEbooksFolderId(drive=None): def getFile(pathId, fileName, drive): - metaDataFile = "'%s' in parents and trashed = false and title = '%s'" % (pathId, fileName.replace("'", "\\'")) + metaDataFile = "'%s' in parents and trashed = false and title = '%s'" % (pathId, fileName.replace("'", r"\'")) fileList = drive.ListFile({'q': metaDataFile}).GetList() if fileList.__len__() == 0: return None @@ -249,7 +250,7 @@ def getFolderId(path, drive): dbChange = True currentFolderId = currentFolder['id'] else: - currentFolderId= None + currentFolderId = None break if dbChange: session.commit() @@ -271,16 +272,9 @@ def getFileFromEbooksFolder(path, fileName): return None -'''def copyDriveFileRemote(drive, origin_file_id, copy_title): - drive = getDrive(drive) - copied_file = {'title': copy_title} - try: - file_data = drive.auth.service.files().copy( - fileId = origin_file_id, body=copied_file).execute() - return drive.CreateFile({'id': file_data['id']}) - except errors.HttpError as error: - print ('An error occurred: %s' % error) - return None''' +def moveGdriveFileRemote(origin_file_id, new_title): + origin_file_id['title']= new_title + origin_file_id.Upload() # Download metadata.db from gdrive @@ -307,9 +301,11 @@ def moveGdriveFolderRemote(origin_file, target_folder): # if previous_parents has no childs anymore, delete originfileparent # is not working correctly, because of slow update on gdrive -> could cause trouble in gdrive.db # (nonexisting folder has id) - # children = drive.auth.service.children().list(folderId=previous_parents).execute() - # if not len(children['items']): - # drive.auth.service.files().delete(fileId=previous_parents).execute() + time.sleep(20) + children = drive.auth.service.children().list(folderId=previous_parents).execute() + if not len(children['items']): + drive.auth.service.files().delete(fileId=previous_parents).execute() + time.sleep(20) @@ -323,7 +319,7 @@ def copyToDrive(drive, uploadFile, createRoot, replaceFiles, 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() + (os.path.basename(uploadFile).replace("'", r"\'"), 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']}], @@ -338,11 +334,11 @@ def copyToDrive(drive, uploadFile, createRoot, replaceFiles, 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() + (os.path.basename(uploadFile).replace("'", r"\'"), parent['id'])}).GetList() if len(existingFiles) > 0: driveFile = existingFiles[0] else: - driveFile = drive.CreateFile({'title': os.path.basename(uploadFile), + driveFile = drive.CreateFile({'title': os.path.basename(uploadFile).replace("'", r"\'"), 'parents': [{"kind":"drive#fileLink", 'id': parent['id']}], }) driveFile.SetContentFile(os.path.join(prevDir, uploadFile)) driveFile.Upload() @@ -355,7 +351,7 @@ def uploadFileToEbooksFolder(destFile, f): 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() + (x.replace("'", r"\'"), parent['id'])}).GetList() if len(existingFiles) > 0: driveFile = existingFiles[0] else: @@ -364,7 +360,7 @@ def uploadFileToEbooksFolder(destFile, f): driveFile.Upload() else: existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % - (x, parent['id'])}).GetList() + (x.replace("'", r"\'"), 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"}) @@ -475,9 +471,10 @@ def updateGdriveCalibreFromLocal(): # update gdrive.db on edit of books title def updateDatabaseOnEdit(ID,newPath): + sqlCheckPath = newPath if newPath[-1] == '/' else newPath + u'/' storedPathName = session.query(GdriveId).filter(GdriveId.gdrive_id == ID).first() if storedPathName: - storedPathName.path = newPath + storedPathName.path = sqlCheckPath session.commit() diff --git a/cps/helper.py b/cps/helper.py index 31d82e73..d7f42be7 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -324,11 +324,11 @@ def update_dir_structure_file(book_id, calibrepath, first_author): # Rename all files from old names to new names if authordir != new_authordir or titledir != new_titledir: try: + new_name = get_valid_filename(localbook.title) + ' - ' + get_valid_filename(new_authordir) + path_name = os.path.join(calibrepath, new_authordir, os.path.basename(path)) for file_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, file_format.name + '.' + file_format.format.lower()), - os.path.join(path_name,new_name + '.' + file_format.format.lower())) + os.path.join(path_name, new_name + '.' + file_format.format.lower())) file_format.name = new_name except OSError as ex: web.app.logger.error("Rename file in path " + path + " to " + new_name + ": " + str(ex)) @@ -341,6 +341,7 @@ def update_dir_structure_file(book_id, calibrepath, first_author): def update_dir_structure_gdrive(book_id, first_author): error = False book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + path = book.path authordir = book.path.split('/')[0] if first_author: @@ -348,7 +349,7 @@ def update_dir_structure_gdrive(book_id, first_author): else: new_authordir = get_valid_filename(book.authors[0].name) titledir = book.path.split('/')[1] - new_titledir = get_valid_filename(book.title) + " (" + str(book_id) + ")" + new_titledir = get_valid_filename(book.title) + u" (" + str(book_id) + u")" if titledir != new_titledir: gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path), titledir) @@ -356,7 +357,9 @@ def update_dir_structure_gdrive(book_id, first_author): gFile['title'] = new_titledir gFile.Upload() - book.path = book.path.split('/')[0] + '/' + new_titledir + time.sleep(10) + book.path = book.path.split('/')[0] + u'/' + new_titledir + path = book.path 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 @@ -364,24 +367,24 @@ def update_dir_structure_gdrive(book_id, first_author): if authordir != new_authordir: gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path), titledir) if gFile: - gd.moveGdriveFolderRemote(gFile,new_authordir) - book.path = new_authordir + '/' + book.path.split('/')[1] + gd.moveGdriveFolderRemote(gFile, new_authordir) + time.sleep(10) + book.path = new_authordir + u'/' + book.path.split('/')[1] + path = book.path 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''' + new_name = get_valid_filename(book.title) + u' - ' + get_valid_filename(new_authordir) + for file_format in book.data: + gFile = gd.getFileFromEbooksFolder(path, file_format.name + u'.' + file_format.format.lower()) + if not gFile: + error = _(u'File %(file)s not found on Google Drive', file=file_format.name) # file not found + break + gd.moveGdriveFileRemote(gFile, new_name + u'.' + file_format.format.lower()) + file_format.name = new_name return error diff --git a/cps/web.py b/cps/web.py index 2aeb78ad..9f5f809a 100644 --- a/cps/web.py +++ b/cps/web.py @@ -3845,6 +3845,7 @@ def upload(): # upload book to gdrive if nesseccary and add "(bookid)" to folder name if config.config_use_google_drive: gdriveutils.updateGdriveCalibreFromLocal() + time.sleep(10) error = helper.update_dir_stucture(book.id, config.config_calibre_dir) db.session.commit() if config.config_use_google_drive: