diff --git a/toot/commands.py b/toot/commands.py
index 8ded3cb..a486c39 100644
--- a/toot/commands.py
+++ b/toot/commands.py
@@ -76,41 +76,20 @@ def thread(app, user, args):
def post(app, user, args):
- # TODO: this might be achievable, explore options
if args.editor and not sys.stdin.isatty():
raise ConsoleError("Cannot run editor if not in tty.")
if args.media and len(args.media) > 4:
raise ConsoleError("Cannot attach more than 4 files.")
- # Read any text that might be piped to stdin
- if not args.text and not sys.stdin.isatty():
- args.text = sys.stdin.read().rstrip()
+ media_ids = _upload_media(app, user, args)
+ status_text = _get_status_text(args.text, args.editor)
- # Match media to corresponding description and upload
- media = args.media or []
- descriptions = args.description or []
- uploaded_media = []
-
- for idx, file in enumerate(media):
- description = descriptions[idx].strip() if idx < len(descriptions) else None
- result = _do_upload(app, user, file, description)
- uploaded_media.append(result)
-
- media_ids = [m["id"] for m in uploaded_media]
-
- if sys.stdin.isatty():
- if args.editor:
- args.text = editor_input(args.editor, args.text)
- elif not args.text:
- print_out("Write or paste your toot. Press {} to post it.".format(EOF_KEY))
- args.text = multiline_input()
-
- if not args.text and not uploaded_media:
+ if not status_text and not media_ids:
raise ConsoleError("You must specify either text or media to post.")
response = api.post_status(
- app, user, args.text,
+ app, user, status_text,
visibility=args.visibility,
media_ids=media_ids,
sensitive=args.sensitive,
@@ -127,6 +106,36 @@ def post(app, user, args):
print_out("Toot posted: {}".format(response.get('url')))
+def _get_status_text(text, editor):
+ isatty = sys.stdin.isatty()
+
+ if not text and not isatty:
+ text = sys.stdin.read().rstrip()
+
+ if isatty:
+ if editor:
+ text = editor_input(editor, text)
+ elif not text:
+ print_out("Write or paste your toot. Press {} to post it.".format(EOF_KEY))
+ text = multiline_input()
+
+ return text
+
+
+def _upload_media(app, user, args):
+ # Match media to corresponding description and upload
+ media = args.media or []
+ descriptions = args.description or []
+ uploaded_media = []
+
+ for idx, file in enumerate(media):
+ description = descriptions[idx].strip() if idx < len(descriptions) else None
+ result = _do_upload(app, user, file, description)
+ uploaded_media.append(result)
+
+ return [m["id"] for m in uploaded_media]
+
+
def delete(app, user, args):
api.delete_status(app, user, args.status_id)
print_out("✓ Status deleted")