mirror of
https://github.com/anasty17/mirror-leech-telegram-bot.git
synced 2025-01-08 12:07:33 +08:00
Fixes for jdownloader, rclone and bulk
fix #1646 Signed-off-by: anasty17 <e.anastayyar@gmail.com>
This commit is contained in:
parent
2b54106a85
commit
4c4598311b
@ -674,4 +674,4 @@ ETH Address:
|
||||
0xf798a8a1c72d593e16d8f3bb619ebd1a093c7309
|
||||
```
|
||||
|
||||
-----
|
||||
-----
|
@ -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()
|
||||
|
@ -388,6 +388,7 @@ class TaskConfig:
|
||||
nextmsg,
|
||||
self.isQbit,
|
||||
self.isLeech,
|
||||
self.isJd,
|
||||
self.sameDir,
|
||||
self.bulk,
|
||||
self.multiTag,
|
||||
|
@ -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_}")
|
||||
|
@ -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!"""
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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}")
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user