social media crossposting tool. 3rd time's the charm
mastodon misskey crossposting bluesky
1import logging, sys, os 2import json 3 4logging.basicConfig(stream=sys.stdout, level=logging.INFO) 5LOGGER = logging.getLogger("XPost") 6 7def as_json(obj, indent=None,sort_keys=False) -> str: 8 return json.dumps( 9 obj.__dict__ if not isinstance(obj, dict) else obj, 10 default=lambda o: o.__json__() if hasattr(o, '__json__') else o.__dict__, 11 indent=indent, 12 sort_keys=sort_keys) 13 14def canonical_label(label: str | None, href: str): 15 if not label or label == href: 16 return True 17 18 split = href.split('://', 1) 19 if len(split) > 1: 20 if split[1] == label: 21 return True 22 23 return False 24 25def safe_get(obj: dict, key: str, default): 26 val = obj.get(key, default) 27 return val if val else default 28 29def as_envvar(text: str | None) -> str | None: 30 if not text: 31 return None 32 33 if text.startswith('env:'): 34 return os.environ.get(text[4:], '') 35 36 return text