ADD/FIX
-Add more shorteners: linkvertise, shorte and bitly -Minor fixes Co-authored-by: Juned KH <junedkh@users.noreply.github.com> Signed-off-by: anas <e.anastayyar@gmail.com>
This commit is contained in:
parent
b9656e3799
commit
10237fd58e
|
|
@ -0,0 +1,27 @@
|
||||||
|
import requests
|
||||||
|
import random
|
||||||
|
import base64
|
||||||
|
import pyshorteners
|
||||||
|
from urllib.parse import quote
|
||||||
|
from urllib3 import disable_warnings
|
||||||
|
from bot import SHORTENER, SHORTENER_API
|
||||||
|
|
||||||
|
|
||||||
|
def short_url(longurl):
|
||||||
|
if "shorte.st" in SHORTENER:
|
||||||
|
disable_warnings()
|
||||||
|
return requests.get(f'http://api.shorte.st/stxt/{SHORTENER_API}/{longurl}', verify=False).text
|
||||||
|
elif "linkvertise" in SHORTENER:
|
||||||
|
url = quote(base64.b64encode(longurl.encode("utf-8")))
|
||||||
|
linkvertise = [
|
||||||
|
f"https://link-to.net/{SHORTENER_API}/{random.random() * 1000}/dynamic?r={url}",
|
||||||
|
f"https://up-to-down.net/{SHORTENER_API}/{random.random() * 1000}/dynamic?r={url}",
|
||||||
|
f"https://direct-link.net/{SHORTENER_API}/{random.random() * 1000}/dynamic?r={url}",
|
||||||
|
f"https://file-link.net/{SHORTENER_API}/{random.random() * 1000}/dynamic?r={url}"]
|
||||||
|
return random.choice(linkvertise)
|
||||||
|
elif "bitly.com" in SHORTENER:
|
||||||
|
s = pyshorteners.Shortener(api_key=SHORTENER_API)
|
||||||
|
bitly = s.bitly.short(longurl)
|
||||||
|
return bitly
|
||||||
|
else:
|
||||||
|
return requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={longurl}&format=text').text
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
# An abstract class which will be inherited by the tool specific classes like aria2_helper or mega_download_helper
|
|
||||||
import threading
|
|
||||||
|
|
||||||
|
|
||||||
class MethodNotImplementedError(NotImplementedError):
|
|
||||||
def __init__(self):
|
|
||||||
super(self, 'Not implemented method')
|
|
||||||
|
|
||||||
|
|
||||||
class DownloadHelper:
|
|
||||||
def __init__(self):
|
|
||||||
self.name = '' # Name of the download; empty string if no download has been started
|
|
||||||
self.size = 0.0 # Size of the download
|
|
||||||
self.downloaded_bytes = 0.0 # Bytes downloaded
|
|
||||||
self.speed = 0.0 # Download speed in bytes per second
|
|
||||||
self.progress = 0.0
|
|
||||||
self.progress_string = '0.00%'
|
|
||||||
self.eta = 0 # Estimated time of download complete
|
|
||||||
self.eta_string = '0s' # A listener class which have event callbacks
|
|
||||||
self._resource_lock = threading.Lock()
|
|
||||||
|
|
||||||
def add_download(self, link: str, path):
|
|
||||||
raise MethodNotImplementedError
|
|
||||||
|
|
||||||
def cancel_download(self):
|
|
||||||
# Returns None if successfully cancelled, else error string
|
|
||||||
raise MethodNotImplementedError
|
|
||||||
|
|
@ -77,10 +77,10 @@ class MegaAppListener(MegaListener):
|
||||||
self.continue_event.set()
|
self.continue_event.set()
|
||||||
|
|
||||||
def onRequestTemporaryError(self, api, request, error: MegaError):
|
def onRequestTemporaryError(self, api, request, error: MegaError):
|
||||||
LOGGER.info(f'Mega Request error in {error}')
|
LOGGER.error(f'Mega Request error in {error}')
|
||||||
if not self.is_cancelled:
|
if not self.is_cancelled:
|
||||||
self.listener.onDownloadError("RequestTempError: " + error.toString())
|
|
||||||
self.is_cancelled = True
|
self.is_cancelled = True
|
||||||
|
self.listener.onDownloadError("RequestTempError: " + error.toString())
|
||||||
self.error = error.toString()
|
self.error = error.toString()
|
||||||
self.continue_event.set()
|
self.continue_event.set()
|
||||||
|
|
||||||
|
|
@ -90,12 +90,15 @@ class MegaAppListener(MegaListener):
|
||||||
def onTransferUpdate(self, api: MegaApi, transfer: MegaTransfer):
|
def onTransferUpdate(self, api: MegaApi, transfer: MegaTransfer):
|
||||||
if self.is_cancelled:
|
if self.is_cancelled:
|
||||||
api.cancelTransfer(transfer, None)
|
api.cancelTransfer(transfer, None)
|
||||||
|
return
|
||||||
self.__speed = transfer.getSpeed()
|
self.__speed = transfer.getSpeed()
|
||||||
self.__bytes_transferred = transfer.getTransferredBytes()
|
self.__bytes_transferred = transfer.getTransferredBytes()
|
||||||
|
|
||||||
def onTransferFinish(self, api: MegaApi, transfer: MegaTransfer, error):
|
def onTransferFinish(self, api: MegaApi, transfer: MegaTransfer, error):
|
||||||
try:
|
try:
|
||||||
if transfer.isFolderTransfer() and transfer.isFinished() or transfer.getFileName() == self.name and not self.is_cancelled:
|
if self.is_cancelled:
|
||||||
|
self.continue_event.set()
|
||||||
|
elif transfer.isFinished() and (transfer.isFolderTransfer() or transfer.getFileName() == self.name):
|
||||||
self.listener.onDownloadComplete()
|
self.listener.onDownloadComplete()
|
||||||
self.continue_event.set()
|
self.continue_event.set()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
@ -105,7 +108,7 @@ class MegaAppListener(MegaListener):
|
||||||
filen = transfer.getFileName()
|
filen = transfer.getFileName()
|
||||||
state = transfer.getState()
|
state = transfer.getState()
|
||||||
errStr = error.toString()
|
errStr = error.toString()
|
||||||
LOGGER.info(f'Mega download error in file {transfer} {filen}: {error}')
|
LOGGER.error(f'Mega download error in file {transfer} {filen}: {error}')
|
||||||
|
|
||||||
if state == 1 or state == 4:
|
if state == 1 or state == 4:
|
||||||
# Sometimes MEGA (offical client) can't stream a node either and raises a temp failed error.
|
# Sometimes MEGA (offical client) can't stream a node either and raises a temp failed error.
|
||||||
|
|
@ -163,7 +166,7 @@ class MegaDownloadHelper:
|
||||||
executor.do(folder_api.loginToFolder, (mega_link,))
|
executor.do(folder_api.loginToFolder, (mega_link,))
|
||||||
node = folder_api.authorizeNode(mega_listener.node)
|
node = folder_api.authorizeNode(mega_listener.node)
|
||||||
if mega_listener.error is not None:
|
if mega_listener.error is not None:
|
||||||
return listener.onDownloadError(str(mega_listener.error))
|
return sendMessage(str(mega_listener.error), listener.bot, listener.update)
|
||||||
if STOP_DUPLICATE:
|
if STOP_DUPLICATE:
|
||||||
LOGGER.info(f'Checking File/Folder if already in Drive')
|
LOGGER.info(f'Checking File/Folder if already in Drive')
|
||||||
mname = node.getName()
|
mname = node.getName()
|
||||||
|
|
|
||||||
|
|
@ -26,14 +26,20 @@ from bot import parent_id, DOWNLOAD_DIR, IS_TEAM_DRIVE, INDEX_URL, \
|
||||||
USE_SERVICE_ACCOUNTS, telegraph_token, BUTTON_FOUR_NAME, BUTTON_FOUR_URL, BUTTON_FIVE_NAME, BUTTON_FIVE_URL, BUTTON_SIX_NAME, BUTTON_SIX_URL, SHORTENER, SHORTENER_API, VIEW_LINK
|
USE_SERVICE_ACCOUNTS, telegraph_token, BUTTON_FOUR_NAME, BUTTON_FOUR_URL, BUTTON_FIVE_NAME, BUTTON_FIVE_URL, BUTTON_SIX_NAME, BUTTON_SIX_URL, SHORTENER, SHORTENER_API, VIEW_LINK
|
||||||
from bot.helper.ext_utils.bot_utils import get_readable_file_size, setInterval
|
from bot.helper.ext_utils.bot_utils import get_readable_file_size, setInterval
|
||||||
from bot.helper.ext_utils.fs_utils import get_mime_type, get_path_size
|
from bot.helper.ext_utils.fs_utils import get_mime_type, get_path_size
|
||||||
|
from bot.helper.ext_utils.shortenurl import short_url
|
||||||
|
|
||||||
LOGGER = logging.getLogger(__name__)
|
LOGGER = logging.getLogger(__name__)
|
||||||
logging.getLogger('googleapiclient.discovery').setLevel(logging.ERROR)
|
logging.getLogger('googleapiclient.discovery').setLevel(logging.ERROR)
|
||||||
|
|
||||||
if USE_SERVICE_ACCOUNTS:
|
if USE_SERVICE_ACCOUNTS:
|
||||||
SERVICE_ACCOUNT_INDEX = randrange(len(os.listdir("accounts")))
|
SERVICE_ACCOUNT_INDEX = randrange(len(os.listdir("accounts")))
|
||||||
|
|
||||||
TELEGRAPHLIMIT = 80
|
TELEGRAPHLIMIT = 80
|
||||||
|
|
||||||
|
|
||||||
class GoogleDriveHelper:
|
class GoogleDriveHelper:
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, name=None, listener=None):
|
def __init__(self, name=None, listener=None):
|
||||||
self.__G_DRIVE_TOKEN_FILE = "token.pickle"
|
self.__G_DRIVE_TOKEN_FILE = "token.pickle"
|
||||||
# Check https://developers.google.com/drive/scopes for all available scopes
|
# Check https://developers.google.com/drive/scopes for all available scopes
|
||||||
|
|
@ -69,6 +75,7 @@ class GoogleDriveHelper:
|
||||||
self.transferred_size = 0
|
self.transferred_size = 0
|
||||||
self.sa_count = 0
|
self.sa_count = 0
|
||||||
|
|
||||||
|
|
||||||
def speed(self):
|
def speed(self):
|
||||||
"""
|
"""
|
||||||
It calculates the average upload speed and returns it in bytes/seconds unit
|
It calculates the average upload speed and returns it in bytes/seconds unit
|
||||||
|
|
@ -79,18 +86,21 @@ class GoogleDriveHelper:
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def dspeed(self):
|
def dspeed(self):
|
||||||
try:
|
try:
|
||||||
return self.downloaded_bytes / self.dtotal_time
|
return self.downloaded_bytes / self.dtotal_time
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def cspeed(self):
|
def cspeed(self):
|
||||||
try:
|
try:
|
||||||
return self.transferred_size / int(time.time() - self.start_time)
|
return self.transferred_size / int(time.time() - self.start_time)
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def getIdFromUrl(link: str):
|
def getIdFromUrl(link: str):
|
||||||
if "folders" in link or "file" in link:
|
if "folders" in link or "file" in link:
|
||||||
|
|
@ -102,6 +112,7 @@ class GoogleDriveHelper:
|
||||||
parsed = urlparse.urlparse(link)
|
parsed = urlparse.urlparse(link)
|
||||||
return parse_qs(parsed.query)['id'][0]
|
return parse_qs(parsed.query)['id'][0]
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def _on_upload_progress(self):
|
def _on_upload_progress(self):
|
||||||
|
|
@ -112,6 +123,7 @@ class GoogleDriveHelper:
|
||||||
self.uploaded_bytes += chunk_size
|
self.uploaded_bytes += chunk_size
|
||||||
self.total_time += self.update_interval
|
self.total_time += self.update_interval
|
||||||
|
|
||||||
|
|
||||||
def __upload_empty_file(self, path, file_name, mime_type, parent_id=None):
|
def __upload_empty_file(self, path, file_name, mime_type, parent_id=None):
|
||||||
media_body = MediaFileUpload(path,
|
media_body = MediaFileUpload(path,
|
||||||
mimetype=mime_type,
|
mimetype=mime_type,
|
||||||
|
|
@ -125,6 +137,8 @@ class GoogleDriveHelper:
|
||||||
file_metadata['parents'] = [parent_id]
|
file_metadata['parents'] = [parent_id]
|
||||||
return self.__service.files().create(supportsTeamDrives=True,
|
return self.__service.files().create(supportsTeamDrives=True,
|
||||||
body=file_metadata, media_body=media_body).execute()
|
body=file_metadata, media_body=media_body).execute()
|
||||||
|
|
||||||
|
|
||||||
def deletefile(self, link: str):
|
def deletefile(self, link: str):
|
||||||
try:
|
try:
|
||||||
file_id = self.getIdFromUrl(link)
|
file_id = self.getIdFromUrl(link)
|
||||||
|
|
@ -144,6 +158,7 @@ class GoogleDriveHelper:
|
||||||
finally:
|
finally:
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
def switchServiceAccount(self):
|
def switchServiceAccount(self):
|
||||||
global SERVICE_ACCOUNT_INDEX
|
global SERVICE_ACCOUNT_INDEX
|
||||||
service_account_count = len(os.listdir("accounts"))
|
service_account_count = len(os.listdir("accounts"))
|
||||||
|
|
@ -154,6 +169,7 @@ class GoogleDriveHelper:
|
||||||
LOGGER.info(f"Switching to {SERVICE_ACCOUNT_INDEX}.json service account")
|
LOGGER.info(f"Switching to {SERVICE_ACCOUNT_INDEX}.json service account")
|
||||||
self.__service = self.authorize()
|
self.__service = self.authorize()
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def __set_permission(self, drive_id):
|
def __set_permission(self, drive_id):
|
||||||
|
|
@ -166,6 +182,7 @@ class GoogleDriveHelper:
|
||||||
return self.__service.permissions().create(supportsTeamDrives=True, fileId=drive_id,
|
return self.__service.permissions().create(supportsTeamDrives=True, fileId=drive_id,
|
||||||
body=permissions).execute()
|
body=permissions).execute()
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def upload_file(self, file_path, file_name, mime_type, parent_id):
|
def upload_file(self, file_path, file_name, mime_type, parent_id):
|
||||||
|
|
@ -234,6 +251,7 @@ class GoogleDriveHelper:
|
||||||
download_url = self.__G_DRIVE_BASE_DOWNLOAD_URL.format(drive_file.get('id'))
|
download_url = self.__G_DRIVE_BASE_DOWNLOAD_URL.format(drive_file.get('id'))
|
||||||
return download_url
|
return download_url
|
||||||
|
|
||||||
|
|
||||||
def upload(self, file_name: str):
|
def upload(self, file_name: str):
|
||||||
self.is_downloading = False
|
self.is_downloading = False
|
||||||
self.is_uploading = True
|
self.is_uploading = True
|
||||||
|
|
@ -299,6 +317,7 @@ class GoogleDriveHelper:
|
||||||
self.__listener.onUploadComplete(link, size, files, folders, typ)
|
self.__listener.onUploadComplete(link, size, files, folders, typ)
|
||||||
return link
|
return link
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def copyFile(self, file_id, dest_id):
|
def copyFile(self, file_id, dest_id):
|
||||||
|
|
@ -327,12 +346,14 @@ class GoogleDriveHelper:
|
||||||
else:
|
else:
|
||||||
raise err
|
raise err
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def getFileMetadata(self,file_id):
|
def getFileMetadata(self,file_id):
|
||||||
return self.__service.files().get(supportsAllDrives=True, fileId=file_id,
|
return self.__service.files().get(supportsAllDrives=True, fileId=file_id,
|
||||||
fields="name,id,mimeType,size").execute()
|
fields="name,id,mimeType,size").execute()
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def getFilesByFolderId(self,folder_id):
|
def getFilesByFolderId(self,folder_id):
|
||||||
|
|
@ -354,6 +375,7 @@ class GoogleDriveHelper:
|
||||||
break
|
break
|
||||||
return files
|
return files
|
||||||
|
|
||||||
|
|
||||||
def clone(self, link):
|
def clone(self, link):
|
||||||
self.is_cloning = True
|
self.is_cloning = True
|
||||||
self.start_time = time.time()
|
self.start_time = time.time()
|
||||||
|
|
@ -385,7 +407,7 @@ class GoogleDriveHelper:
|
||||||
msg += f'\n<b>Files: </b><code>{self.total_files}</code>'
|
msg += f'\n<b>Files: </b><code>{self.total_files}</code>'
|
||||||
buttons = button_build.ButtonMaker()
|
buttons = button_build.ButtonMaker()
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
surl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={durl}&format=text').text
|
surl = short_url(durl)
|
||||||
buttons.buildbutton("☁️ Drive Link", surl)
|
buttons.buildbutton("☁️ Drive Link", surl)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("☁️ Drive Link", durl)
|
buttons.buildbutton("☁️ Drive Link", durl)
|
||||||
|
|
@ -393,7 +415,7 @@ class GoogleDriveHelper:
|
||||||
url_path = requests.utils.quote(f'{meta.get("name")}')
|
url_path = requests.utils.quote(f'{meta.get("name")}')
|
||||||
url = f'{INDEX_URL}/{url_path}/'
|
url = f'{INDEX_URL}/{url_path}/'
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
siurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={url}&format=text').text
|
siurl = short_url(url)
|
||||||
buttons.buildbutton("⚡ Index Link", siurl)
|
buttons.buildbutton("⚡ Index Link", siurl)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("⚡ Index Link", url)
|
buttons.buildbutton("⚡ Index Link", url)
|
||||||
|
|
@ -409,17 +431,17 @@ class GoogleDriveHelper:
|
||||||
durl = self.__G_DRIVE_BASE_DOWNLOAD_URL.format(file.get("id"))
|
durl = self.__G_DRIVE_BASE_DOWNLOAD_URL.format(file.get("id"))
|
||||||
buttons = button_build.ButtonMaker()
|
buttons = button_build.ButtonMaker()
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
surl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={durl}&format=text').text
|
surl = short_url(durl)
|
||||||
buttons.buildbutton("☁️ Drive Link", surl)
|
buttons.buildbutton("☁️ Drive Link", surl)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("☁️ Drive Link", durl)
|
buttons.buildbutton("☁️ Drive Link", durl)
|
||||||
try:
|
try:
|
||||||
typeee = file.get('mimeType')
|
typ = file.get('mimeType')
|
||||||
except:
|
except:
|
||||||
typeee = 'File'
|
typ = 'File'
|
||||||
try:
|
try:
|
||||||
msg += f'\n<b>Size: </b><code>{get_readable_file_size(int(meta.get("size")))}</code>'
|
msg += f'\n<b>Size: </b><code>{get_readable_file_size(int(meta.get("size")))}</code>'
|
||||||
msg += f'\n<b>Type: </b><code>{typeee}</code>'
|
msg += f'\n<b>Type: </b><code>{typ}</code>'
|
||||||
except TypeError:
|
except TypeError:
|
||||||
pass
|
pass
|
||||||
if INDEX_URL is not None:
|
if INDEX_URL is not None:
|
||||||
|
|
@ -427,10 +449,10 @@ class GoogleDriveHelper:
|
||||||
url = f'{INDEX_URL}/{url_path}'
|
url = f'{INDEX_URL}/{url_path}'
|
||||||
urls = f'{INDEX_URL}/{url_path}?a=view'
|
urls = f'{INDEX_URL}/{url_path}?a=view'
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
siurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={url}&format=text').text
|
siurl = short_url(url)
|
||||||
siurls = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={urls}&format=text').text
|
|
||||||
buttons.buildbutton("⚡ Index Link", siurl)
|
buttons.buildbutton("⚡ Index Link", siurl)
|
||||||
if VIEW_LINK:
|
if VIEW_LINK:
|
||||||
|
siurls = short_url(urls)
|
||||||
buttons.buildbutton("🌐 View Link", siurls)
|
buttons.buildbutton("🌐 View Link", siurls)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("⚡ Index Link", url)
|
buttons.buildbutton("⚡ Index Link", url)
|
||||||
|
|
@ -457,6 +479,7 @@ class GoogleDriveHelper:
|
||||||
return msg, ""
|
return msg, ""
|
||||||
return msg, InlineKeyboardMarkup(buttons.build_menu(2))
|
return msg, InlineKeyboardMarkup(buttons.build_menu(2))
|
||||||
|
|
||||||
|
|
||||||
def cloneFolder(self, name, local_path, folder_id, parent_id):
|
def cloneFolder(self, name, local_path, folder_id, parent_id):
|
||||||
LOGGER.info(f"Syncing: {local_path}")
|
LOGGER.info(f"Syncing: {local_path}")
|
||||||
files = self.getFilesByFolderId(folder_id)
|
files = self.getFilesByFolderId(folder_id)
|
||||||
|
|
@ -480,6 +503,7 @@ class GoogleDriveHelper:
|
||||||
if self.is_cancelled:
|
if self.is_cancelled:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
@retry(wait=wait_exponential(multiplier=2, min=3, max=6), stop=stop_after_attempt(5),
|
@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))
|
retry=retry_if_exception_type(HttpError), before=before_log(LOGGER, logging.DEBUG))
|
||||||
def create_directory(self, directory_name, parent_id):
|
def create_directory(self, directory_name, parent_id):
|
||||||
|
|
@ -496,6 +520,7 @@ class GoogleDriveHelper:
|
||||||
LOGGER.info("Created G-Drive Folder:\nName: {}\nID: {} ".format(file.get("name"), file_id))
|
LOGGER.info("Created G-Drive Folder:\nName: {}\nID: {} ".format(file.get("name"), file_id))
|
||||||
return file_id
|
return file_id
|
||||||
|
|
||||||
|
|
||||||
def upload_dir(self, input_directory, parent_id):
|
def upload_dir(self, input_directory, parent_id):
|
||||||
list_dirs = os.listdir(input_directory)
|
list_dirs = os.listdir(input_directory)
|
||||||
if len(list_dirs) == 0:
|
if len(list_dirs) == 0:
|
||||||
|
|
@ -518,6 +543,7 @@ class GoogleDriveHelper:
|
||||||
break
|
break
|
||||||
return new_id
|
return new_id
|
||||||
|
|
||||||
|
|
||||||
def authorize(self):
|
def authorize(self):
|
||||||
# Get credentials
|
# Get credentials
|
||||||
credentials = None
|
credentials = None
|
||||||
|
|
@ -543,6 +569,8 @@ class GoogleDriveHelper:
|
||||||
f'accounts/{SERVICE_ACCOUNT_INDEX}.json',
|
f'accounts/{SERVICE_ACCOUNT_INDEX}.json',
|
||||||
scopes=self.__OAUTH_SCOPE)
|
scopes=self.__OAUTH_SCOPE)
|
||||||
return build('drive', 'v3', credentials=credentials, cache_discovery=False)
|
return build('drive', 'v3', credentials=credentials, cache_discovery=False)
|
||||||
|
|
||||||
|
|
||||||
def edit_telegraph(self):
|
def edit_telegraph(self):
|
||||||
nxt_page = 1
|
nxt_page = 1
|
||||||
prev_page = 0
|
prev_page = 0
|
||||||
|
|
@ -564,12 +592,14 @@ class GoogleDriveHelper:
|
||||||
html_content=content)
|
html_content=content)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def escapes(self, str):
|
def escapes(self, str):
|
||||||
chars = ['\\', "'", '"', r'\a', r'\b', r'\f', r'\n', r'\r', r'\t']
|
chars = ['\\', "'", '"', r'\a', r'\b', r'\f', r'\n', r'\r', r'\t']
|
||||||
for char in chars:
|
for char in chars:
|
||||||
str = str.replace(char, '\\'+char)
|
str = str.replace(char, '\\'+char)
|
||||||
return str
|
return str
|
||||||
|
|
||||||
|
|
||||||
def drive_list(self, fileName):
|
def drive_list(self, fileName):
|
||||||
msg = ""
|
msg = ""
|
||||||
fileName = self.escapes(str(fileName))
|
fileName = self.escapes(str(fileName))
|
||||||
|
|
@ -590,7 +620,7 @@ class GoogleDriveHelper:
|
||||||
furl = f"https://drive.google.com/drive/folders/{file.get('id')}"
|
furl = f"https://drive.google.com/drive/folders/{file.get('id')}"
|
||||||
msg += f"📁 <code>{file.get('name')}<br>(folder)</code><br>"
|
msg += f"📁 <code>{file.get('name')}<br>(folder)</code><br>"
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
sfurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={furl}&format=text').text
|
sfurl = short_url(furl)
|
||||||
msg += f"<b><a href={sfurl}>Drive Link</a></b>"
|
msg += f"<b><a href={sfurl}>Drive Link</a></b>"
|
||||||
else:
|
else:
|
||||||
msg += f"<b><a href={furl}>Drive Link</a></b>"
|
msg += f"<b><a href={furl}>Drive Link</a></b>"
|
||||||
|
|
@ -598,7 +628,7 @@ class GoogleDriveHelper:
|
||||||
url_path = requests.utils.quote(f'{file.get("name")}')
|
url_path = requests.utils.quote(f'{file.get("name")}')
|
||||||
url = f'{INDEX_URL}/{url_path}/'
|
url = f'{INDEX_URL}/{url_path}/'
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
siurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={url}&format=text').text
|
siurl = short_url(url)
|
||||||
msg += f' <b>| <a href="{siurl}">Index Link</a></b>'
|
msg += f' <b>| <a href="{siurl}">Index Link</a></b>'
|
||||||
else:
|
else:
|
||||||
msg += f' <b>| <a href="{url}">Index Link</a></b>'
|
msg += f' <b>| <a href="{url}">Index Link</a></b>'
|
||||||
|
|
@ -610,7 +640,7 @@ class GoogleDriveHelper:
|
||||||
furl = f"https://drive.google.com/uc?id={file.get('id')}&export=download"
|
furl = f"https://drive.google.com/uc?id={file.get('id')}&export=download"
|
||||||
msg += f"📄 <code>{file.get('name')}<br>({get_readable_file_size(int(file.get('size')))})</code><br>"
|
msg += f"📄 <code>{file.get('name')}<br>({get_readable_file_size(int(file.get('size')))})</code><br>"
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
sfurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={furl}&format=text').text
|
sfurl = short_url(furl)
|
||||||
msg += f"<b><a href={sfurl}>Drive Link</a></b>"
|
msg += f"<b><a href={sfurl}>Drive Link</a></b>"
|
||||||
else:
|
else:
|
||||||
msg += f"<b><a href={furl}>Drive Link</a></b>"
|
msg += f"<b><a href={furl}>Drive Link</a></b>"
|
||||||
|
|
@ -619,10 +649,10 @@ class GoogleDriveHelper:
|
||||||
url = f'{INDEX_URL}/{url_path}'
|
url = f'{INDEX_URL}/{url_path}'
|
||||||
urls = f'{INDEX_URL}/{url_path}?a=view'
|
urls = f'{INDEX_URL}/{url_path}?a=view'
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
siurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={url}&format=text').text
|
siurl = short_url(url)
|
||||||
siurls = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={urls}&format=text').text
|
|
||||||
msg += f' <b>| <a href="{siurl}">Index Link</a></b>'
|
msg += f' <b>| <a href="{siurl}">Index Link</a></b>'
|
||||||
if VIEW_LINK:
|
if VIEW_LINK:
|
||||||
|
siurls = short_url(urls)
|
||||||
msg += f' <b>| <a href="{siurls}">View Link</a></b>'
|
msg += f' <b>| <a href="{siurls}">View Link</a></b>'
|
||||||
else:
|
else:
|
||||||
msg += f' <b>| <a href="{url}">Index Link</a></b>'
|
msg += f' <b>| <a href="{url}">Index Link</a></b>'
|
||||||
|
|
@ -662,6 +692,7 @@ class GoogleDriveHelper:
|
||||||
else :
|
else :
|
||||||
return '', ''
|
return '', ''
|
||||||
|
|
||||||
|
|
||||||
def count(self, link):
|
def count(self, link):
|
||||||
try:
|
try:
|
||||||
file_id = self.getIdFromUrl(link)
|
file_id = self.getIdFromUrl(link)
|
||||||
|
|
@ -706,6 +737,7 @@ class GoogleDriveHelper:
|
||||||
return msg
|
return msg
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
def gDrive_file(self, **kwargs):
|
def gDrive_file(self, **kwargs):
|
||||||
try:
|
try:
|
||||||
size = int(kwargs['size'])
|
size = int(kwargs['size'])
|
||||||
|
|
@ -713,6 +745,7 @@ class GoogleDriveHelper:
|
||||||
size = 0
|
size = 0
|
||||||
self.total_bytes += size
|
self.total_bytes += size
|
||||||
|
|
||||||
|
|
||||||
def gDrive_directory(self, **kwargs) -> None:
|
def gDrive_directory(self, **kwargs) -> None:
|
||||||
files = self.getFilesByFolderId(kwargs['id'])
|
files = self.getFilesByFolderId(kwargs['id'])
|
||||||
if len(files) == 0:
|
if len(files) == 0:
|
||||||
|
|
@ -725,6 +758,7 @@ class GoogleDriveHelper:
|
||||||
self.total_files += 1
|
self.total_files += 1
|
||||||
self.gDrive_file(**file_)
|
self.gDrive_file(**file_)
|
||||||
|
|
||||||
|
|
||||||
def clonehelper(self, link):
|
def clonehelper(self, link):
|
||||||
try:
|
try:
|
||||||
file_id = self.getIdFromUrl(link)
|
file_id = self.getIdFromUrl(link)
|
||||||
|
|
@ -757,6 +791,7 @@ class GoogleDriveHelper:
|
||||||
return msg, "", "", ""
|
return msg, "", "", ""
|
||||||
return "", clonesize, name, files
|
return "", clonesize, name, files
|
||||||
|
|
||||||
|
|
||||||
def download(self, link):
|
def download(self, link):
|
||||||
self.is_downloading = True
|
self.is_downloading = True
|
||||||
file_id = self.getIdFromUrl(link)
|
file_id = self.getIdFromUrl(link)
|
||||||
|
|
@ -784,6 +819,7 @@ class GoogleDriveHelper:
|
||||||
return
|
return
|
||||||
self.__listener.onDownloadComplete()
|
self.__listener.onDownloadComplete()
|
||||||
|
|
||||||
|
|
||||||
def download_folder(self, folder_id, path, folder_name):
|
def download_folder(self, folder_id, path, folder_name):
|
||||||
if not os.path.exists(path + folder_name):
|
if not os.path.exists(path + folder_name):
|
||||||
os.makedirs(path + folder_name)
|
os.makedirs(path + folder_name)
|
||||||
|
|
@ -819,6 +855,7 @@ class GoogleDriveHelper:
|
||||||
if self.is_cancelled:
|
if self.is_cancelled:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
def download_file(self, file_id, path, filename, mime_type):
|
def download_file(self, file_id, path, filename, mime_type):
|
||||||
request = self.__service.files().get_media(fileId=file_id)
|
request = self.__service.files().get_media(fileId=file_id)
|
||||||
fh = io.FileIO('{}{}'.format(path, filename), 'wb')
|
fh = io.FileIO('{}{}'.format(path, filename), 'wb')
|
||||||
|
|
@ -850,6 +887,7 @@ class GoogleDriveHelper:
|
||||||
raise err
|
raise err
|
||||||
self._file_downloaded_bytes = 0
|
self._file_downloaded_bytes = 0
|
||||||
|
|
||||||
|
|
||||||
def _on_download_progress(self):
|
def _on_download_progress(self):
|
||||||
if self.dstatus is not None:
|
if self.dstatus is not None:
|
||||||
chunk_size = self.dstatus.total_size * self.dstatus.progress() - self._file_downloaded_bytes
|
chunk_size = self.dstatus.total_size * self.dstatus.progress() - self._file_downloaded_bytes
|
||||||
|
|
@ -857,6 +895,7 @@ class GoogleDriveHelper:
|
||||||
self.downloaded_bytes += chunk_size
|
self.downloaded_bytes += chunk_size
|
||||||
self.dtotal_time += self.update_interval
|
self.dtotal_time += self.update_interval
|
||||||
|
|
||||||
|
|
||||||
def cancel_download(self):
|
def cancel_download(self):
|
||||||
self.is_cancelled = True
|
self.is_cancelled = True
|
||||||
if self.is_downloading:
|
if self.is_downloading:
|
||||||
|
|
@ -865,5 +904,5 @@ class GoogleDriveHelper:
|
||||||
elif self.is_cloning:
|
elif self.is_cloning:
|
||||||
LOGGER.info(f"Cancelling Clone: {self.name}")
|
LOGGER.info(f"Cancelling Clone: {self.name}")
|
||||||
elif self.is_uploading:
|
elif self.is_uploading:
|
||||||
LOGGER.info(f"Cancelling upload: {self.name}")
|
LOGGER.info(f"Cancelling Upload: {self.name}")
|
||||||
self.__listener.onUploadError('your upload has been stopped and uploaded data has been deleted!')
|
self.__listener.onUploadError('your upload has been stopped and uploaded data has been deleted!')
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from telegram import InlineKeyboardMarkup
|
||||||
from bot import Interval, INDEX_URL, BUTTON_FOUR_NAME, BUTTON_FOUR_URL, BUTTON_FIVE_NAME, BUTTON_FIVE_URL, BUTTON_SIX_NAME, BUTTON_SIX_URL, BLOCK_MEGA_FOLDER, BLOCK_MEGA_LINKS, VIEW_LINK, aria2, get_client
|
from bot import Interval, INDEX_URL, BUTTON_FOUR_NAME, BUTTON_FOUR_URL, BUTTON_FIVE_NAME, BUTTON_FIVE_URL, BUTTON_SIX_NAME, BUTTON_SIX_URL, BLOCK_MEGA_FOLDER, BLOCK_MEGA_LINKS, VIEW_LINK, aria2, get_client
|
||||||
from bot import dispatcher, DOWNLOAD_DIR, download_dict, download_dict_lock, SHORTENER, SHORTENER_API, TAR_UNZIP_LIMIT
|
from bot import dispatcher, DOWNLOAD_DIR, download_dict, download_dict_lock, SHORTENER, SHORTENER_API, TAR_UNZIP_LIMIT
|
||||||
from bot.helper.ext_utils import fs_utils, bot_utils
|
from bot.helper.ext_utils import fs_utils, bot_utils
|
||||||
from bot.helper.ext_utils.bot_utils import get_mega_link_type, check_limit
|
from bot.helper.ext_utils.shortenurl import short_url
|
||||||
from bot.helper.ext_utils.exceptions import DirectDownloadLinkException, NotSupportedExtractionArchive
|
from bot.helper.ext_utils.exceptions import DirectDownloadLinkException, NotSupportedExtractionArchive
|
||||||
from bot.helper.mirror_utils.download_utils.aria2_download import AriaDownloadHelper
|
from bot.helper.mirror_utils.download_utils.aria2_download import AriaDownloadHelper
|
||||||
from bot.helper.mirror_utils.download_utils.mega_downloader import MegaDownloadHelper
|
from bot.helper.mirror_utils.download_utils.mega_downloader import MegaDownloadHelper
|
||||||
|
|
@ -164,7 +164,7 @@ class MirrorListener(listeners.MirrorListeners):
|
||||||
msg += f'\n<b>Type: </b><code>{typ}</code>'
|
msg += f'\n<b>Type: </b><code>{typ}</code>'
|
||||||
buttons = button_build.ButtonMaker()
|
buttons = button_build.ButtonMaker()
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
surl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={link}&format=text').text
|
surl = short_url(link)
|
||||||
buttons.buildbutton("☁️ Drive Link", surl)
|
buttons.buildbutton("☁️ Drive Link", surl)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("☁️ Drive Link", link)
|
buttons.buildbutton("☁️ Drive Link", link)
|
||||||
|
|
@ -175,17 +175,17 @@ class MirrorListener(listeners.MirrorListeners):
|
||||||
if os.path.isdir(f'{DOWNLOAD_DIR}/{self.uid}/{download_dict[self.uid].name()}'):
|
if os.path.isdir(f'{DOWNLOAD_DIR}/{self.uid}/{download_dict[self.uid].name()}'):
|
||||||
share_url += '/'
|
share_url += '/'
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
siurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={share_url}&format=text').text
|
siurl = short_url(share_url)
|
||||||
buttons.buildbutton("⚡ Index Link", siurl)
|
buttons.buildbutton("⚡ Index Link", siurl)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("⚡ Index Link", share_url)
|
buttons.buildbutton("⚡ Index Link", share_url)
|
||||||
else:
|
else:
|
||||||
share_urls = f'{INDEX_URL}/{url_path}?a=view'
|
share_urls = f'{INDEX_URL}/{url_path}?a=view'
|
||||||
if SHORTENER is not None and SHORTENER_API is not None:
|
if SHORTENER is not None and SHORTENER_API is not None:
|
||||||
siurl = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={share_url}&format=text').text
|
siurl = short_url(share_url)
|
||||||
siurls = requests.get(f'https://{SHORTENER}/api?api={SHORTENER_API}&url={share_urls}&format=text').text
|
|
||||||
buttons.buildbutton("⚡ Index Link", siurl)
|
buttons.buildbutton("⚡ Index Link", siurl)
|
||||||
if VIEW_LINK:
|
if VIEW_LINK:
|
||||||
|
siurls = short_url(share_urls)
|
||||||
buttons.buildbutton("🌐 View Link", siurls)
|
buttons.buildbutton("🌐 View Link", siurls)
|
||||||
else:
|
else:
|
||||||
buttons.buildbutton("⚡ Index Link", share_url)
|
buttons.buildbutton("⚡ Index Link", share_url)
|
||||||
|
|
@ -335,7 +335,7 @@ def _mirror(bot, update, isTar=False, extract=False, isZip=False, isQbit=False):
|
||||||
sendMessage(res, bot, update)
|
sendMessage(res, bot, update)
|
||||||
return
|
return
|
||||||
if TAR_UNZIP_LIMIT is not None:
|
if TAR_UNZIP_LIMIT is not None:
|
||||||
result = check_limit(size, TAR_UNZIP_LIMIT)
|
result = bot_utils.check_limit(size, TAR_UNZIP_LIMIT)
|
||||||
if result:
|
if result:
|
||||||
msg = f'Failed, Tar/Unzip limit is {TAR_UNZIP_LIMIT}.\nYour File/Folder size is {get_readable_file_size(size)}.'
|
msg = f'Failed, Tar/Unzip limit is {TAR_UNZIP_LIMIT}.\nYour File/Folder size is {get_readable_file_size(size)}.'
|
||||||
sendMessage(msg, listener.bot, listener.update)
|
sendMessage(msg, listener.bot, listener.update)
|
||||||
|
|
@ -350,11 +350,12 @@ def _mirror(bot, update, isTar=False, extract=False, isZip=False, isQbit=False):
|
||||||
drive.download(link)
|
drive.download(link)
|
||||||
|
|
||||||
elif bot_utils.is_mega_link(link):
|
elif bot_utils.is_mega_link(link):
|
||||||
link_type = get_mega_link_type(link)
|
if BLOCK_MEGA_LINKS:
|
||||||
|
sendMessage("Mega links are blocked!", bot, update)
|
||||||
|
return
|
||||||
|
link_type = bot_utils.get_mega_link_type(link)
|
||||||
if link_type == "folder" and BLOCK_MEGA_FOLDER:
|
if link_type == "folder" and BLOCK_MEGA_FOLDER:
|
||||||
sendMessage("Mega folder are blocked!", bot, update)
|
sendMessage("Mega folder are blocked!", bot, update)
|
||||||
elif BLOCK_MEGA_LINKS:
|
|
||||||
sendMessage("Mega links are blocked!", bot, update)
|
|
||||||
else:
|
else:
|
||||||
mega_dl = MegaDownloadHelper()
|
mega_dl = MegaDownloadHelper()
|
||||||
mega_dl.add_download(link, f'{DOWNLOAD_DIR}{listener.uid}/', listener)
|
mega_dl.add_download(link, f'{DOWNLOAD_DIR}{listener.uid}/', listener)
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,4 @@ TgCrypto
|
||||||
torrentool
|
torrentool
|
||||||
urllib3
|
urllib3
|
||||||
youtube_dl
|
youtube_dl
|
||||||
|
pyshorteners
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue