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