social media crossposting tool. 3rd time's the charm
mastodon
misskey
crossposting
bluesky
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