Fixes for jdownloader, rclone and bulk

fix #1646

Signed-off-by: anasty17 <e.anastayyar@gmail.com>
This commit is contained in:
anasty17 2023-12-29 00:40:21 +02:00
parent 2b54106a85
commit 4c4598311b
10 changed files with 81 additions and 54 deletions

View File

@ -674,4 +674,4 @@ ETH Address:
0xf798a8a1c72d593e16d8f3bb619ebd1a093c7309
```
-----
-----

View File

@ -234,13 +234,13 @@ async def restart_notification():
async def main():
jdownloader.initiate()
await gather(
sync_to_async(clean_all),
torrent_search.initiate_search_tools(),
restart_notification(),
telegraph.create_account(),
rclone_serve_booter(),
jdownloader.intiate(),
sync_to_async(start_aria2_listener, wait=False),
)
create_help_buttons()

View File

@ -388,6 +388,7 @@ class TaskConfig:
nextmsg,
self.isQbit,
self.isLeech,
self.isJd,
self.sameDir,
self.bulk,
self.multiTag,

View File

@ -2,7 +2,7 @@ from os import walk, path as ospath, makedirs
from aiofiles.os import remove, path as aiopath, listdir, rmdir
from aioshutil import rmtree as aiormtree
from magic import Magic
from re import split as re_split, I, search as re_search
from re import split as re_split, I, search as re_search, escape
from subprocess import run as srun
from sys import exit as sexit
from shutil import rmtree
@ -191,5 +191,5 @@ async def join_files(path):
LOGGER.info("Join Completed!")
for res in results:
for file_ in files:
if re_search(rf"{res}\.0[0-9]+$", file_):
if re_search(rf"{escape(res)}\.0[0-9]+$", file_):
await remove(f"{path}/{file_}")

View File

@ -36,7 +36,7 @@ thumb = """<b>Thumbnail for current task</b>: -t
/cmd link -t tg-message-link(doc or photo)"""
split_size = """<b>Split size for current task</b>: -t
split_size = """<b>Split size for current task</b>: -sp
/cmd link -sp (500mb or 2gb or 4000000000)
Note: Only mb and gb are supported or write in bytes without unit!"""

View File

@ -1,4 +1,9 @@
from myjdapi import Myjdapi
from json import dump
from time import sleep
from asyncio import sleep as aiosleep
from random import randint
from aiofiles.os import listdir
from myjdapi.exception import (
MYJDException,
MYJDAuthFailedException,
@ -6,13 +11,13 @@ from myjdapi.exception import (
MYJDEmailInvalidException,
MYJDErrorEmailNotConfirmedException,
)
from json import dump
from time import sleep
from random import randint
from aiofiles.os import listdir
from bot import config_dict, LOGGER
from bot.helper.ext_utils.bot_utils import cmd_exec, new_task
from bot import config_dict, LOGGER, jd_lock, Intervals
from bot.helper.ext_utils.bot_utils import (
cmd_exec,
new_task,
sync_to_async,
)
class JDownloader:
@ -21,17 +26,28 @@ class JDownloader:
self._username = ""
self._password = ""
self._device_name = ""
self.error = "JDownloader Credentials not provided!"
self.device = None
self.myjd.set_app_key("mltb")
async def intiate(self):
@new_task
async def initiate(self):
self.boot()
await aiosleep(10)
await self.start()
async def start(self):
async with jd_lock:
await sync_to_async(self.connect)
if self.device is not None:
await self.keepJdAlive()
@new_task
async def boot(self):
await cmd_exec(["pkill", "-9", "java"])
self.device = None
if config_dict["JD_EMAIL"]:
if config_dict["JD_EMAIL"] and config_dict["JD_PASS"]:
self.error = "Connecting... Try agin after couple of seconds"
self._device_name = f"{randint(0, 1000)}"
logs = await listdir("/JDownloader/logs")
if len(logs) > 2:
@ -55,31 +71,57 @@ class JDownloader:
cmd = "java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 -Djava.awt.headless=true -jar /JDownloader/JDownloader.jar"
_, __, code = await cmd_exec(cmd, shell=True)
if code != -9:
await self.intiate()
self.boot()
def connect(self):
LOGGER.info(f"Connecting to JDownloader...")
try:
self.myjd.connect(config_dict["JD_EMAIL"], config_dict["JD_PASS"])
sleep(0.5)
while True:
self.myjd.update_devices()
devices = self.myjd.list_devices()
if devices:
for device in devices:
if self._device_name == device["name"]:
break
else:
continue
else:
continue
break
self.device = self.myjd.get_device(f"{self._device_name}")
self.device.enable_direct_connection()
self.device.linkgrabber.query_packages()
self.device.linkgrabber.clear_list()
LOGGER.info(f"JDownloader is Connected!")
except (
MYJDAuthFailedException,
MYJDEmailForbiddenException,
MYJDEmailInvalidException,
MYJDErrorEmailNotConfirmedException,
) as err:
LOGGER.info(f"Failed to connect with jdownloader!ERROR: {err}".strip())
self.error = f"{err}".strip()
LOGGER.info(f"Failed to connect with jdownloader! ERROR: {self.error}")
self.device = None
raise err
return
except MYJDException as e:
self.error = f"{e}".strip()
LOGGER.info(
f"Failed to connect with jdownloader! Retrying... ERROR: {e}".strip()
f"Failed to connect with jdownloader! Retrying... ERROR: {self.error}"
)
sleep(10)
return self.connect()
@new_task
async def keepJdAlive(self):
while True:
await aiosleep(30)
if self.device is not None:
break
if not Intervals["jd"]:
try:
await sync_to_async(self.device.action, "/device/ping")
except:
pass
jdownloader = JDownloader()

View File

@ -17,10 +17,10 @@ def getSplitSizeBytes(size):
size = size.lower()
if size.endswith("mb"):
size = size.split("mb")[0]
size = float(size) * 1048576
size = int(float(size) * 1048576)
elif size.endswith("gb"):
size = size.split("gb")[0]
size = float(size) * 1073741824
size = int(float(size) * 1073741824)
else:
size = 0
return size

View File

@ -24,7 +24,6 @@ from bot import (
queue_dict_lock,
jd_lock,
jd_downloads,
config_dict,
)
@ -85,15 +84,8 @@ class JDownloaderHelper:
async def add_jd_download(listener, path):
async with jd_lock:
if jdownloader.device is None:
if config_dict["JD_EMAIL"] and config_dict["JD_PASS"]:
await sync_to_async(jdownloader.connect)
else:
await listener.onDownloadError("NO JDownloader credentials!")
return
await retry_function(
sync_to_async,
jdownloader.device.linkgrabber.clear_list,
)
await listener.onDownloadError(jdownloader.error)
return
if not jd_downloads and (
odl := await retry_function(
@ -207,16 +199,16 @@ async def add_jd_download(listener, path):
exists = True
break
if not exists:
await listener.onDownloadError("This Download have been removed manually!")
return
await retry_function(
sync_to_async,
jdownloader.device.downloads.force_download,
package_ids=[gid],
)
if not exists:
await listener.onDownloadError("This Download have been removed manually!")
return
async with task_dict_lock:
task_dict[listener.mid] = JDownloaderStatus(listener, f"{gid}")

View File

@ -405,7 +405,7 @@ class RcloneTransferHelper:
f"/{self._listener.name}" if dst_path else self._listener.name
)
cmd = f'rclone link --config {config_path} "{destination}"'
cmd = f"rclone link --config {config_path} '{destination}'"
res, err, code = await cmd_exec(cmd, shell=True)
if self._is_cancelled:

View File

@ -9,7 +9,6 @@ from dotenv import load_dotenv
from time import time
from io import BytesIO
from aioshutil import rmtree
from myjdapi.exception import MYJDException
from bot.helper.telegram_helper.filters import CustomFilters
from bot.helper.telegram_helper.bot_commands import BotCommands
@ -311,23 +310,15 @@ async def edit_qbit(_, message, pre_message, key):
async def sync_jdownloader():
if DATABASE_URL:
if jdownloader.device is None:
try:
await sync_to_async(jdownloader.connect)
except (Exception, MYJDException) as e:
await sendMessage(f"{e}".strip())
return
if jdownloader.device is not None:
await sync_to_async(jdownloader.device.system.exit_jd)
if await aiopath.exists("cfg.zip"):
await remove("cfg.zip")
await (
await create_subprocess_exec("7z", "a", "cfg.zip", "/JDownloader/cfg")
).wait()
await DbManger().update_private_file("cfg.zip")
try:
await sync_to_async(jdownloader.connect)
except (Exception, MYJDException) as e:
await sendMessage(f"{e}".strip())
if await aiopath.exists("cfg.zip"):
await remove("cfg.zip")
await (
await create_subprocess_exec("7z", "a", "cfg.zip", "/JDownloader/cfg")
).wait()
await DbManger().update_private_file("cfg.zip")
await jdownloader.start()
async def update_private_file(_, message, pre_message):
@ -516,7 +507,8 @@ async def edit_bot_settings(client, query):
elif data[2] == "INCOMPLETE_TASK_NOTIFIER" and DATABASE_URL:
await DbManger().trunc_table("tasks")
elif data[2] in ["JD_EMAIL", "JD_PASS"]:
jdownloader.device = None
await sleep(3)
await jdownloader.start()
config_dict[data[2]] = value
await update_buttons(message, "var")
if DATABASE_URL: