Optimize Clone implementation

This commit is contained in:
jaskaranSM 2020-06-18 12:57:31 +05:30 committed by lzzy12
parent 0e5c5ca874
commit e4ecc60407
2 changed files with 36 additions and 21 deletions

View File

@ -6,6 +6,7 @@ from urllib.parse import parse_qs
import re import re
import json import json
import requests import requests
import logging
from google.auth.transport.requests import Request from google.auth.transport.requests import Request
from google.oauth2 import service_account from google.oauth2 import service_account
@ -16,7 +17,7 @@ from googleapiclient.http import MediaFileUpload
from tenacity import * from tenacity import *
from bot import parent_id, DOWNLOAD_DIR, IS_TEAM_DRIVE, INDEX_URL, \ from bot import parent_id, DOWNLOAD_DIR, IS_TEAM_DRIVE, INDEX_URL, \
USE_SERVICE_ACCOUNTS USE_SERVICE_ACCOUNTS, download_dict
from bot.helper.ext_utils.bot_utils import * from bot.helper.ext_utils.bot_utils import *
from bot.helper.ext_utils.fs_utils import get_mime_type from bot.helper.ext_utils.fs_utils import get_mime_type
@ -167,7 +168,7 @@ class GoogleDriveHelper:
if USE_SERVICE_ACCOUNTS: if USE_SERVICE_ACCOUNTS:
self.switchServiceAccount() self.switchServiceAccount()
LOGGER.info(f"Got: {reason}, Trying Again.") LOGGER.info(f"Got: {reason}, Trying Again.")
self.upload_file(file_path, file_name, mime_type, parent_id) return self.upload_file(file_path, file_name, mime_type, parent_id)
else: else:
raise err raise err
self._file_uploaded_bytes = 0 self._file_uploaded_bytes = 0
@ -247,10 +248,37 @@ class GoogleDriveHelper:
if USE_SERVICE_ACCOUNTS: if USE_SERVICE_ACCOUNTS:
self.switchServiceAccount() self.switchServiceAccount()
LOGGER.info(f"Got: {reason}, Trying Again.") LOGGER.info(f"Got: {reason}, Trying Again.")
self.copyFile(file_id,dest_id) return self.copyFile(file_id,dest_id)
else: else:
raise err raise err
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
def getFileMetadata(self,file_id):
return self.__service.files().get(supportsAllDrives=True, fileId=file_id,
fields="name,id,mimeType,size").execute()
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
def getFilesByFolderId(self,folder_id):
page_token = None
q = f"'{folder_id}' in parents"
files = []
while True:
response = self.__service.files().list(supportsTeamDrives=True,
includeTeamDriveItems=True,
q=q,
spaces='drive',
pageSize=200,
fields='nextPageToken, files(id, name, mimeType,size)',
pageToken=page_token).execute()
for file in response.get('files', []):
files.append(file)
page_token = response.get('nextPageToken', None)
if page_token is None:
break
return files
def clone(self, link): def clone(self, link):
self.transferred_size = 0 self.transferred_size = 0
try: try:
@ -304,23 +332,9 @@ class GoogleDriveHelper:
return msg return msg
def cloneFolder(self, name, local_path, folder_id, parent_id): def cloneFolder(self, name, local_path, folder_id, parent_id):
page_token = None
q = f"'{folder_id}' in parents"
files = []
LOGGER.info(f"Syncing: {local_path}") LOGGER.info(f"Syncing: {local_path}")
files = self.getFilesByFolderId(folder_id)
new_id = None new_id = None
while True:
response = self.__service.files().list(supportsTeamDrives=True,
includeTeamDriveItems=True,
q=q,
spaces='drive',
fields='nextPageToken, files(id, name, mimeType,size)',
pageToken=page_token).execute()
for file in response.get('files', []):
files.append(file)
page_token = response.get('nextPageToken', None)
if page_token is None:
break
if len(files) == 0: if len(files) == 0:
return parent_id return parent_id
for file in files: for file in files:

View File

@ -1,12 +1,13 @@
from telegram.ext import CommandHandler, run_async from telegram.ext import CommandHandler
from bot.helper.mirror_utils.upload_utils.gdriveTools import GoogleDriveHelper from bot.helper.mirror_utils.upload_utils.gdriveTools import GoogleDriveHelper
from bot.helper.telegram_helper.message_utils import * from bot.helper.telegram_helper.message_utils import *
from bot.helper.telegram_helper.filters import CustomFilters from bot.helper.telegram_helper.filters import CustomFilters
from bot.helper.telegram_helper.bot_commands import BotCommands from bot.helper.telegram_helper.bot_commands import BotCommands
from bot.helper.ext_utils.bot_utils import new_thread
from bot import dispatcher from bot import dispatcher
@run_async @new_thread
def cloneNode(update,context): def cloneNode(update,context):
args = update.message.text.split(" ",maxsplit=1) args = update.message.text.split(" ",maxsplit=1)
if len(args) > 1: if len(args) > 1:
@ -17,7 +18,7 @@ def cloneNode(update,context):
deleteMessage(context.bot,msg) deleteMessage(context.bot,msg)
sendMessage(result,context.bot,update) sendMessage(result,context.bot,update)
else: else:
sendMessage("Provide G-Drive Shareable Link to Clone.",bot,update) sendMessage("Provide G-Drive Shareable Link to Clone.",context.bot,update)
clone_handler = CommandHandler(BotCommands.CloneCommand,cloneNode,filters=CustomFilters.authorized_chat | CustomFilters.authorized_user) clone_handler = CommandHandler(BotCommands.CloneCommand,cloneNode,filters=CustomFilters.authorized_chat | CustomFilters.authorized_user)
dispatcher.add_handler(clone_handler) dispatcher.add_handler(clone_handler)