diff --git a/bot/helper/common.py b/bot/helper/common.py index d0e36c89..08915b78 100644 --- a/bot/helper/common.py +++ b/bot/helper/common.py @@ -210,11 +210,21 @@ class TaskConfig: if self.ffmpeg_cmds and not isinstance(self.ffmpeg_cmds, list): if self.user_dict.get("ffmpeg_cmds", None): - self.ffmpeg_cmds = self.user_dict["ffmpeg_cmds"].get( - self.ffmpeg_cmds, None - ) + ffmpeg_dict = self.user_dict["ffmpeg_cmds"] + self.ffmpeg_cmds = [ + value + for key in list(self.ffmpeg_cmds) + if key in ffmpeg_dict + for value in ffmpeg_dict[key] + ] elif "ffmpeg_cmds" not in self.user_dict and Config.FFMPEG_CMDS: - self.ffmpeg_cmds = Config.FFMPEG_CMDS.get(self.ffmpeg_cmds, None) + ffmpeg_dict = Config.FFMPEG_CMDS + self.ffmpeg_cmds = [ + value + for key in list(self.ffmpeg_cmds) + if key in ffmpeg_dict + for value in ffmpeg_dict[key] + ] else: self.ffmpeg_cmds = None @@ -669,7 +679,11 @@ class TaskConfig: if code != 0: try: async with self.subprocess_lock: - stderr = (await self.subproc.stderr.read()).decode().strip() + stderr = ( + (await self.subproc.stderr.read()) + .decode() + .strip() + ) except: stderr = "Unable to decode the error!" LOGGER.error( diff --git a/bot/helper/ext_utils/bot_utils.py b/bot/helper/ext_utils/bot_utils.py index fe68ab8b..72b9c964 100644 --- a/bot/helper/ext_utils/bot_utils.py +++ b/bot/helper/ext_utils/bot_utils.py @@ -143,7 +143,11 @@ def arg_parser(items, arg_base): break sub_list.append(items[j]) if sub_list: - arg_base[part] = " ".join(sub_list) + value = " ".join(sub_list) + if part == "-ff" and not value.strip().startswith("["): + arg_base[part].add(value) + else: + arg_base[part] = value i += len(sub_list) i += 1 diff --git a/bot/helper/listeners/nzb_listener.py b/bot/helper/listeners/nzb_listener.py index 925ed236..3e8758c9 100644 --- a/bot/helper/listeners/nzb_listener.py +++ b/bot/helper/listeners/nzb_listener.py @@ -35,13 +35,6 @@ async def _on_download_error(err, nzo_id, button=None): ) -@new_task -async def _change_status(nzo_id, status): - if task := await get_task_by_gid(nzo_id): - async with task_dict_lock: - task.cstatus = status - - @new_task async def _stop_duplicate(nzo_id): if task := await get_task_by_gid(nzo_id): @@ -82,16 +75,6 @@ async def _nzb_listener(): nzb_jobs[nzo_id]["status"] = "Completed" elif job["status"] == "Failed": await _on_download_error(job["fail_message"], nzo_id) - elif job["status"] in [ - "QuickCheck", - "Verifying", - "Repairing", - "Fetching", - "Moving", - "Extracting", - ]: - if job["status"] != nzb_jobs[nzo_id]["status"]: - await _change_status(nzo_id, job["status"]) for dl in downloads: nzo_id = dl["nzo_id"] if nzo_id not in nzb_jobs: diff --git a/bot/helper/mirror_leech_utils/status_utils/nzb_status.py b/bot/helper/mirror_leech_utils/status_utils/nzb_status.py index 2af8eb33..41e99839 100644 --- a/bot/helper/mirror_leech_utils/status_utils/nzb_status.py +++ b/bot/helper/mirror_leech_utils/status_utils/nzb_status.py @@ -12,12 +12,38 @@ from ...ext_utils.status_utils import ( async def get_download(nzo_id, old_info=None): try: - res = await sabnzbd_client.get_downloads(nzo_ids=nzo_id) - if res["queue"]["slots"]: - slot = res["queue"]["slots"][0] + queue = await sabnzbd_client.get_downloads(nzo_ids=nzo_id) + if res := queue["queue"]["slots"]: + slot = res[0] if msg := slot["labels"]: LOGGER.warning(" | ".join(msg)) return slot + else: + history = await sabnzbd_client.get_history(nzo_ids=nzo_id) + if res := history["history"]["slots"]: + slot = res[0] + if slot["status"] == "Verifying": + percentage = slot["action_line"].split("Verifying: ")[-1].split("/") + percentage = round( + (int(percentage[0]) / int(percentage[1])) * 100, 2 + ) + old_info["percentage"] = percentage + elif slot["status"] == "Repairing": + action = slot["action_line"].split("Repairing: ")[-1].split() + percentage = action[0].strip("%") + eta = action[2] + old_info["percentage"] = percentage + old_info["timeleft"] = eta + elif slot["status"] == "Extracting": + action = slot["action_line"].split("Unpacking: ")[-1].split() + percentage = action[0].split("/") + percentage = round( + (int(percentage[0]) / int(percentage[1])) * 100, 2 + ) + eta = action[2] + old_info["percentage"] = percentage + old_info["timeleft"] = eta + old_info["status"] = slot["status"] return old_info except Exception as e: LOGGER.error(f"{e}: Sabnzbd, while getting job info. ID: {nzo_id}") @@ -25,10 +51,9 @@ async def get_download(nzo_id, old_info=None): class SabnzbdStatus: - def __init__(self, listener, gid, queued=False, status=None): + def __init__(self, listener, gid, queued=False): self.queued = queued self.listener = listener - self.cstatus = status self._gid = gid self._info = None @@ -70,10 +95,15 @@ class SabnzbdStatus: state = self._info["status"] if state == "Paused" and self.queued: return MirrorStatus.STATUS_QUEUEDL - elif self.cstatus: - return self.cstatus - elif state == "Paused": - return MirrorStatus.STATUS_PAUSED + elif state in [ + "QuickCheck", + "Verifying", + "Repairing", + "Fetching", + "Moving", + "Extracting", + ]: + return state else: return MirrorStatus.STATUS_DOWNLOAD @@ -91,6 +121,7 @@ class SabnzbdStatus: self.listener.on_download_error("Stopped by user!"), sabnzbd_client.delete_job(self._gid, delete_files=True), sabnzbd_client.delete_category(f"{self.listener.mid}"), + sabnzbd_client.delete_history(self._gid, delete_files=True), ) async with nzb_listener_lock: if self._gid in nzb_jobs: diff --git a/bot/modules/mirror_leech.py b/bot/modules/mirror_leech.py index 9bbc0ed9..f78b5f63 100644 --- a/bot/modules/mirror_leech.py +++ b/bot/modules/mirror_leech.py @@ -106,7 +106,7 @@ class Mirror(TaskListener): "-cv": "", "-ns": "", "-tl": "", - "-ff": None, + "-ff": set(), } arg_parser(input_list[1:], args) @@ -153,10 +153,11 @@ class Mirror(TaskListener): self.multi = 0 try: - if args["-ff"].strip().startswith("["): - self.ffmpeg_cmds = eval(args["-ff"]) - else: - self.ffmpeg_cmds = args["-ff"] + if args["-ff"]: + if isinstance(args["-ff"], set): + self.ffmpeg_cmds = args["-ff"] + else: + self.ffmpeg_cmds = eval(args["-ff"]) except Exception as e: self.ffmpeg_cmds = None LOGGER.error(e) @@ -188,12 +189,20 @@ class Mirror(TaskListener): if fd_name != self.folder_name: self.same_dir[fd_name]["total"] -= 1 elif self.same_dir: - self.same_dir[self.folder_name] = {"total": self.multi, "tasks": {self.mid}} + self.same_dir[self.folder_name] = { + "total": self.multi, + "tasks": {self.mid}, + } for fd_name in self.same_dir: if fd_name != self.folder_name: self.same_dir[fd_name]["total"] -= 1 else: - self.same_dir = {self.folder_name: {"total": self.multi, "tasks": {self.mid}}} + self.same_dir = { + self.folder_name: { + "total": self.multi, + "tasks": {self.mid}, + } + } elif self.same_dir: async with task_dict_lock: for fd_name in self.same_dir: diff --git a/bot/modules/ytdlp.py b/bot/modules/ytdlp.py index a75964a2..141454f3 100644 --- a/bot/modules/ytdlp.py +++ b/bot/modules/ytdlp.py @@ -310,7 +310,7 @@ class YtDlp(TaskListener): "-cv": "", "-ns": "", "-tl": "", - "-ff": None, + "-ff": set(), } arg_parser(input_list[1:], args) @@ -321,10 +321,11 @@ class YtDlp(TaskListener): self.multi = 0 try: - if args["-ff"].strip().startswith("["): - self.ffmpeg_cmds = eval(args["-ff"]) - else: - self.ffmpeg_cmds = args["-ff"] + if args["-ff"]: + if isinstance(args["-ff"], set): + self.ffmpeg_cmds = args["-ff"] + else: + self.ffmpeg_cmds = eval(args["-ff"]) except Exception as e: self.ffmpeg_cmds = None LOGGER.error(e)