diff --git a/toot/__init__.py b/toot/__init__.py index 06ef87f..b2e1772 100644 --- a/toot/__init__.py +++ b/toot/__init__.py @@ -19,11 +19,11 @@ def _get(app, user, url, params=None): return response.json() -def _post(app, user, url, data=None): +def _post(app, user, url, data=None, files=None): url = app.base_url + url headers = {"Authorization": "Bearer " + user.access_token} - response = requests.post(url, data, headers=headers) + response = requests.post(url, data, files=files, headers=headers) response.raise_for_status() return response.json() @@ -76,3 +76,9 @@ def post_status(app, user, status): def timeline_home(app, user): return _get(app, user, '/api/v1/timelines/home') + + +def upload_media(app, user, file): + return _post(app, user, '/api/v1/media', files={ + 'file': file + }) diff --git a/toot/console.py b/toot/console.py index e50aeed..35cb912 100644 --- a/toot/console.py +++ b/toot/console.py @@ -1,3 +1,5 @@ +from __future__ import print_function + import os import sys import logging @@ -11,19 +13,27 @@ from textwrap import TextWrapper from future.moves.itertools import zip_longest from .config import save_user, load_user, load_app, save_app, CONFIG_APP_FILE, CONFIG_USER_FILE -from . import create_app, login, post_status, timeline_home, DEFAULT_INSTANCE +from . import create_app, login, post_status, timeline_home, upload_media, DEFAULT_INSTANCE class ConsoleError(Exception): pass -def green(text): - return "\033[92m{}\033[0m".format(text) - - def red(text): - return "\033[91m{}\033[0m".format(text) + return "\033[31m{}\033[0m".format(text) + + +def green(text): + return "\033[32m{}\033[0m".format(text) + + +def yellow(text): + return "\033[33m{}\033[0m".format(text) + + +def print_error(text): + print(red(text), file=sys.stderr) def create_app_interactive(): @@ -152,6 +162,28 @@ def cmd_logout(app, user): print("You are now logged out") +def cmd_upload(app, user): + if len(sys.argv) < 3: + print_error("No status text given") + return + + path = sys.argv[2] + + if not os.path.exists(path): + print_error("File does not exist: " + path) + return + + with open(path, 'rb') as f: + print("Uploading {} ...".format(green(f.name))) + response = upload_media(app, user, f) + + print("\nSuccessfully uploaded media ID {}, type '{}'".format( + yellow(response['id']), yellow(response['type']))) + print("Original URL: " + green(response['url'])) + print("Preview URL: " + green(response['preview_url'])) + print("Text URL: " + green(response['text_url'])) + + def run_command(command): app = load_app() user = load_user() @@ -178,6 +210,9 @@ def run_command(command): if command == 'timeline': return cmd_timeline(app, user) + if command == 'upload': + return cmd_upload(app, user) + print(red("Unknown command '{}'\n".format(command))) print_usage() @@ -194,4 +229,4 @@ def main(): try: run_command(command) except ConsoleError as e: - print(red(str(e))) + print_error(str(e))