From 9377543162ee79d318eb1fb44b801a1cdd8affeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 25 Sep 2021 23:55:52 +0200 Subject: [PATCH] [mastodon] add 'following' extractor (#1891) --- gallery_dl/extractor/mastodon.py | 27 +++++++++++++++++++++++++++ test/test_results.py | 2 ++ 2 files changed, 29 insertions(+) diff --git a/gallery_dl/extractor/mastodon.py b/gallery_dl/extractor/mastodon.py index f9cd6a4a..cd7cabb9 100644 --- a/gallery_dl/extractor/mastodon.py +++ b/gallery_dl/extractor/mastodon.py @@ -115,6 +115,29 @@ class MastodonUserExtractor(MastodonExtractor): ) +class MastodonFollowingExtractor(MastodonExtractor): + """Extractor for followed mastodon users""" + subcategory = "following" + pattern = BASE_PATTERN + r"/users/([^/?#]+)/following" + test = ( + ("https://mastodon.social/users/0x4f/following", { + "extractor": False, + "count": ">= 20", + }), + ("https://mastodon.social/users/id:10843/following"), + ("https://pawoo.net/users/yoru_nine/following"), + ("https://baraag.net/users/pumpkinnsfw/following"), + ) + + def items(self): + api = MastodonAPI(self) + account_id = api.account_id_by_username(self.item) + + for account in api.account_following(account_id): + account["_extractor"] = MastodonUserExtractor + yield Message.Queue, account["url"], account + + class MastodonStatusExtractor(MastodonExtractor): """Extractor for images from a status""" subcategory = "status" @@ -170,6 +193,10 @@ class MastodonAPI(): return account["id"] raise exception.NotFoundError("account") + def account_following(self, account_id): + endpoint = "/v1/accounts/{}/following".format(account_id) + return self._pagination(endpoint, None) + def account_search(self, query, limit=40): """Search for accounts""" endpoint = "/v1/accounts/search" diff --git a/test/test_results.py b/test/test_results.py index 8a20e6bf..9515e091 100644 --- a/test/test_results.py +++ b/test/test_results.py @@ -91,6 +91,8 @@ class TestExtractorResults(unittest.TestCase): for url, kwdict in zip(tjob.url_list, tjob.kwdict_list): if "_extractor" in kwdict: extr = kwdict["_extractor"].from_url(url) + if extr is None and not result.get("extractor", True): + continue self.assertIsInstance(extr, kwdict["_extractor"]) self.assertEqual(extr.url, url) else: