Skip to content

Commit 532ab71

Browse files
committed
[discord] add 'server-search' extractor
requested on Discord https://discord.com/channels/SERVER_ID/search?from=USER_ID
1 parent 690b3ba commit 532ab71

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

docs/supportedsites.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ Consider all listed sites to potentially be NSFW.
268268
<tr id="discord" title="discord">
269269
<td>Discord</td>
270270
<td>https://discord.com/</td>
271-
<td>Channels, DMs, Messages, Servers, Server Assets</td>
271+
<td>Channels, DMs, Messages, Servers, Server Assets, Server Searches</td>
272272
<td></td>
273273
</tr>
274274
<tr id="dynastyscans" title="dynastyscans">

gallery_dl/extractor/discord.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,14 @@ def extract_message(self, message):
126126
message_metadata_file.update(file)
127127
yield Message.Url, file["url"], message_metadata_file
128128

129+
def extract_search(self, server_id, params):
130+
for messages in self.api.get_search_messages(server_id, params):
131+
for message in messages:
132+
if message["channel_id"] not in self.server_channels_metadata:
133+
self.parse_channel(self.api.get_channel(
134+
message["channel_id"]))
135+
yield from self.extract_message(message)
136+
129137
def extract_channel_text(self, channel_id):
130138
for message in self.api.get_channel_messages(channel_id):
131139
yield from self.extract_message(message)
@@ -312,6 +320,30 @@ def items(self):
312320
yield Message.Url, asset["url"], asset
313321

314322

323+
class DiscordServerSearchExtractor(DiscordExtractor):
324+
subcategory = "server-search"
325+
pattern = BASE_PATTERN + r"/channels/(\d+)/search/?\?([^#]+)"
326+
example = "https://discord.com/channels/1234567890/search?QUERY"
327+
328+
def items(self):
329+
server_id, query = self.groups
330+
server = self.api.get_server(server_id)
331+
self.kwdict.update(self.parse_server(server))
332+
333+
params = {
334+
**text.parse_query_list(query, {
335+
"from", "in", "has", "mentions", "author_id", "channel_id"}),
336+
"sort_by" : "timestamp",
337+
"sort_order": "desc",
338+
}
339+
if "from" in params:
340+
params["author_id"] = params.pop("from")
341+
if "in" in params:
342+
params["channel_id"] = params.pop("in")
343+
344+
return self.extract_search(server_id, params)
345+
346+
315347
class DiscordServerExtractor(DiscordExtractor):
316348
subcategory = "server"
317349
pattern = BASE_PATTERN + r"/channels/(\d+)/?$"
@@ -410,6 +442,17 @@ def _method(_):
410442

411443
return self._pagination(_method, MESSAGES_BATCH)
412444

445+
def get_search_messages(self, server_id, params):
446+
"""Get search messages"""
447+
MESSAGES_BATCH = 25
448+
449+
def _method(offset):
450+
params["offset"] = offset
451+
return self._call(url, params)["messages"]
452+
453+
url = f"/guilds/{server_id}/messages/search"
454+
return self._pagination(_method, MESSAGES_BATCH)
455+
413456
def get_message(self, channel_id, message_id):
414457
"""Get message information"""
415458
return self._call("/channels/" + channel_id + "/messages", {

test/results/discord.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,14 @@
107107
"url" : str,
108108
},
109109

110+
{
111+
"#url" : "https://discord.com/channels/1067148002722062416/search?from=429235270664060948",
112+
"#class" : discord.DiscordServerSearchExtractor,
113+
},
114+
115+
{
116+
"#url" : "https://discord.com/channels/1067148002722062416/search?has=file&has=link&mentions=429235270664060948",
117+
"#class" : discord.DiscordServerSearchExtractor,
118+
},
119+
110120
)

0 commit comments

Comments
 (0)