diff --git a/docs/configuration.rst b/docs/configuration.rst index ec32e3b9..5624d1a5 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -2616,6 +2616,16 @@ Description user IDs. +extractor.[mastodon].cards +-------------------------- +Type + ``bool`` +Default + ``false`` +Description + Fetch media from cards. + + extractor.[mastodon].reblogs ---------------------------- Type diff --git a/gallery_dl/extractor/mastodon.py b/gallery_dl/extractor/mastodon.py index a021f00c..cb7f701c 100644 --- a/gallery_dl/extractor/mastodon.py +++ b/gallery_dl/extractor/mastodon.py @@ -29,6 +29,7 @@ class MastodonExtractor(BaseExtractor): self.instance = self.root.partition("://")[2] self.reblogs = self.config("reblogs", False) self.replies = self.config("replies", True) + self.cards = self.config("cards", False) def items(self): for status in self.statuses(): @@ -48,6 +49,17 @@ class MastodonExtractor(BaseExtractor): if status["reblog"]: attachments.extend(status["reblog"]["media_attachments"]) + if self.cards: + card = status.get("card") + if card: + url = card.get("image") + if url: + card["weburl"] = card.get("url") + card["url"] = url + card["id"] = "card" + "".join( + url.split("/")[6:-2]).lstrip("0") + attachments.append(card) + status["instance"] = self.instance acct = status["account"]["acct"] status["instance_remote"] = \ @@ -120,6 +132,7 @@ class MastodonUserExtractor(MastodonExtractor): api.account_id_by_username(self.item), only_media=( not self.reblogs and + not self.cards and not self.config("text-posts", False) ), exclude_replies=not self.replies, diff --git a/test/results/mastodonsocial.py b/test/results/mastodonsocial.py index aa4a7b8a..1eed8a24 100644 --- a/test/results/mastodonsocial.py +++ b/test/results/mastodonsocial.py @@ -164,4 +164,36 @@ __tests__ = ( "num" : int, }, +{ + "#url" : "https://mastodon.social/@technewsbot@assortedflotsam.com/112360601113258881", + "#comment" : "card image", + "#category": ("mastodon", "mastodon.social", "status"), + "#class" : mastodon.MastodonStatusExtractor, + "#options" : {"cards": True}, + "#urls" : "https://files.mastodon.social/cache/preview_cards/images/095/900/335/original/83f0b4a793c84123.jpg", + + "media": { + "author_name" : "Tom Warren", + "author_url" : "https://www.theverge.com/authors/tom-warren", + "blurhash" : "UHBDWMCjVGM0k,XjnPM#0h+vkpb^RkjYSh$*", + "description" : "Microsoft’s big Xbox games showcase will take place on June 9th. It will include more games than last year and a special Call of Duty Direct will follow.", + "embed_url" : "", + "height" : 628, + "html" : "", + "id" : "card95900335", + "image" : "https://files.mastodon.social/cache/preview_cards/images/095/900/335/original/83f0b4a793c84123.jpg", + "image_description": "The Xbox showcase illustration", + "language" : "en", + "provider_name": "The Verge", + "provider_url": "", + "published_at": "2024-04-30T14:15:30.341Z", + "title" : "The Xbox games showcase airs June 9th, followed by a Call of Duty Direct", + "type" : "link", + "url" : "https://files.mastodon.social/cache/preview_cards/images/095/900/335/original/83f0b4a793c84123.jpg", + "weburl" : "https://www.theverge.com/2024/4/30/24145262/xbox-games-showcase-summer-2024-call-of-duty-direct", + "width" : 1200, + }, + +}, + )