File size: 6,010 Bytes
db78256 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
from aiofiles.os import remove, path as aiopath
from asyncio import iscoroutinefunction
from .. import (
task_dict,
task_dict_lock,
user_data,
LOGGER,
sabnzbd_client,
)
from ..core.config_manager import Config
from ..core.torrent_manager import TorrentManager
from ..helper.ext_utils.bot_utils import (
bt_selection_buttons,
new_task,
)
from ..helper.ext_utils.status_utils import get_task_by_gid, MirrorStatus
from ..helper.telegram_helper.message_utils import (
send_message,
send_status_message,
delete_message,
)
@new_task
async def select(_, message):
if not Config.BASE_URL:
await send_message(message, "Base URL not defined!")
return
user_id = message.from_user.id
msg = message.text.split()
if len(msg) > 1:
gid = msg[1]
task = await get_task_by_gid(gid)
if task is None:
await send_message(message, f"GID: <code>{gid}</code> Not Found.")
return
elif reply_to_id := message.reply_to_message_id:
async with task_dict_lock:
task = task_dict.get(reply_to_id)
if task is None:
await send_message(message, "This is not an active task!")
return
elif len(msg) == 1:
msg = (
"Reply to an active /cmd which was used to start the download or add gid along with cmd\n\n"
+ "This command mainly for selection incase you decided to select files from already added torrent/nzb. "
+ "But you can always use /cmd with arg `s` to select files before download start."
)
await send_message(message, msg)
return
if (
Config.OWNER_ID != user_id
and task.listener.user_id != user_id
and (user_id not in user_data or not user_data[user_id].get("SUDO"))
):
await send_message(message, "This task is not for you!")
return
if not iscoroutinefunction(task.status):
await send_message(message, "The task have finshed the download stage!")
return
if await task.status() not in [
MirrorStatus.STATUS_DOWNLOAD,
MirrorStatus.STATUS_PAUSED,
MirrorStatus.STATUS_QUEUEDL,
]:
await send_message(
message,
"Task should be in download or pause (incase message deleted by wrong) or queued status (incase you have used torrent or nzb file)!",
)
return
if task.name().startswith("[METADATA]") or task.name().startswith("Trying"):
await send_message(message, "Try after downloading metadata finished!")
return
try:
if not task.queued:
await task.update()
id_ = task.gid()
if task.listener.is_nzb:
await sabnzbd_client.pause_job(id_)
elif task.listener.is_qbit:
id_ = task.hash()
await TorrentManager.qbittorrent.torrents.stop([id_])
else:
try:
await TorrentManager.aria2.forcePause(id_)
except Exception as e:
LOGGER.error(
f"{e} Error in pause, this mostly happens after abuse aria2"
)
task.listener.select = True
except Exception:
await send_message(message, "This is not a bittorrent or sabnzbd task!")
return
SBUTTONS = bt_selection_buttons(id_)
msg = "Your download paused. Choose files then press Done Selecting button to resume downloading."
await send_message(message, msg, SBUTTONS)
@new_task
async def confirm_selection(_, query):
user_id = query.from_user.id
data = query.data.split()
message = query.message
task = await get_task_by_gid(data[2])
if task is None:
await query.answer("This task has been cancelled!", show_alert=True)
await delete_message(message)
return
if user_id != task.listener.user_id:
await query.answer("This task is not for you!", show_alert=True)
elif data[1] == "pin":
await query.answer(data[3], show_alert=True)
elif data[1] == "done":
await query.answer()
id_ = data[3]
if hasattr(task, "seeding"):
if task.listener.is_qbit:
tor_info = (
await TorrentManager.qbittorrent.torrents.info(hashes=[id_])
)[0]
path = tor_info.content_path.rsplit("/", 1)[0]
res = await TorrentManager.qbittorrent.torrents.files(id_)
for f in res:
if f.priority == 0:
f_paths = [f"{path}/{f.name}", f"{path}/{f.name}.!qB"]
for f_path in f_paths:
if await aiopath.exists(f_path):
try:
await remove(f_path)
except Exception:
pass
if not task.queued:
await TorrentManager.qbittorrent.torrents.start([id_])
else:
res = await TorrentManager.aria2.getFiles(id_)
for f in res:
if f["selected"] == "false" and await aiopath.exists(f["path"]):
try:
await remove(f["path"])
except Exception:
pass
if not task.queued:
try:
await TorrentManager.aria2.unpause(id_)
except Exception as e:
LOGGER.error(
f"{e} Error in resume, this mostly happens after abuse aria2. Try to use select cmd again!"
)
elif task.listener.is_nzb:
await sabnzbd_client.resume_job(id_)
await send_status_message(message)
await delete_message(message)
else:
await delete_message(message)
await task.cancel_task()
|