Skip to content

Commit 74b1e04

Browse files
Brandon Davisnetromdk
Brandon Davis
authored andcommitted
Add concurrent downloading of emoji files
1 parent d723c1a commit 74b1e04

File tree

1 file changed

+44
-24
lines changed

1 file changed

+44
-24
lines changed

slacker/commands/emoji/emoji_list_command.py

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,39 @@
22
import json
33
import requests
44

5+
from slacker.task import Task, execute_tasks
56
from slacker.commands.command import Command
67
from slacker.commands.argument_parser import ArgumentParser
78

9+
class EmojiDownloadTask(Task):
10+
def __init__(self, emoji_name, url, save_path):
11+
self.emoji_name = emoji_name
12+
self.__url = url
13+
self.save_path = save_path
14+
self.logs = []
15+
16+
def run(self):
17+
self.logs.append("Downloading {}".format(self.__url))
18+
19+
res = requests.get(self.__url, stream=True)
20+
if res.status_code != 200:
21+
self.logs.append("Unable to download {}: {}".format(self.emoji_name, self.__url))
22+
return False
23+
24+
image_type = res.headers["Content-Type"].split("/")[1]
25+
content_length = res.headers["Content-Length"]
26+
27+
emoji_file = "{}.{}".format(self.emoji_name, image_type)
28+
self.save_path = os.path.join(self.save_path, emoji_file)
29+
30+
self.logs.append("Writing to disk {}({}) -> {}".format(self.__url, content_length,
31+
self.save_path))
32+
with open(self.save_path, "wb") as f:
33+
for chunk in res.iter_content(1024):
34+
f.write(chunk)
35+
36+
return self
37+
838
class EmojiListCommand(Command):
939
def name(self):
1040
return "emoji.list"
@@ -29,45 +59,35 @@ def make_parser(self):
2959
def print_emojis(self, emojis):
3060
total = 0
3161
for emoji in emojis:
32-
print("{:<25} {:<50}".format(emoji, emojis[emoji]))
62+
self.logger.info("{:<25} {:<50}".format(emoji, emojis[emoji]))
3363
total += 1
3464

35-
print("{} custom emojis".format(total))
65+
self.logger.info("{} custom emojis".format(total))
3666

3767
def __download_emojis(self, emojis):
3868
save_data = {}
69+
download_tasks = []
3970

4071
for emoji in emojis:
4172
emoji_url = emojis[emoji]
4273
if emoji_url.startswith("alias"):
4374
save_data[emoji] = emoji_url
4475
continue
4576

46-
saved_file_path = self.__download_emoji(emoji, emojis[emoji])
47-
save_data[emoji] = saved_file_path
77+
# queue the downloads
78+
task = EmojiDownloadTask(emoji, emoji_url, self.local_save_path)
79+
download_tasks.append(task)
4880

49-
self.__write_save_file(save_data)
50-
51-
def __download_emoji(self, emoji_name, url):
52-
self.logger.debug("Downloading {}".format(url))
53-
54-
res = requests.get(url, stream=True)
55-
if res.status_code != 200:
56-
self.logger.warning("Unable to download {}: {}".format(emoji_name, url))
81+
# Start the downloads
82+
results = execute_tasks(download_tasks)
83+
for r in results:
84+
if r:
85+
for log in r.logs:
86+
self.logger.info(log)
5787

58-
image_type = res.headers["Content-Type"].split("/")[1]
59-
content_length = res.headers["Content-Length"]
88+
save_data[r.emoji_name] = r.save_path
6089

61-
emoji_file = "{}.{}".format(emoji_name, image_type)
62-
local_save_path = os.path.join(self.local_save_path, emoji_file)
63-
64-
self.logger.debug("Writing to disk {}({}) -> {}".format(url, content_length,
65-
self.local_save_path))
66-
with open(local_save_path, "wb") as f:
67-
for chunk in res.iter_content(1024):
68-
f.write(chunk)
69-
70-
return local_save_path
90+
self.__write_save_file(save_data)
7191

7292
def __write_save_file(self, save_data):
7393
with open(self.save_data_file, "w") as f:

0 commit comments

Comments
 (0)