diff --git a/docs/supportedsites.md b/docs/supportedsites.md
index d9f3c372..a6ddb0e1 100644
--- a/docs/supportedsites.md
+++ b/docs/supportedsites.md
@@ -676,7 +676,7 @@ Consider all sites to be NSFW unless otherwise known.
| Twitter |
https://twitter.com/ |
- Bookmarks, Likes, Lists, List Members, Media Timelines, Search Results, Timelines, Tweets |
+ Bookmarks, individual Images, Likes, Lists, List Members, Media Timelines, Search Results, Timelines, Tweets |
Supported |
diff --git a/gallery_dl/extractor/twitter.py b/gallery_dl/extractor/twitter.py
index 291c1893..792f1612 100644
--- a/gallery_dl/extractor/twitter.py
+++ b/gallery_dl/extractor/twitter.py
@@ -499,6 +499,34 @@ class TwitterTweetExtractor(TwitterExtractor):
return TwitterAPI(self).tweet(self.tweet_id)
+class TwitterImageExtractor(Extractor):
+ category = "twitter"
+ subcategory = "image"
+ pattern = r"https?://pbs\.twimg\.com/media/([\w-]+)(?:\?format=|\.)(\w+)"
+ test = (
+ ("https://pbs.twimg.com/media/EqcpviCVoAAG-QG?format=jpg%name=orig"),
+ ("https://pbs.twimg.com/media/EqcpviCVoAAG-QG.jpg:orig"),
+ )
+
+ def __init__(self, match):
+ Extractor.__init__(self, match)
+ self.id, self.fmt = match.groups()
+
+ def items(self):
+ base = "https://pbs.twimg.com/media/" + self.id
+ url = base + "." + self.fmt
+ base += "?format=" + self.fmt + "&name="
+
+ data = {
+ "filename": self.id,
+ "extension": self.fmt,
+ "_fallback": TwitterExtractor._image_fallback(base, url),
+ }
+
+ yield Message.Directory, data
+ yield Message.Url, base + "orig", data
+
+
class TwitterAPI():
def __init__(self, extractor):