Kfunga/mirror
0
1from anytree import NodeMixin2from os import environ3from re import findall as re_findall4 5DOWNLOAD_DIR = environ.get(6 "DOWNLOAD_DIR",7 ""8)9if len(DOWNLOAD_DIR) == 0:10 DOWNLOAD_DIR = "/usr/src/app/Downloads/"11elif not DOWNLOAD_DIR.endswith("/"):12 DOWNLOAD_DIR += "/"13 14 15class TorNode(NodeMixin):16 def __init__(17 self,18 name,19 is_folder=False,20 is_file=False,21 parent=None,22 size=None,23 priority=None,24 file_id=None,25 progress=None,26 ):27 super().__init__()28 self.name = name29 self.is_folder = is_folder30 self.is_file = is_file31 32 if parent is not None:33 self.parent = parent34 if size is not None:35 self.fsize = size36 if priority is not None:37 self.priority = priority38 if file_id is not None:39 self.file_id = file_id40 if progress is not None:41 self.progress = progress42 43 44def qb_get_folders(path):45 return path.split("/")46 47 48def get_folders(path):49 fs = re_findall(f"{DOWNLOAD_DIR}[0-9]+/(.+)", path)[0]50 return fs.split("/")51 52 53def make_tree(res, tool=False):54 if tool == "qbit":55 parent = TorNode("Torrent")56 for i in res:57 folders = qb_get_folders(i.name)58 if len(folders) > 1:59 previous_node = parent60 for j in range(len(folders) - 1):61 current_node = next(62 (k for k in previous_node.children if k.name == folders[j]),63 None,64 )65 if current_node is None:66 previous_node = TorNode(67 folders[j],68 parent=previous_node,69 is_folder=True70 )71 else:72 previous_node = current_node73 TorNode(74 folders[-1],75 is_file=True,76 parent=previous_node,77 size=i.size,78 priority=i.priority,79 file_id=i.id,80 progress=round(i.progress * 100, 5),81 )82 else:83 TorNode(84 folders[-1],85 is_file=True,86 parent=parent,87 size=i.size,88 priority=i.priority,89 file_id=i.id,90 progress=round(i.progress * 100, 5),91 )92 elif tool == "aria":93 parent = TorNode("Torrent")94 for i in res:95 folders = get_folders(i["path"])96 priority = 197 if i["selected"] == "false":98 priority = 099 if len(folders) > 1:100 previous_node = parent101 for j in range(len(folders) - 1):102 current_node = next(103 (k for k in previous_node.children if k.name == folders[j]),104 None,105 )106 if current_node is None:107 previous_node = TorNode(108 folders[j],109 parent=previous_node,110 is_folder=True111 )112 else:113 previous_node = current_node114 TorNode(115 folders[-1],116 is_file=True,117 parent=previous_node,118 size=i["length"],119 priority=priority,120 file_id=i["index"],121 progress=round(122 (int(i["completedLength"]) / int(i["length"])) * 100,123 5124 ),125 )126 else:127 TorNode(128 folders[-1],129 is_file=True,130 parent=parent,131 size=i["length"],132 priority=priority,133 file_id=i["index"],134 progress=round(135 (int(i["completedLength"]) / int(i["length"])) * 100,136 5137 ),138 )139 140 else:141 parent = TorNode("Torrent")142 priority = 1143 for i in res["files"]:144 TorNode(145 i["filename"],146 is_file=True,147 parent=parent,148 size=float(i["mb"]) * 1048576,149 priority=priority,150 file_id=i["nzf_id"],151 progress=round(152 ((float(i["mb"]) - float(i["mbleft"])) / float(i["mb"])) * 100,153 5,154 ),155 )156 157 return create_list(158 parent,159 [160 "",161 0162 ]163 )164 165 166"""167def print_tree(parent):168 for pre, _, node in RenderTree(parent):169 treestr = u"%s%s" % (pre, node.name)170 print(treestr.ljust(8), node.is_folder, node.is_file)171"""172 173 174def create_list(par, msg):175 if par.name != ".unwanted":176 msg[0] += "<ul>"177 for i in par.children:178 msg[0] += "<li>"179 if i.is_folder:180 if i.name != ".unwanted":181 msg[182 0183 ] += f'<input type="checkbox" name="foldernode_{msg[1]}"> <label for="{i.name}">{i.name}</label>'184 create_list(i, msg)185 msg[0] += "</li>"186 msg[1] += 1187 else:188 if i.priority == 0:189 msg[190 0191 ] += f'<input type="checkbox" name="filenode_{i.file_id}" data-size="{i.fsize}"> <label data-size="{i.fsize}" for="filenode_{i.file_id}">{i.name}</label> / {i.progress}%'192 else:193 msg[194 0195 ] += f'<input type="checkbox" checked name="filenode_{i.file_id}" data-size="{i.fsize}"> <label data-size="{i.fsize}" for="filenode_{i.file_id}">{i.name}</label> / {i.progress}%'196 msg[0] += f'<input type="hidden" value="off" name="filenode_{i.file_id}">'197 msg[0] += "</li>"198 199 if par.name != ".unwanted":200 msg[0] += "</ul>"201 return msg202 