Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
anasty17
GitHub Repository: anasty17/mirror-leech-telegram-bot
Path: blob/master/web/nodes.py
1621 views
1
from anytree import NodeMixin
2
3
4
class TorNode(NodeMixin):
5
def __init__(
6
self,
7
name,
8
is_folder=False,
9
is_file=False,
10
parent=None,
11
size=None,
12
priority=None,
13
file_id=None,
14
progress=None,
15
):
16
super().__init__()
17
self.name = name
18
self.is_folder = is_folder
19
self.is_file = is_file
20
21
if parent is not None:
22
self.parent = parent
23
if size is not None:
24
self.fsize = size
25
if priority is not None:
26
self.priority = priority
27
if file_id is not None:
28
self.file_id = file_id
29
if progress is not None:
30
self.progress = progress
31
32
33
def qb_get_folders(path):
34
return path.split("/")
35
36
37
def get_folders(path, root_path):
38
fs = path.split(root_path)[-1]
39
return fs.split("/")
40
41
42
def make_tree(res, tool, root_path=""):
43
if tool == "qbittorrent":
44
parent = TorNode("QBITTORRENT")
45
folder_id = 0
46
for i in res:
47
folders = qb_get_folders(i.name)
48
if len(folders) > 1:
49
previous_node = parent
50
for j in range(len(folders) - 1):
51
current_node = next(
52
(k for k in previous_node.children if k.name == folders[j]),
53
None,
54
)
55
if current_node is None:
56
previous_node = TorNode(
57
folders[j],
58
is_folder=True,
59
parent=previous_node,
60
file_id=folder_id,
61
)
62
folder_id += 1
63
else:
64
previous_node = current_node
65
TorNode(
66
folders[-1],
67
is_file=True,
68
parent=previous_node,
69
size=i.size,
70
priority=i.priority,
71
file_id=i.index,
72
progress=round(i.progress * 100, 5),
73
)
74
else:
75
TorNode(
76
folders[-1],
77
is_file=True,
78
parent=parent,
79
size=i.size,
80
priority=i.priority,
81
file_id=i.index,
82
progress=round(i.progress * 100, 5),
83
)
84
elif tool == "aria2":
85
parent = TorNode("ARIA2")
86
folder_id = 0
87
for i in res:
88
folders = get_folders(i["path"], root_path)
89
priority = 1
90
if i["selected"] == "false":
91
priority = 0
92
if len(folders) > 1:
93
previous_node = parent
94
for j in range(len(folders) - 1):
95
current_node = next(
96
(k for k in previous_node.children if k.name == folders[j]),
97
None,
98
)
99
if current_node is None:
100
previous_node = TorNode(
101
folders[j],
102
is_folder=True,
103
parent=previous_node,
104
file_id=folder_id,
105
)
106
folder_id += 1
107
else:
108
previous_node = current_node
109
try:
110
progress = round(
111
(int(i["completedLength"]) / int(i["length"])) * 100, 5
112
)
113
except:
114
progress = 0
115
TorNode(
116
folders[-1],
117
is_file=True,
118
parent=previous_node,
119
size=int(i["length"]),
120
priority=priority,
121
file_id=i["index"],
122
progress=progress,
123
)
124
else:
125
try:
126
progress = round(
127
(int(i["completedLength"]) / int(i["length"])) * 100, 5
128
)
129
except:
130
progress = 0
131
TorNode(
132
folders[-1],
133
is_file=True,
134
parent=parent,
135
size=int(i["length"]),
136
priority=priority,
137
file_id=i["index"],
138
progress=progress,
139
)
140
else:
141
parent = TorNode("SABNZBD+")
142
priority = 1
143
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
result = create_list(parent)
158
return {"files": result, "engine": tool}
159
160
161
"""
162
def print_tree(parent):
163
for pre, _, node in RenderTree(parent):
164
treestr = u"%s%s" % (pre, node.name)
165
print(treestr.ljust(8), node.is_folder, node.is_file)
166
"""
167
168
169
def create_list(parent, contents=None):
170
if contents is None:
171
contents = []
172
for i in parent.children:
173
if i.is_folder:
174
children = []
175
create_list(i, children)
176
contents.append(
177
{
178
"id": f"folderNode_{i.file_id}",
179
"name": i.name,
180
"type": "folder",
181
"children": children,
182
}
183
)
184
else:
185
contents.append(
186
{
187
"id": i.file_id,
188
"name": i.name,
189
"size": i.fsize,
190
"type": "file",
191
"selected": bool(i.priority),
192
"progress": i.progress,
193
}
194
)
195
return contents
196
197
198
def extract_file_ids(data):
199
selected_files = []
200
unselected_files = []
201
for item in data:
202
if item.get("type") == "file":
203
if item.get("selected"):
204
selected_files.append(str(item["id"]))
205
else:
206
unselected_files.append(str(item["id"]))
207
if item.get("children"):
208
child_selected, child_unselected = extract_file_ids(item["children"])
209
selected_files.extend(child_selected)
210
unselected_files.extend(child_unselected)
211
return selected_files, unselected_files
212
213