From 8bd01276bec5c4a50b07531835700a152dacb8a0 Mon Sep 17 00:00:00 2001 From: lzzy12 Date: Wed, 3 Jun 2020 11:32:09 +0530 Subject: [PATCH] Add ability to login to mega account for premium accounts Signed-off-by: lzzy12 --- README.md | 2 ++ bot/__init__.py | 13 +++++++-- .../download_utils/mega_downloader.py | 27 +++++++++++++------ config_sample.env | 2 ++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b402db9..5415f8f 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ Fill up rest of the fields. Meaning of each fields are discussed below: - **API_HASH** : This is to authenticate to your telegram account for downloading Telegram files. You can get this from https://my.telegram.org - **USER_SESSION_STRING** : Session string generated by running: - **MEGA_API_KEY**: Mega.nz api key to mirror mega.nz links. Get it from [Mega SDK Page](https://mega.nz/sdk) +- **MEGA_EMAIL_ID**: You email id you used to sign up on mega.nz for using premium accounts (Leave th) +- ** ``` python3 generate_string_session.py ``` diff --git a/bot/__init__.py b/bot/__init__.py index c08dee6..76fca77 100644 --- a/bot/__init__.py +++ b/bot/__init__.py @@ -83,8 +83,17 @@ except KeyError as e: try: MEGA_API_KEY = getConfig('MEGA_API_KEY') except KeyError: - logging.warning('MEGA Api key not provided!') - MEGA_API_KEY = None + logging.warning('MEGA API KEY not provided!') + +try: + MEGA_EMAIL_ID = getConfig('MEGA_EMAIL_ID') + MEGA_PASSWORD = getConfig('MEGA_PASSWORD') + if len(MEGA_EMAIL_ID) == 0 or len(MEGA_PASSWORD) == 0: + raise KeyError +except KeyError: + logging.warning('MEGA Credentials not provided!') + MEGA_EMAIL_ID = None + MEGA_PASSWORD = None try: INDEX_URL = getConfig('INDEX_URL') if len(INDEX_URL) == 0: diff --git a/bot/helper/mirror_utils/download_utils/mega_downloader.py b/bot/helper/mirror_utils/download_utils/mega_downloader.py index 4714b11..27d1efd 100644 --- a/bot/helper/mirror_utils/download_utils/mega_downloader.py +++ b/bot/helper/mirror_utils/download_utils/mega_downloader.py @@ -1,10 +1,15 @@ -from bot import LOGGER, MEGA_API_KEY, download_dict_lock, download_dict +from bot import LOGGER, MEGA_API_KEY, download_dict_lock, download_dict, MEGA_EMAIL_ID, MEGA_PASSWORD import threading from mega import (MegaApi, MegaListener, MegaRequest, MegaTransfer, MegaError) from bot.helper.telegram_helper.message_utils import update_all_messages import os from bot.helper.mirror_utils.status_utils.mega_download_status import MegaDownloadStatus + +class MegaDownloaderException(Exception): + pass + + class MegaAppListener(MegaListener): def __init__(self, continue_event: threading.Event, listener): @@ -31,7 +36,7 @@ class MegaAppListener(MegaListener): """Returns name of the download""" return self.__name - def setValues(self,name,size,gid): + def setValues(self, name, size, gid): self.__name = name self.__size = size self.gid = gid @@ -74,11 +79,11 @@ class MegaAppListener(MegaListener): def onTransferUpdate(self, api: MegaApi, transfer: MegaTransfer): if self.is_cancelled: - api.cancelTransfer(transfer,None) + api.cancelTransfer(transfer, None) self.__speed = transfer.getSpeed() self.__bytes_transferred = transfer.getTransferredBytes() - def onTransferFinish(self, api: MegaApi, transfer : MegaTransfer, error): + def onTransferFinish(self, api: MegaApi, transfer: MegaTransfer, error): try: LOGGER.info(f'Transfer finished ({transfer}); Result: {transfer.getFileName()}') if str(error) != "No error" and self.is_cancelled: @@ -98,7 +103,8 @@ class MegaAppListener(MegaListener): def cancel_download(self): self.is_cancelled = True -class AsyncExecutor(object): + +class AsyncExecutor: def __init__(self): self.continue_event = threading.Event() @@ -108,16 +114,21 @@ class AsyncExecutor(object): function(*args) self.continue_event.wait() + class MegaDownloadHelper: def __init__(self): pass def add_download(self, mega_link: str, path: str, listener): + if MEGA_API_KEY is None: + raise MegaDownloaderException('Mega API KEY not provided! Cannot mirror mega links') executor = AsyncExecutor() api = MegaApi(MEGA_API_KEY, None, None, 'telegram-mirror-bot') mega_listener = MegaAppListener(executor.continue_event, listener) os.makedirs(path) api.addListener(mega_listener) + if MEGA_EMAIL_ID is not None and MEGA_PASSWORD is not None: + executor.do(api.login, (MEGA_EMAIL_ID, MEGA_PASSWORD)) executor.do(api.getPublicNode, (mega_link,)) node = mega_listener.node if node is None: @@ -125,8 +136,8 @@ class MegaDownloadHelper: node = mega_listener.node if mega_listener.error is not None: return listener.onDownloadError(str(mega_listener.error)) - mega_listener.setValues(node.getName(),api.getSize(node),mega_link.split("!",1)[-1].split("!",1)[0]) + mega_listener.setValues(node.getName(), api.getSize(node), mega_link.split("!", 1)[-1].split("!", 1)[0]) with download_dict_lock: - download_dict[listener.uid] = MegaDownloadStatus(mega_listener,listener) - threading.Thread(target=executor.do,args=(api.startDownload,(node,path))).start() + download_dict[listener.uid] = MegaDownloadStatus(mega_listener, listener) + threading.Thread(target=executor.do, args=(api.startDownload, (node, path))).start() update_all_messages() diff --git a/config_sample.env b/config_sample.env index 453c888..67ff99c 100644 --- a/config_sample.env +++ b/config_sample.env @@ -15,3 +15,5 @@ TELEGRAM_API = TELEGRAM_HASH = "" USE_SERVICE_ACCOUNTS = "" MEGA_API_KEY = "" +MEGA_EMAIL_ID = "" +MEGA_PASSWORD = "" \ No newline at end of file