Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
1import json
2import re
3import os
4
5
6def queryFile(file_path, filter_path, filter_key=None, filter_val=None):
7 back = []
8 data = json.load(open(file_path))
9 if filter_path == ['']:
10 return [data]
11 for key in filter_path: # Get to the point
12 data = data.get(key)
13 if not data:
14 return
15
16 if type(data) == list:
17 for row in data:
18 if filter_val: # Filter by value
19 if row[filter_key] == filter_val:
20 back.append(row)
21 else:
22 back.append(row)
23 else:
24 back.append({"value": data})
25
26 return back
27
28
29# Find in json files
30# Return: [{u'body': u'Hello Topic 1!!', 'inner_path': '1KRxE1...beEp6', u'added': 1422740732, u'message_id': 1},...]
31def query(path_pattern, filter):
32 if "=" in filter: # Filter by value
33 filter_path, filter_val = filter.split("=")
34 filter_path = filter_path.split(".")
35 filter_key = filter_path.pop() # Last element is the key
36 filter_val = int(filter_val)
37 else: # No filter
38 filter_path = filter
39 filter_path = filter_path.split(".")
40 filter_key = None
41 filter_val = None
42
43 if "/*/" in path_pattern: # Wildcard search
44 root_dir, file_pattern = path_pattern.replace("\\", "/").split("/*/")
45 else: # No wildcard
46 root_dir, file_pattern = re.match("(.*)/(.*?)$", path_pattern.replace("\\", "/")).groups()
47 for root, dirs, files in os.walk(root_dir, topdown=False):
48 root = root.replace("\\", "/")
49 inner_path = root.replace(root_dir, "").strip("/")
50 for file_name in files:
51 if file_pattern != file_name:
52 continue
53
54 try:
55 res = queryFile(root + "/" + file_name, filter_path, filter_key, filter_val)
56 if not res:
57 continue
58 except Exception: # Json load error
59 continue
60 for row in res:
61 row["inner_path"] = inner_path
62 yield row
63
64
65if __name__ == "__main__":
66 for row in list(query("../../data/12Hw8rTgzrNo4DSh2AkqwPRqDyTticwJyH/data/users/*/data.json", "")):
67 print(row)