Skip to content

Commit

Permalink
[twitter] support communities (#4913)
Browse files Browse the repository at this point in the history
  • Loading branch information
mikf committed Feb 13, 2024
1 parent 8f27f43 commit f7f8ef8
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 2 deletions.
2 changes: 1 addition & 1 deletion docs/supportedsites.md
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ Consider all listed sites to potentially be NSFW.
<tr>
<td>Twitter</td>
<td>https://twitter.com/</td>
<td>Avatars, Backgrounds, Bookmarks, Events, Followed Users, Hashtags, individual Images, Likes, Lists, List Members, Media Timelines, Search Results, Timelines, Tweets, User Profiles</td>
<td>Avatars, Backgrounds, Bookmarks, Communities, Events, Followed Users, Hashtags, individual Images, Likes, Lists, List Members, Media Timelines, Search Results, Timelines, Tweets, User Profiles</td>
<td>Supported</td>
</tr>
<tr>
Expand Down
62 changes: 61 additions & 1 deletion gallery_dl/extractor/twitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -693,6 +693,28 @@ def items(self):
yield Message.Queue, url, data


class TwitterCommunityExtractor(TwitterExtractor):
"""Extractor for a Twitter community"""
subcategory = "community"
pattern = BASE_PATTERN + r"/i/communities/(\d+)"
example = "https://twitter.com/i/communities/12345"

def tweets(self):
if self.textonly:
return self.api.community_tweets_timeline(self.user)
return self.api.community_media_timeline(self.user)


class TwitterCommunitiesExtractor(TwitterExtractor):
"""Extractor for followed Twitter communities"""
subcategory = "communities"
pattern = BASE_PATTERN + r"/([^/?#]+)/communities/?$"
example = "https://twitter.com/i/communities"

def tweets(self):
return self.api.communities_main_page_timeline(self.user)


class TwitterEventExtractor(TwitterExtractor):
"""Extractor for Tweets from a Twitter Event"""
subcategory = "event"
Expand Down Expand Up @@ -1100,6 +1122,43 @@ def search_timeline(self, query):
endpoint, variables,
("search_by_raw_query", "search_timeline", "timeline"))

def community_tweets_timeline(self, community_id):
endpoint = "/graphql/7B2AdxSuC-Er8qUr3Plm_w/CommunityTweetsTimeline"
variables = {
"communityId": community_id,
"count": 100,
"displayLocation": "Community",
"rankingMode": "Recency",
"withCommunity": True,
}
return self._pagination_tweets(
endpoint, variables,
("communityResults", "result", "ranked_community_timeline",
"timeline"))

def community_media_timeline(self, community_id):
endpoint = "/graphql/qAGUldfcIoMv5KyAyVLYog/CommunityMediaTimeline"
variables = {
"communityId": community_id,
"count": 100,
"withCommunity": True,
}
return self._pagination_tweets(
endpoint, variables,
("communityResults", "result", "community_media_timeline",
"timeline"))

def communities_main_page_timeline(self, screen_name):
endpoint = ("/graphql/GtOhw2mstITBepTRppL6Uw"
"/CommunitiesMainPageTimeline")
variables = {
"count": 100,
"withCommunity": True,
}
return self._pagination_tweets(
endpoint, variables,
("viewer", "communities_timeline", "timeline"))

def live_event_timeline(self, event_id):
endpoint = "/2/live_event/timeline/{}.json".format(event_id)
params = self.params.copy()
Expand Down Expand Up @@ -1433,7 +1492,8 @@ def _pagination_tweets(self, endpoint, variables,

if esw("tweet-"):
tweets.append(entry)
elif esw("profile-grid-"):
elif esw(("profile-grid-",
"communities-grid-")):
if "content" in entry:
tweets.extend(entry["content"]["items"])
else:
Expand Down
1 change: 1 addition & 0 deletions scripts/supportedsites.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@
"media": "Media Timelines",
"tweets": "",
"replies": "",
"community": "",
"list-members": "List Members",
},
"vk": {
Expand Down
16 changes: 16 additions & 0 deletions test/results/twitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,22 @@
"#count" : ">=1",
},

{
"#url" : "https://twitter.com/i/communities",
"#category": ("", "twitter", "communities"),
"#class" : twitter.TwitterCommunitiesExtractor,
"#range" : "1-20",
"#count" : 20,
},

{
"#url" : "https://twitter.com/i/communities/1651515740753735697",
"#category": ("", "twitter", "community"),
"#class" : twitter.TwitterCommunityExtractor,
"#range" : "1-20",
"#count" : 20,
},

{
"#url" : "https://twitter.com/supernaturepics/status/604341487988576256",
"#comment" : "all Tweets from a 'conversation' (#1319)",
Expand Down

0 comments on commit f7f8ef8

Please sign in to comment.