From 0da15d9e68413afd740734724707f9aeb0da4e47 Mon Sep 17 00:00:00 2001 From: Federico Leva Date: Sat, 15 Jul 2023 20:03:04 +0300 Subject: [PATCH] Support bookmarking a status by URL Addresses issue #386 but not in every case. --- toot/api.py | 10 ++++++++++ toot/commands.py | 20 +++++++++++++++++--- toot/output.py | 11 ++++++++--- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/toot/api.py b/toot/api.py index f0857a9..a72b6a5 100644 --- a/toot/api.py +++ b/toot/api.py @@ -458,6 +458,16 @@ def search(app, user, query, resolve=False, type=None): }).json() +def search_url(app, user, query): + """ + Perform a search for a URL as is, without encoding. + https://docs.joinmastodon.org/methods/search/#v2 + """ + # The Request object performs form encoding if a dict is passed + return http.get(app, user, "/api/v2/search?q={}&resolve=true".format(query) + ).json() + + def follow(app, user, account): return _account_action(app, user, account, 'follow') diff --git a/toot/commands.py b/toot/commands.py index f74e3e6..671fb9c 100644 --- a/toot/commands.py +++ b/toot/commands.py @@ -242,8 +242,18 @@ def unpin(app, user, args): def bookmark(app, user, args): - api.bookmark(app, user, args.status_id) - print_out("✓ Status bookmarked") + if "://" in args.status_id: + print_out("Not a status ID but an URL was provided. Attempting to fetch a status ID.") + result = api.search_url(app, user, args.status_id) + if result.get("statuses"): + status_id = result.get("statuses")[0].get("id") + else: + print_out(f"Status not found for {args.status_id}") + return + else: + status_id = args.status_id + api.bookmark(app, user, status_id) + print_out(f"✓ Status {status_id} bookmarked") def unbookmark(app, user, args): @@ -366,7 +376,11 @@ def upload(app, user, args): def search(app, user, args): - response = api.search(app, user, args.query, args.resolve) + print_out(args.query) + if "://" in args.query: + response = api.search_url(app, user, args.query) + else: + response = api.search(app, user, args.query, args.resolve) print_search_results(response) diff --git a/toot/output.py b/toot/output.py index 6fd59a2..d7929d3 100644 --- a/toot/output.py +++ b/toot/output.py @@ -260,8 +260,9 @@ def print_list_accounts(accounts): def print_search_results(results): - accounts = results['accounts'] - hashtags = results['hashtags'] + accounts = results.get("accounts") + hashtags = results.get("hashtags") + statuses = results.get("results") if accounts: print_out("\nAccounts:") @@ -271,7 +272,11 @@ def print_search_results(results): print_out("\nHashtags:") print_out(", ".join([f"#{t['name']}" for t in hashtags])) - if not accounts and not hashtags: + if statuses: + print_out("\nStatuses:") + print_out(", ".join([f"#{t['id']}" for t in statuses])) + + if not accounts and not hashtags and not statuses: print_out("Nothing found")