-Add zip cmd for mirror only by KenHv
-Qbittorrent can download torrents from direct links
-other fixes

Co-authored-by: KenHv <yo@kenharris.xyz>
Signed-off-by: anas <e.anastayyar@gmail.com>
This commit is contained in:
anas 2021-08-17 13:08:48 +03:00
parent 721a586679
commit f0d1bfea9a
6 changed files with 77 additions and 48 deletions

View File

@ -73,7 +73,7 @@ def get_client() -> qba.TorrentsAPIMixIn:
qb_client = qba.Client(host="localhost", port=8090, username="admin", password="adminadmin")
try:
qb_client.auth_log_in()
qb_client.application.set_preferences({"disk_cache":64, "incomplete_files_ext":True, "max_connec":10000, "max_connec_per_torrent":1000, "async_io_threads":32, "preallocate_all":True, "upnp":True, "dl_limit":-1, "up_limit":-1, "dht":True, "pex":True, "lsd":True, "encryption":0, "queueing_enabled":True, "max_active_downloads":15, "max_active_torrents":50, "dont_count_slow_torrents":True, "bittorrent_protocol":0, "recheck_completed_torrents":True, "auto_delete_mode":True, "enable_multi_connections_from_same_ip":True, "slow_torrent_dl_rate_threshold":100,"slow_torrent_inactive_timer":600})
qb_client.application.set_preferences({"disk_cache":64, "incomplete_files_ext":True, "max_connec":10000, "max_connec_per_torrent":1000, "async_io_threads":32, "preallocate_all":True, "upnp":True, "dl_limit":-1, "up_limit":-1, "dht":True, "pex":True, "lsd":True, "encryption":0, "queueing_enabled":True, "max_active_downloads":15, "max_active_torrents":50, "dont_count_slow_torrents":True, "bittorrent_protocol":0, "recheck_completed_torrents":True, "enable_multi_connections_from_same_ip":True, "slow_torrent_dl_rate_threshold":100,"slow_torrent_inactive_timer":600})
return qb_client
except qba.LoginFailed as e:
LOGGER.error(str(e))

View File

@ -92,6 +92,8 @@ def bot_help(update, context):
/{BotCommands.TarMirrorCommand} [download_url][magnet_link]: Start mirroring and upload the archived (.tar) version of the download
/{BotCommands.ZipMirrorCommand} [download_url][magnet_link]: Start mirroring and upload the archived (.zip) version of the download
/{BotCommands.UnzipMirrorCommand} [download_url][magnet_link]: Starts mirroring and if downloaded file is any archive, extracts it to Google Drive
/{BotCommands.CloneCommand} [drive_url]: Copy file/folder to Google Drive
@ -150,6 +152,8 @@ def bot_help(update, context):
/{BotCommands.TarMirrorCommand} [download_url][magnet_link]: Start mirroring and upload the archived (.tar) version of the download
/{BotCommands.ZipMirrorCommand} [download_url][magnet_link]: Start mirroring and upload the archived (.zip) version of the download
/{BotCommands.UnzipMirrorCommand} [download_url][magnet_link]: Starts mirroring and if downloaded file is any archive, extracts it to Google Drive
/{BotCommands.CloneCommand} [drive_url]: Copy file/folder to Google Drive
@ -184,6 +188,7 @@ botcmds = [
(f'{BotCommands.MirrorCommand}', 'Start Mirroring'),
(f'{BotCommands.TarMirrorCommand}','Start mirroring and upload as .tar'),
(f'{BotCommands.UnzipMirrorCommand}','Extract files'),
(f'{BotCommands.ZipMirrorCommand}','Start mirroring and upload as .zip'),
(f'{BotCommands.CloneCommand}','Copy file/folder to Drive'),
(f'{BotCommands.CountCommand}','Count file/folder of Drive link'),
(f'{BotCommands.DeleteCommand}','Delete file from Drive'),

View File

@ -53,7 +53,7 @@ def get_path_size(path):
def tar(org_path):
tar_path = org_path + ".tar"
path = pathlib.PurePath(org_path)
#path = pathlib.PurePath(org_path)
LOGGER.info(f'Tar: orig_path: {org_path}, tar_path: {tar_path}')
tar = tarfile.open(tar_path, "w")
tar.add(org_path, arcname=os.path.basename(org_path))
@ -61,6 +61,15 @@ def tar(org_path):
return tar_path
def zip(name, path):
root_dir = os.path.dirname(path)
base_dir = os.path.basename(path.strip(os.sep))
zip_file = shutil.make_archive(name, "zip", root_dir, base_dir)
zip_path = shutil.move(zip_file, root_dir)
LOGGER.info(f"Zip: {zip_path}")
return zip_path
def get_base_name(orig_path: str):
if orig_path.endswith(".tar.bz2"):
return orig_path.replace(".tar.bz2", "")

View File

@ -4,6 +4,7 @@ class _BotCommands:
self.MirrorCommand = 'mirror'
self.UnzipMirrorCommand = 'unzipmirror'
self.TarMirrorCommand = 'tarmirror'
self.ZipMirrorCommand = 'zipmirror'
self.CancelMirror = 'cancel'
self.CancelAllCommand = 'cancelall'
self.ListCommand = 'list'

View File

@ -35,11 +35,12 @@ ariaDlManager = AriaDownloadHelper()
ariaDlManager.start_listener()
class MirrorListener(listeners.MirrorListeners):
def __init__(self, bot, update, pswd, isTar=False, extract=False, qbit=False):
def __init__(self, bot, update, pswd, isTar=False, extract=False, isZip=False, isQbit=False):
super().__init__(bot, update)
self.isTar = isTar
self.extract = extract
self.qbit = qbit
self.isZip = isZip
self.isQbit = isQbit
self.pswd = pswd
def onDownloadStarted(self):
@ -66,14 +67,17 @@ class MirrorListener(listeners.MirrorListeners):
name = download.name()
gid = download.gid()
size = download.size_raw()
if name is None or self.qbit: # when pyrogram's media.file_name is of NoneType
if name is None or self.isQbit: # when pyrogram's media.file_name is of NoneType
name = os.listdir(f'{DOWNLOAD_DIR}{self.uid}')[0]
m_path = f'{DOWNLOAD_DIR}{self.uid}/{name}'
if self.isTar:
try:
with download_dict_lock:
download_dict[self.uid] = TarStatus(name, m_path, size)
path = fs_utils.tar(m_path)
if self.isZip:
path = fs_utils.zip(name, m_path)
else:
path = fs_utils.tar(m_path)
except FileNotFoundError:
LOGGER.info('File to archive not found!')
self.onUploadError('Internal error occurred!!')
@ -225,20 +229,28 @@ class MirrorListener(listeners.MirrorListeners):
else:
update_all_messages()
def _mirror(bot, update, isTar=False, extract=False):
def _mirror(bot, update, isTar=False, extract=False, isZip=False, isQbit=False):
mesg = update.message.text.split('\n')
message_args = mesg[0].split(' ')
name_args = mesg[0].split('|')
qbit = False
qbitsel = False
try:
link = message_args[1]
if link == "qb" or link == "qbs":
qbit = True
isQbit = True
if link == "qbs":
qbitsel = True
link = message_args[2]
print(link)
if bot_utils.is_url(link) and link.endswith(".torrent"):
resp = requests.get(link)
if resp.status_code == 200:
file_name = link.split('/')[-1].replace(" ", "_")
with open(file_name, "wb") as f:
f.write(resp.content)
link = f"/usr/src/app/{file_name}"
else:
sendMessage("ERROR: link got HTTP response:" + resp.status_code, bot, update)
return
if link.startswith("|") or link.startswith("pswd: "):
link = ''
except IndexError:
@ -263,7 +275,8 @@ def _mirror(bot, update, isTar=False, extract=False):
if pswd is not None:
pswd = pswd.groups()
pswd = " ".join(pswd)
LOGGER.info(link)
if link != '':
LOGGER.info(link)
link = link.strip()
reply_to = update.message.reply_to_message
if reply_to is not None:
@ -277,13 +290,13 @@ def _mirror(bot, update, isTar=False, extract=False):
if not bot_utils.is_url(link) and not bot_utils.is_magnet(link) or len(link) == 0:
if file is not None:
if file.mime_type != "application/x-bittorrent":
listener = MirrorListener(bot, update, pswd, isTar, extract)
listener = MirrorListener(bot, update, pswd, isTar, extract, isZip)
tg_downloader = TelegramDownloadHelper(listener)
ms = update.message
tg_downloader.add_download(ms, f'{DOWNLOAD_DIR}{listener.uid}/', name)
return
else:
if qbit:
if isQbit:
file.get_file().download(custom_path=f"/usr/src/app/{file.file_name}")
link = f"/usr/src/app/{file.file_name}"
else:
@ -292,19 +305,19 @@ def _mirror(bot, update, isTar=False, extract=False):
if not bot_utils.is_url(link) and not bot_utils.is_magnet(link):
sendMessage('No download source provided', bot, update)
return
if not os.path.exists(link) and not bot_utils.is_mega_link(link) and not bot_utils.is_gdrive_link(link) and not bot_utils.is_magnet(link):
try:
link = direct_link_generator(link)
except DirectDownloadLinkException as e:
LOGGER.info(e)
if "ERROR:" in str(e):
sendMessage(f"{e}", bot, update)
return
if "Youtube" in str(e):
sendMessage(f"{e}", bot, update)
return
try:
link = direct_link_generator(link)
except DirectDownloadLinkException as e:
LOGGER.info(e)
if "ERROR:" in str(e):
sendMessage(f"{e}", bot, update)
return
if "Youtube" in str(e):
sendMessage(f"{e}", bot, update)
return
listener = MirrorListener(bot, update, pswd, isTar, extract, qbit)
listener = MirrorListener(bot, update, pswd, isTar, extract, isZip, isQbit)
if bot_utils.is_gdrive_link(link):
if not isTar and not extract:
@ -339,7 +352,7 @@ def _mirror(bot, update, isTar=False, extract=False):
mega_dl = MegaDownloadHelper()
mega_dl.add_download(link, f'{DOWNLOAD_DIR}{listener.uid}/', listener)
elif qbit and (bot_utils.is_magnet(link) or os.path.exists(link)):
elif isQbit and (bot_utils.is_magnet(link) or os.path.exists(link)):
qbit = qbittorrent()
qbit.add_torrent(link, f'{DOWNLOAD_DIR}{listener.uid}/', listener, qbitsel)
@ -359,6 +372,8 @@ def tar_mirror(update, context):
def unzip_mirror(update, context):
_mirror(context.bot, update, extract=True)
def zip_mirror(update, context):
_mirror(context.bot, update, True, isZip=True)
mirror_handler = CommandHandler(BotCommands.MirrorCommand, mirror,
filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
@ -366,6 +381,9 @@ tar_mirror_handler = CommandHandler(BotCommands.TarMirrorCommand, tar_mirror,
filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
unzip_mirror_handler = CommandHandler(BotCommands.UnzipMirrorCommand, unzip_mirror,
filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
zip_mirror_handler = CommandHandler(BotCommands.ZipMirrorCommand, zip_mirror,
filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
dispatcher.add_handler(mirror_handler)
dispatcher.add_handler(tar_mirror_handler)
dispatcher.add_handler(unzip_mirror_handler)
dispatcher.add_handler(zip_mirror_handler)

View File

@ -137,11 +137,11 @@ async def list_torrent_contents(request):
gets = request.query
if not "pin_code" in gets.keys():
rend_page = code_page.replace("{form_url}",f"/slam/files/{torr}")
return web.Response(text=rend_page,content_type='text/html')
rend_page = code_page.replace("{form_url}", f"/slam/files/{torr}")
return web.Response(text=rend_page, content_type='text/html')
client = qba.Client(host="localhost",port="8090",username="admin",password="adminadmin")
client = qba.Client(host="localhost", port="8090", username="admin", password="adminadmin")
client.auth_log_in()
try:
res = client.torrents_files(torrent_hash=torr)
@ -165,12 +165,12 @@ async def list_torrent_contents(request):
par = nodes.make_tree(res)
cont = ["",0]
nodes.create_list(par,cont)
nodes.create_list(par, cont)
rend_page = page.replace("{My_content}",cont[0])
rend_page = rend_page.replace("{form_url}",f"/slam/files/{torr}?pin_code={pincode}")
rend_page = page.replace("{My_content}", cont[0])
rend_page = rend_page.replace("{form_url}", f"/slam/files/{torr}?pin_code={pincode}")
client.auth_log_out()
return web.Response(text=rend_page,content_type='text/html')
return web.Response(text=rend_page, content_type='text/html')
async def re_verfiy(paused, resumed, client, torr):
@ -204,25 +204,23 @@ async def re_verfiy(paused, resumed, client, torr):
if not verify:
LOGGER.info("Reverification Failed :- correcting stuff")
# reconnect and issue the request again
LOGGER.error("Reverification Failed, correcting stuff...")
client.auth_log_out()
client = qba.Client(host="localhost",port="8090",username="admin",password="adminadmin")
client = qba.Client(host="localhost", port="8090", username="admin", password="adminadmin")
client.auth_log_in()
try:
client.torrents_file_priority(torrent_hash=torr,file_ids=paused,priority=0)
client.torrents_file_priority(torrent_hash=torr, file_ids=paused, priority=0)
except:
LOGGER.error("Errored in reverification paused")
try:
client.torrents_file_priority(torrent_hash=torr,file_ids=resumed,priority=1)
client.torrents_file_priority(torrent_hash=torr, file_ids=resumed, priority=1)
except:
LOGGER.error("Errored in reverification resumed")
client.auth_log_out()
else:
break
k += 1
if k >= 2:
# avoid an infite loop here
if k >= 4:
return False
return True
@ -232,7 +230,7 @@ async def re_verfiy(paused, resumed, client, torr):
async def set_priority(request):
torr = request.match_info["hash_id"]
client = qba.Client(host="localhost",port="8090",username="admin",password="adminadmin")
client = qba.Client(host="localhost", port="8090", username="admin", password="adminadmin")
client.auth_log_in()
data = await request.post()
@ -251,25 +249,23 @@ async def set_priority(request):
pause = pause.strip("|")
resume = resume.strip("|")
LOGGER.info(f"Paused {pause} of {torr}")
LOGGER.info(f"Resumed {resume} of {torr}")
try:
client.torrents_file_priority(torrent_hash=torr,file_ids=pause,priority=0)
client.torrents_file_priority(torrent_hash=torr, file_ids=pause, priority=0)
except qba.NotFound404Error:
raise web.HTTPNotFound()
except:
LOGGER.info("Errored in paused")
LOGGER.error("Errored in paused")
try:
client.torrents_file_priority(torrent_hash=torr,file_ids=resume,priority=1)
client.torrents_file_priority(torrent_hash=torr, file_ids=resume, priority=1)
except qba.NotFound404Error:
raise web.HTTPNotFound()
except:
LOGGER.info("Errored in resumed")
LOGGER.error("Errored in resumed")
await asyncio.sleep(2)
if not await re_verfiy(pause,resume,client,torr):
if not await re_verfiy(pause, resume, client, torr):
LOGGER.error("The torrent choose errored reverification failed")
client.auth_log_out()
return await list_torrent_contents(request)