diff --git a/aria.sh b/aria.sh index d066cfa..9c81e30 100755 --- a/aria.sh +++ b/aria.sh @@ -1 +1,5 @@ -aria2c --enable-rpc --rpc-listen-all=false --rpc-listen-port 6800 --max-connection-per-server=10 --rpc-max-request-size=1024M --seed-time=0.01 --min-split-size=10M --follow-torrent=mem --split=10 --daemon=true --allow-overwrite=true \ No newline at end of file +export MAX_DOWNLOAD_SPEED=0 +aria2c --enable-rpc --rpc-listen-all=false --rpc-listen-port 6800 \ + --max-connection-per-server=10 --rpc-max-request-size=1024M \ + --seed-time=0.01 --min-split-size=10M --follow-torrent=mem --split=10 \ + --daemon=true --allow-overwrite=true --max-overall-download-limit=$MAX_DOWNLOAD_SPEED \ No newline at end of file diff --git a/bot/helper/download_tools.py b/bot/helper/download_tools.py index 903c379..043c3ec 100644 --- a/bot/helper/download_tools.py +++ b/bot/helper/download_tools.py @@ -54,6 +54,9 @@ class DownloadHelper: # Waiting for the actual gid new_gid = None while new_gid is None: + if self.__get_download().has_failed: + self.__listener.onDownloadError(self.__get_download().error_message, status_list[index]) + break sleep(DOWNLOAD_STATUS_UPDATE_INTERVAL) if should_update: # Check every few seconds @@ -68,12 +71,12 @@ class DownloadHelper: previous = None download = self.__get_download() while not download.is_complete: + if download.has_failed: + self.__listener.onDownloadError(self.__get_download().error_message, status_list[index]) + return if should_update: status_list = get_download_status_list() index = get_download_index(status_list, self.__get_download().gid) - if self.__get_download().has_failed: - self.__listener.onDownloadError(self.__get_download().error_message, status_list[index]) - break # TODO: Find a better way to differentiate between 2 list of objects progress_str_list = get_download_str() if progress_str_list != previous: @@ -82,6 +85,7 @@ class DownloadHelper: except KillThreadException: should_update = False previous = progress_str_list - download = self.__get_download() + download = self.__get_download() sleep(DOWNLOAD_STATUS_UPDATE_INTERVAL) + self.__listener.onDownloadComplete(status_list, index) diff --git a/bot/helper/gdriveTools.py b/bot/helper/gdriveTools.py index b19d73b..32bd7a6 100644 --- a/bot/helper/gdriveTools.py +++ b/bot/helper/gdriveTools.py @@ -9,7 +9,10 @@ from .fs_utils import get_mime_type from .bot_utils import * import logging + logging.getLogger('googleapiclient.discovery').setLevel(logging.ERROR) + + class GoogleDriveHelper: def __init__(self, listener=None): @@ -23,7 +26,7 @@ class GoogleDriveHelper: self.__listener = listener self.__service = self.authorize() - def upload_file(self, file_path, file_name, mime_type,parent_id): + def upload_file(self, file_path, file_name, mime_type, parent_id): # File body description media_body = MediaFileUpload(file_path, mimetype=mime_type, @@ -72,7 +75,7 @@ class GoogleDriveHelper: else: try: dir_id = self.create_directory(os.path.basename(os.path.abspath(file_name)), parent_id) - self.upload_dir(file_path,dir_id) + self.upload_dir(file_path, dir_id) LOGGER.info("Uploaded To G-Drive: " + file_name) link = "https://drive.google.com/folderview?id={}".format(dir_id) except Exception as e: @@ -83,7 +86,7 @@ class GoogleDriveHelper: LOGGER.info("Deleting downloaded file/folder..") return link - def create_directory(self, directory_name,parent_id): + def create_directory(self, directory_name, parent_id): permissions = { "role": "reader", "type": "anyone", @@ -140,23 +143,26 @@ class GoogleDriveHelper: pickle.dump(credentials, token) return build('drive', 'v3', credentials=credentials, cache_discovery=False) - def drive_list(self,fileName): + def drive_list(self, fileName): msg = "" - #Create Search Query for API request. - query = "'{}' in parents and (name contains '{}')".format(parent_id,fileName) + # Create Search Query for API request. + query = "'{}' in parents and (name contains '{}')".format(parent_id, fileName) page_token = None while True: response = self.__service.files().list(q=query, - spaces='drive', - fields='nextPageToken, files(id, name, mimeType)', - pageToken=page_token).execute() - for file in response.get('files',[]): + spaces='drive', + fields='nextPageToken, files(id, name, mimeType)', + pageToken=page_token).execute() + for file in response.get('files', []): if file.get('mimeType') == "application/vnd.google-apps.folder": - msg +='⁍ {} (folder)'.format(file.get('id'),file.get('name'))+"\n" + msg += '⁍ {} (folder)'.format( + file.get('id'), file.get('name')) + "\n" # Detect Whether Current Entity is a Folder or File. else: - msg += '⁍ {}'.format(file.get('id'),file.get('name'))+"\n" + msg += '⁍ {}'.format(file.get('id'), + file.get( + 'name')) + "\n" page_token = response.get('nextPageToken', None) if page_token is None: break - return msg \ No newline at end of file + return msg diff --git a/bot/mirror.py b/bot/mirror.py index 47fa3ca..ceebaa2 100644 --- a/bot/mirror.py +++ b/bot/mirror.py @@ -2,9 +2,8 @@ from telegram.ext import CommandHandler, run_async from bot.helper import download_tools, gdriveTools, listeners from bot import LOGGER, dispatcher from bot.helper import fs_utils -from bot import download_dict, status_reply_dict, DOWNLOAD_STATUS_UPDATE_INTERVAL +from bot import download_dict, status_reply_dict from bot.helper.message_utils import * -from time import sleep from bot.helper.bot_utils import get_readable_message, KillThreadException LOGGER.info('mirror.py') @@ -18,14 +17,14 @@ class MirrorListener(listeners.MirrorListeners): def onDownloadProgress(self, progress_status_list: list, index: int): msg = get_readable_message(progress_status_list) - LOGGER.info("Editing message") + # LOGGER.info("Editing message") try: editMessage(msg, self.context, self.reply_message) except BadRequest: raise KillThreadException('Message deleted. Terminate thread') def onDownloadComplete(self, progress_status_list, index: int): - LOGGER.info("Download completed") + LOGGER.info("Download completed: {}".format(progress_status_list[index].name())) gdrive = gdriveTools.GoogleDriveHelper(self) gdrive.upload(progress_status_list[index].name()) @@ -40,13 +39,16 @@ class MirrorListener(listeners.MirrorListeners): def onUploadComplete(self, link: str, progress_status_list: list, index: int): msg = '{}'.format(link, progress_status_list[index].name()) + del download_dict[self.update.update_id] try: deleteMessage(self.context, self.reply_message) + del status_reply_dict[self.update.effective_chat.id] except BadRequest: # This means that the message has been deleted because of a /status command pass + except KeyError: + pass sendMessage(msg, self.context, self.update) - del download_dict[self.update.update_id] fs_utils.clean_download(progress_status_list[index].path()) def onUploadError(self, error: str, progress_status: list, index: int):