Bulk slack emoji downloader
Parametrization
DOWNLOAD_DIR is being used as a default for a command-line argument. This is surprising, since at first glance one would assume that this global constant is simply being used as the download directory value itself. It's less clutter and more obvious if you simply remove this global and write the string literal beside the default kwarg.
More pathlib
You're already using it, but you can benefit from it more. Rather than making a Path() here:
path = Path(parent / filename)


Use urllib.parse.urlparse to get you a ParseResult with a path component, since it's a more thorough and safe parsing method than bare split and you only care about path

Call path.rsplit('/', 1)[-1] - not split - on the path component to get the filename-like

Make a Path from the result

If you deeply care about image-likes, then check mypath.suffix for .png, etc.

Use / as you are now.


Set membership
if suffix in (&quot;png&quot;, &quot;jpg&quot;, &quot;gif&quot;, &quot;jpeg&quot;):

should use a set for speed, and also because it more closely matches your meaning. Also, pathlib will need leading dots:
if suffix in {'.png', '.jpg', '.gif', '.jpeg'}:

Noisy failure
if not path.is_dir():
    return

does not help the user understand why the script quit with no message. Raise some kind of error here.
Fail-safe list construction
The first part of this expression:
[emoji.get(&quot;name&quot;), *emoji.get(&quot;aliases&quot;, [])]

will not do what you want. If there is no 'name', a None will be inserted rather than nothing. A more &quot;naive&quot; approach that will actually work is:
names = emoji.get('aliases', [])
name = emoji.get('name')
if name is not None:
    names.append(name)

Order probably doesn't matter to you since you had been kicking off threads all at once.
Somewhat-related: is this -
src = emoji.get(&quot;src&quot;)

actually optional? I doubt it. Currently you require that it be an actual URL. Either use [] if you want this to keep being fatal, or:
src = emoji.get(&quot;src&quot;)
if src is not None:
    create_download_thread ...

List append of a comprehension
        threads += [create_download_thread(src, name, emoji_dir) for name in names]

creates a temporary list only to throw it away again once it's been appended. The following will use the generator but not materialize it to a temporary list:
threads.extend(create_download_thread(src, name, emoji_dir) for name in names)