X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=fba%2Fnetworks%2Fpeertube.py;h=caf38653dc61e2edb4b0f20f0ff2705861086ac7;hb=6d9a882af7f49fd8038a19ad03a523b91b8e49e5;hp=5eb794632a1e8fb3d0a5000758fc5d986119b68f;hpb=96f9cee8f4bdd14be4e0f58636a9d8980c880293;p=fba.git diff --git a/fba/networks/peertube.py b/fba/networks/peertube.py index 5eb7946..caf3865 100644 --- a/fba/networks/peertube.py +++ b/fba/networks/peertube.py @@ -14,65 +14,94 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from fba import config -from fba import csrf -from fba import instances -from fba import network +import logging + +from fba.helpers import blacklist +from fba.helpers import config +from fba.helpers import domain as domain_helper + +from fba.http import csrf +from fba.http import network + +from fba.models import instances + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) def fetch_peers(domain: str) -> list: - print(f"DEBUG: domain({len(domain)})={domain},software='peertube' - CALLED!") - if not isinstance(domain, str): - raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") - elif domain == "": - raise ValueError("Parameter 'domain' is empty") + logger.debug("domain='%s' - CALLED!", domain) + domain_helper.raise_on(domain) - print(f"DEBUG: domain='{domain}' is a PeerTube, fetching JSON ...") + if blacklist.is_blacklisted(domain): + raise Exception(f"domain='{domain}' is blacklisted but function is invoked.") + elif not instances.is_registered(domain): + raise Exception(f"domain='{domain}' is not registered but function is invoked.") + + # Init variables peers = list() - start = 0 headers = tuple() + start = 0 - print(f"DEBUG: Checking CSRF for domain='{domain}'") try: - headers = csrf.determine(domain, dict()) + logger.debug("Checking CSRF for domain='%s'", domain) + headers = csrf.determine(domain, dict()) except network.exceptions as exception: - print(f"WARNING: Exception '{type(exception)}' during checking CSRF - EXIT!") - return + logger.warning("Exception '%s' during checking CSRF (fetch_peers,%s)", type(exception), __name__) + instances.set_last_error(domain, exception) + + logger.debug("Returning empty list ... - EXIT!") + return list() for mode in ["followers", "following"]: - print(f"DEBUG: domain='{domain}',mode='{mode}'") + logger.debug("domain='%s',mode='%s'", domain, mode) while True: data = network.get_json_api( domain, - "/api/v1/server/{mode}?start={start}&count=100", + f"/api/v1/server/{mode}?start={start}&count=100", headers, (config.get("connection_timeout"), config.get("read_timeout")) ) - print(f"DEBUG: data['{type(data)}']='{data}'") - if "error_message" not in data: - print("DEBUG: Success, data[json]:", len(data["json"])) - if "data" in data["json"]: - print(f"DEBUG: Found {len(data['data'])} record(s).") - for record in data["json"]["data"]: - print(f"DEBUG: record()={len(record)}") - if mode in record and "host" in record[mode]: - print(f"DEBUG: Found host={record[mode]['host']}, adding ...") - peers.append(record[mode]["host"]) - else: - print(f"WARNING: record from '{domain}' has no '{mode}' or 'host' record: {record}") - - if len(data["json"]["data"]) < 100: - print("DEBUG: Reached end of JSON response:", domain) - break + logger.debug("data[]='%s'", type(data)) + if "error_message" in data: + logger.warning("domain='%s' causes error during API query: '%s' - SKIPPED!", domain, data["error_message"]) + break + elif "data" not in data["json"]: + logger.warning("domain='%s' has no 'data' element returned - SKIPPED!", domain) + break + else: + logger.debug("Success, data[json]()=%d", len(data["json"])) + instances.set_success(domain) - # Continue with next row - start = start + 100 + rows = data["json"]["data"] + + logger.debug("Found %d record(s).", len(rows)) + for record in rows: + logger.debug("record()=%d", len(record)) + for mode2 in ["follower", "following"]: + logger.debug("mode=%s,mode2='%s'", mode, mode2) + if mode2 not in record: + logger.debug("Array record does not contain element mode2='%s' - SKIPPED", mode2) + continue + elif "host" not in record[mode2]: + logger.debug("record[%s] does not contain element 'host' - SKIPPED", mode2) + continue + elif record[mode2]["host"] == domain: + logger.debug("record[%s]='%s' matches domain='%s' - SKIPPED!", mode2, record[mode2]["host"], domain) + continue + elif not domain_helper.is_wanted(record[mode2]["host"]): + logger.debug("record[%s][host]='%s' is not wanted - SKIPPED!", mode2, record[mode2]["host"]) + continue - print(f"DEBUG: Adding '{len(peers)}' for domain='{domain}'") - instances.set_data("total_peers", domain, len(peers)) + logger.debug("Appending mode2='%s',host='%s' ...", mode2, record[mode2]["host"]) + peers.append(record[mode2]["host"]) - print(f"DEBUG: Updating last_instance_fetch for domain='{domain}' ...") - instances.update_last_instance_fetch(domain) + if len(rows) < 100: + logger.debug("Reached end of JSON response, domain='%s'", domain) + break + + # Continue with next row + start = start + 100 - print("DEBUG: Returning peers[]:", type(peers)) + logger.debug("peers[%s]()=%d - EXIT!", type(peers), len(peers)) return peers