@app.get(fba.config["base_url"] + "/api/info")
def info():
- fba.cursor.execute("SELECT (SELECT COUNT(domain) FROM instances), (SELECT COUNT(domain) FROM instances WHERE software IN ('pleroma', 'mastodon', 'misskey', 'gotosocial', 'friendica', 'bookwyrm', 'takahe')), (SELECT COUNT(blocker) FROM blocks), (SELECT COUNT(domain) FROM instances WHERE last_status_code IS NOT NULL)")
+ fba.cursor.execute("SELECT (SELECT COUNT(domain) FROM instances), (SELECT COUNT(domain) FROM instances WHERE software IN ('pleroma', 'mastodon', 'misskey', 'gotosocial', 'friendica', 'bookwyrm', 'takahe', 'peertube')), (SELECT COUNT(blocker) FROM blocks), (SELECT COUNT(domain) FROM instances WHERE last_status_code IS NOT NULL)")
known, indexed, blocks, errorous = fba.cursor.fetchone()
return {
def get_peers(domain: str, software: str) -> list:
# NOISY-DEBUG: print("DEBUG: Getting peers for domain:", domain, software)
- peers = None
+ peers = list()
if software == "lemmy":
- # NOISY-DEBUG: print(f"DEBUG: domain='{domain}' is Lemmy. fetching JSON ...")
+ # NOISY-DEBUG: print(f"DEBUG: domain='{domain}' is Lemmy, fetching JSON ...")
try:
res = reqto.get(f"https://{domain}/api/v3/site", headers=headers, timeout=(config["connection_timeout"], config["read_timeout"]))
+ # NOISY-DEBUG: print(f"DEBUG: res.ok={res.ok},res.json[]={type(res.json())}")
if res.ok and isinstance(res.json(), dict):
# NOISY-DEBUG: print("DEBUG: Success, res.json():", len(res.json()))
json = res.json()
# NOISY-DEBUG: print("DEBUG: Returning peers[]:", type(peers))
return peers
+ elif software == "peertube":
+ # NOISY-DEBUG: print(f"DEBUG: domain='{domain}' is a PeerTube, fetching JSON ...")
+ start = 0
+ while True:
+ try:
+ res = reqto.get(f"https://{domain}/api/v1/server/followers?start={start}&count=100", headers=headers, timeout=(config["connection_timeout"], config["read_timeout"]))
+
+ # NOISY-DEBUG: print(f"DEBUG: res.ok={res.ok},res.json[]={type(res.json())}")
+ if res.ok and isinstance(res.json(), dict):
+ # NOISY-DEBUG: uccess, res.json():", len(res.json()))
+ json = res.json()
+ if start == 0:
+ # NOISY-DEBUG: print(f"DEBUG: Setting get_peers_url for '{domain}' ...")
+ nodeinfos["get_peers_url"][domain] = f"https://{domain}/api/v1/server/followers?start={start}&count=100"
+
+ if "data" in json:
+ # NOISY-DEBUG: print(f"DEBUG: Found {len(json['data'])} record(s).")
+ for record in json["data"]:
+ # NOISY-DEBUG: print(f"DEBUG: record()={len(record)}")
+ if "follower" in record and "host" in record["follower"]:
+ # NOISY-DEBUG: print(f"DEBUG: Found host={record['follower']['host']}, adding ...")
+ peers.append(record["follower"]["host"])
+ else:
+ print(f"WARNING: record from '{domain}' has no 'follower' or 'host' record: {record}")
+
+ if len(json["data"]) < 100:
+ # NOISY-DEBUG: print("DEBUG: Reached end of JSON response:", domain)
+ break
+
+ # Continue with next row
+ start = start + 100
+
+ except BaseException as e:
+ print("WARNING: Exception during fetching JSON:", domain, e)
+
+ update_last_nodeinfo(domain)
+
+ # NOISY-DEBUG: print("DEBUG: Returning peers[]:", type(peers))
+ return peers
try:
- res = reqto.get(f"https://{domain}/api/v1/instance/peers", headers=headers, timeout=(config["connection_timeout"], config["read_timeout"]))
+ res = reqto.get(f"https://{domain}{get_peers_url}", headers=headers, timeout=(config["connection_timeout"], config["read_timeout"]))
if not res.ok or res.status_code >= 400:
res = reqto.get(f"https://{domain}/api/v3/site", headers=headers, timeout=(config["connection_timeout"], config["read_timeout"]))