Fix aria downloads cancellation after b58eb87b11

Signed-off-by: lzzy12 <jhashivam2020@gmail.com>
This commit is contained in:
lzzy12 2020-04-06 12:31:20 +05:30
parent 3ef3e9ee45
commit b2f2ee4335
6 changed files with 35 additions and 123 deletions

View File

@ -45,18 +45,18 @@ cp config_sample.env config.env
_____REMOVE_THIS_LINE_____=True _____REMOVE_THIS_LINE_____=True
``` ```
Fill up rest of the fields. Meaning of each fields are discussed below: Fill up rest of the fields. Meaning of each fields are discussed below:
- BOT_TOKEN : The telegram bot token that you get from @BotFather - **BOT_TOKEN** : The telegram bot token that you get from @BotFather
- GDRIVE_FOLDER_ID : This is the folder ID of the Google Drive Folder to which you want to upload all the mirrors. - **GDRIVE_FOLDER_ID** : This is the folder ID of the Google Drive Folder to which you want to upload all the mirrors.
- DOWNLOAD_DIR : The path to the local folder where the downloads should be downloaded to - **DOWNLOAD_DIR** : The path to the local folder where the downloads should be downloaded to
- DOWNLOAD_STATUS_UPDATE_INTERVAL : A short interval of time in seconds after which the Mirror progress message is updated. (I recommend to keep it 5 seconds at least) - **DOWNLOAD_STATUS_UPDATE_INTERVAL** : A short interval of time in seconds after which the Mirror progress message is updated. (I recommend to keep it 5 seconds at least)
- OWNER_ID : The Telegram user ID (not username) of the owner of the bot - **OWNER_ID** : The Telegram user ID (not username) of the owner of the bot
- AUTO_DELETE_MESSAGE_DURATION : Interval of time (in seconds), after which the bot deletes it's message (and command message) which is expected to be viewed instantly. Note: Set to -1 to never automatically delete messages - **AUTO_DELETE_MESSAGE_DURATION** : Interval of time (in seconds), after which the bot deletes it's message (and command message) which is expected to be viewed instantly. Note: Set to -1 to never automatically delete messages
- IS_TEAM_DRIVE : (Optional field) Set to "True" if GDRIVE_FOLDER_ID is from a Team Drive else False or Leave it empty. - **IS_TEAM_DRIVE** : (Optional field) Set to "True" if GDRIVE_FOLDER_ID is from a Team Drive else False or Leave it empty.
- USE_SERVICE_ACCOUNTS: (Optional field) (Leave empty if unsure) Whether to use service accounts or not. For this to work see "Using service accounts" section below. - **USE_SERVICE_ACCOUNTS**: (Optional field) (Leave empty if unsure) Whether to use service accounts or not. For this to work see "Using service accounts" section below.
- INDEX_URL : (Optional field) Refer to https://github.com/maple3142/GDIndex/ The URL should not have any trailing '/' - **INDEX_URL** : (Optional field) Refer to https://github.com/maple3142/GDIndex/ The URL should not have any trailing '/'
- API_KEY : This is to authenticate to your telegram account for downloading Telegram files. You can get this from https://my.telegram.org DO NOT put this in quotes. - **API_KEY** : This is to authenticate to your telegram account for downloading Telegram files. You can get this from https://my.telegram.org DO NOT put this in quotes.
- API_HASH : This is to authenticate to your telegram account for downloading Telegram files. You can get this from https://my.telegram.org - **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: - **USER_SESSION_STRING** : Session string generated by running:
``` ```
python3 generate_string_session.py python3 generate_string_session.py
``` ```

View File

@ -1,84 +0,0 @@
# auto rclone
# Add service accounts to groups for your organization
#
# Author Telegram https://t.me/CodyDoby
# Inbox codyd@qq.com
from __future__ import print_function
import os
import pickle
import argparse
import glob
import googleapiclient.discovery
import json
import progress.bar
import time
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
stt = time.time()
parse = argparse.ArgumentParser(
description='A tool to add service accounts to groups for your organization from a folder containing credential '
'files.')
parse.add_argument('--path', '-p', default='accounts',
help='Specify an alternative path to the service accounts folder.')
parse.add_argument('--credentials', '-c', default='credentials/credentials.json',
help='Specify the relative path for the controller file.')
parsereq = parse.add_argument_group('required arguments')
# service-account@googlegroups.com
parsereq.add_argument('--groupaddr', '-g', help='The address of groups for your organization.', required=True)
args = parse.parse_args()
acc_dir = args.path
gaddr = args.groupaddr
credentials = glob.glob(args.credentials)
creds = None
if os.path.exists('credentials/token.pickle'):
with open('credentials/token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(credentials[0], scopes=[
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.group.member'
])
# creds = flow.run_local_server(port=0)
creds = flow.run_console()
# Save the credentials for the next run
with open('credentials/token.pickle', 'wb') as token:
pickle.dump(creds, token)
group = googleapiclient.discovery.build("admin", "directory_v1", credentials=creds)
print(group.members())
batch = group.new_batch_http_request()
sa = glob.glob('%s/*.json' % acc_dir)
# sa = sa[0:5]
pbar = progress.bar.Bar("Readying accounts", max=len(sa))
for i in sa:
ce = json.loads(open(i, 'r').read())['client_email']
body = {"email": ce, "role": "MEMBER"}
batch.add(group.members().insert(groupKey=gaddr, body=body))
# group.members().insert(groupKey=gaddr, body=body).execute()
pbar.next()
pbar.finish()
print('Adding...')
batch.execute()
print('Complete.')
hours, rem = divmod((time.time() - stt), 3600)
minutes, sec = divmod(rem, 60)
print("Elapsed Time:\n{:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), sec))

View File

@ -85,14 +85,6 @@ def get_progress_bar_string(status):
return p_str return p_str
def get_download_index(_list, gid):
index = 0
for i in _list:
if i.download().gid == gid:
return index
index += 1
def get_readable_message(): def get_readable_message():
with download_dict_lock: with download_dict_lock:
msg = "" msg = ""
@ -105,8 +97,8 @@ def get_readable_message():
f" at {download.speed()}, ETA: {download.eta()} " f" at {download.speed()}, ETA: {download.eta()} "
if download.status() == MirrorStatus.STATUS_DOWNLOADING: if download.status() == MirrorStatus.STATUS_DOWNLOADING:
if hasattr(download, 'is_torrent'): if hasattr(download, 'is_torrent'):
msg += f"| P: {download.download().connections} " \ msg += f"| P: {download.aria_download().connections} " \
f"| S: {download.download().num_seeders}" f"| S: {download.aria_download().num_seeders}"
msg += f"\nGID: <code>{download.gid()}</code>" msg += f"\nGID: <code>{download.gid()}</code>"
msg += "\n\n" msg += "\n\n"
return msg return msg

View File

@ -28,7 +28,7 @@ class AriaDownloadHelper(DownloadHelper):
if api.get_download(gid).followed_by_ids: if api.get_download(gid).followed_by_ids:
self.gid = api.get_download(gid).followed_by_ids[0] self.gid = api.get_download(gid).followed_by_ids[0]
with download_dict_lock: with download_dict_lock:
download_dict[self.__listener.uid] = AriaDownloadStatus(self.gid, self.__listener) download_dict[self.__listener.uid] = AriaDownloadStatus(self, self.__listener)
download_dict[self.__listener.uid].is_torrent = True download_dict[self.__listener.uid].is_torrent = True
update_all_messages() update_all_messages()
LOGGER.info(f'Changed gid from {gid} to {self.gid}') LOGGER.info(f'Changed gid from {gid} to {self.gid}')
@ -60,7 +60,7 @@ class AriaDownloadHelper(DownloadHelper):
download = aria2.add_uris([link], {'dir': path}) download = aria2.add_uris([link], {'dir': path})
self.gid = download.gid self.gid = download.gid
with download_dict_lock: with download_dict_lock:
download_dict[self.__listener.uid] = AriaDownloadStatus(self.gid, self.__listener) download_dict[self.__listener.uid] = AriaDownloadStatus(self, self.__listener)
if download.error_message: if download.error_message:
self.__listener.onDownloadError(download.error_message) self.__listener.onDownloadError(download.error_message)
return return
@ -73,7 +73,7 @@ class AriaDownloadHelper(DownloadHelper):
def cancel_download(self): def cancel_download(self):
download = aria2.get_download(self.gid) download = aria2.get_download(self.gid)
if download.is_queued: if download.is_waiting:
aria2.remove([download]) aria2.remove([download])
self.__listener.onDownloadError("Cancelled by user") self.__listener.onDownloadError("Cancelled by user")
return return

View File

@ -9,12 +9,13 @@ def get_download(gid):
class AriaDownloadStatus(Status): class AriaDownloadStatus(Status):
def __init__(self, gid, listener): def __init__(self, obj, listener):
super().__init__() super().__init__()
self.upload_name = None self.upload_name = None
self.is_archiving = False self.is_archiving = False
self.__gid = gid self.obj = obj
self.__download = get_download(gid) self.__gid = obj.gid
self.__download = get_download(obj.gid)
self.__uid = listener.uid self.__uid = listener.uid
self.__listener = listener self.__listener = listener
self.message = listener.message self.message = listener.message
@ -37,28 +38,28 @@ class AriaDownloadStatus(Status):
Gets total size of the mirror file/folder Gets total size of the mirror file/folder
:return: total size of mirror :return: total size of mirror
""" """
return self.download().total_length return self.aria_download().total_length
def processed_bytes(self): def processed_bytes(self):
return self.download().completed_length return self.aria_download().completed_length
def speed(self): def speed(self):
return self.download().download_speed_string() return self.aria_download().download_speed_string()
def name(self): def name(self):
return self.download().name return self.aria_download().name
def path(self): def path(self):
return f"{DOWNLOAD_DIR}{self.__uid}" return f"{DOWNLOAD_DIR}{self.__uid}"
def size(self): def size(self):
return self.download().total_length_string() return self.aria_download().total_length_string()
def eta(self): def eta(self):
return self.download().eta_string() return self.aria_download().eta_string()
def status(self): def status(self):
download = self.download() download = self.aria_download()
if download.is_waiting: if download.is_waiting:
status = MirrorStatus.STATUS_WAITING status = MirrorStatus.STATUS_WAITING
elif download.is_paused: elif download.is_paused:
@ -70,10 +71,13 @@ class AriaDownloadStatus(Status):
status = MirrorStatus.STATUS_DOWNLOADING status = MirrorStatus.STATUS_DOWNLOADING
return status return status
def download(self): def aria_download(self):
self.__update() self.__update()
return self.__download return self.__download
def download(self):
return self.obj
def uid(self): def uid(self):
return self.__uid return self.__uid

View File

@ -57,9 +57,9 @@ def cancel_all(update, bot):
with download_dict_lock: with download_dict_lock:
count = 0 count = 0
for dlDetails in list(download_dict.values()): for dlDetails in list(download_dict.values()):
if not dlDetails.status() == MirrorStatus.STATUS_UPLOADING\ if dlDetails.status() == MirrorStatus.STATUS_DOWNLOADING\
or not dlDetails.status() == MirrorStatus.STATUS_ARCHIVING: or dlDetails.status() == MirrorStatus.STATUS_WAITING:
dlDetails.cancel_download() dlDetails.download().cancel_download()
count += 1 count += 1
delete_all_messages() delete_all_messages()
sendMessage(f'Cancelled {count} downloads!', update, bot) sendMessage(f'Cancelled {count} downloads!', update, bot)