From 3b5769acc0221c4e97ddc4cee831a87002e1c61b Mon Sep 17 00:00:00 2001 From: Ivan Habunek Date: Mon, 11 May 2020 12:54:35 +0200 Subject: [PATCH] Use authorized get to fetch public and tag timelines Some servers require authorization for viewing "public" timelines, and since currently toot always requires auth for this it's not required to support anon access to timelines. fixes #168 --- CHANGELOG.md | 5 +++++ changelog.yaml | 5 +++++ toot/api.py | 36 ++++++++++++++++++++++++------------ toot/commands.py | 6 ++---- toot/tui/app.py | 4 ++-- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59c7e3d..a7dd71d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ Changelog +**0.27.0 (TBD)** + +* Fix access to public and tag timelines when on private mastodon instances + (#168) + **0.26.0 (2020-04-15)** * Fix datetime parsing on Python 3.5 (#162) diff --git a/changelog.yaml b/changelog.yaml index 7ac8356..5a20fc1 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -1,3 +1,8 @@ +0.27.0: + date: "TBD" + changes: + - "Fix access to public and tag timelines when on private mastodon instances (#168)" + 0.26.0: date: 2020-04-15 changes: diff --git a/toot/api.py b/toot/api.py index 68477ce..0a528cb 100644 --- a/toot/api.py +++ b/toot/api.py @@ -173,6 +173,28 @@ def _timeline_generator(app, user, path, params=None): path = _get_next_path(response.headers) +def home_timeline_generator(app, user, limit=20): + path = '/api/v1/timelines/home?limit={}'.format(limit) + return _timeline_generator(app, user, path) + + +def public_timeline_generator(app, user, local=False, limit=20): + path = '/api/v1/timelines/public' + params = {'local': str_bool(local), 'limit': limit} + return _timeline_generator(app, user, path, params) + + +def tag_timeline_generator(app, user, hashtag, local=False, limit=20): + path = '/api/v1/timelines/tag/{}'.format(quote(hashtag)) + params = {'local': str_bool(local), 'limit': limit} + return _timeline_generator(app, user, path, params) + + +def timeline_list_generator(app, user, list_id, limit=20): + path = '/api/v1/timelines/list/{}'.format(list_id) + return _timeline_generator(app, user, path, {'limit': limit}) + + def _anon_timeline_generator(instance, path, params=None): while path: url = "https://{}{}".format(instance, path) @@ -181,28 +203,18 @@ def _anon_timeline_generator(instance, path, params=None): path = _get_next_path(response.headers) -def home_timeline_generator(app, user, limit=20): - path = '/api/v1/timelines/home?limit={}'.format(limit) - return _timeline_generator(app, user, path) - - -def public_timeline_generator(instance, local=False, limit=20): +def anon_public_timeline_generator(instance, local=False, limit=20): path = '/api/v1/timelines/public' params = {'local': str_bool(local), 'limit': limit} return _anon_timeline_generator(instance, path, params) -def tag_timeline_generator(instance, hashtag, local=False, limit=20): +def anon_tag_timeline_generator(instance, hashtag, local=False, limit=20): path = '/api/v1/timelines/tag/{}'.format(quote(hashtag)) params = {'local': str_bool(local), 'limit': limit} return _anon_timeline_generator(instance, path, params) -def timeline_list_generator(app, user, list_id, limit=20): - path = '/api/v1/timelines/list/{}'.format(list_id) - return _timeline_generator(app, user, path, {'limit': limit}) - - def upload_media(app, user, file): return http.post(app, user, '/api/v1/media', files={ 'file': file diff --git a/toot/commands.py b/toot/commands.py index b680e1b..ac8d1ce 100644 --- a/toot/commands.py +++ b/toot/commands.py @@ -22,11 +22,9 @@ def get_timeline_generator(app, user, args): raise ConsoleError("The --instance option is only valid alongside --public or --tag.") if args.public: - instance = args.instance or app.instance - return api.public_timeline_generator(instance, local=args.local, limit=args.count) + return api.public_timeline_generator(app, user, local=args.local, limit=args.count) elif args.tag: - instance = args.instance or app.instance - return api.tag_timeline_generator(instance, args.tag, local=args.local, limit=args.count) + return api.tag_timeline_generator(app, user, args.tag, local=args.local, limit=args.count) elif args.list: return api.timeline_list_generator(app, user, args.list, limit=args.count) else: diff --git a/toot/tui/app.py b/toot/tui/app.py index bc933a4..ee9c14e 100644 --- a/toot/tui/app.py +++ b/toot/tui/app.py @@ -358,13 +358,13 @@ class TUI(urwid.Frame): def goto_public_timeline(self, local): self.timeline_generator = api.public_timeline_generator( - self.app.instance, local=local, limit=40) + self.app, self.user, local=local, limit=40) promise = self.async_load_timeline(is_initial=True, timeline_name="public") promise.add_done_callback(lambda *args: self.close_overlay()) def goto_tag_timeline(self, tag, local): self.timeline_generator = api.tag_timeline_generator( - self.app.instance, tag, local=local, limit=40) + self.app, self.user, tag, local=local, limit=40) promise = self.async_load_timeline(is_initial=True, timeline_name="#{}".format(tag)) promise.add_done_callback(lambda *args: self.close_overlay())