Dimage
Downloads all media assets from JSON files generated by DiscordChatExporter.
⚙️ Features
- Parses
.jsonexport files from DiscordChatExporter. - Downloads guild icons, user avatars, mention avatars, reaction avatars, custom emojis (inline and in reactions), and message attachments.
- Organizes downloaded media into subdirectories named after the source channel or DM.
- Optionally categorizes media into folders (
icons,avatars,emojis,channels) using a command-line flag. - Sets local file modification timestamps to match the original Discord message timestamps.
- Skips duplicate URLs to avoid redundant downloads and improve performance.
- Offers fine-grained control over which asset types to download via command-line flags.
- Supports skipping downloads based on file extensions.
- Includes a mode to set timestamps on existing files without downloading.
⚠️ Disclaimers
- Default File Extension: If a file extension cannot be determined from the URL, the tool defaults to
.pngfor icons, avatars, and standard emojis. Animated emojis default to.gif. - Timestamp-Only Mode: The
--timestamp-onlymode assumes the file structure and naming have not been altered since the initial download. It relies on a processing order that may be unstable if files have been moved, renamed, or deleted. Use this feature only to refresh timestamps on an unmodified collection of downloaded files. - Testing: This software is tested manually. Automated testing of download functionality is not feasible because Discord media links expire after 24 hours.
🚀 Installation
From PyPI
pip install dimage
With pipx
pipx install dimage
With Conda
conda create -n dimage python=3.9 -y
conda activate dimage
pip install dimage
From Source
git clone https://github.com/Inc44/Dimage.git
cd Dimage
To install the package:
pip install .
To install only the dependencies:
pip install -r requirements.txt
If you install only the dependencies, run the program using python -m dimage.cli (or python -OO dimage/cli.py) instead of the dimage command.
🛠️ Build
pip install build
python -m build
📖 Usage Examples
Standard Download
Download all media, skipping duplicates and SVG files. Media will be organized into folders named after each channel. Assumes your JSON files are in a directory named json.
dimage --no-dupes --skip svg
Organized Download
Download all media, skipping duplicates and SVG files. Media will be organized by type (icons, avatars, emojis, channels).
dimage --no-dupes --skip svg --organize
Update Timestamps Only
Apply original timestamps to already downloaded files. Assumes files are in an organized structure. No new files will be downloaded. Displays info and warnings.
dimage --no-dupes --skip svg --timestamp-only --organize --loglevel info
Attachments Only
Download only message attachments, skipping all other media types, duplicates, and SVG files.
dimage --no-guild-icon --no-avatars --no-mentions --no-reactions --no-reactions-emojis --no-inline-emojis --no-dupes --skip svg
I prefer to skip SVG files, as in 99.99% of cases, they are just standard Discord emojis.
🎨 Command-Line Arguments
| Argument | Description |
|---|---|
-i, --input <path> |
Path to the input directory containing .json files. Default: json. |
-o, --output <path> |
Path to the root output directory for downloads. Default: downloads. |
--no-guild-icon |
Skip downloading the guild/server icon. |
--no-avatars |
Skip downloading message author avatars. |
--no-mentions |
Skip downloading avatars of mentioned users. |
--no-reactions |
Skip downloading avatars of users who reacted. |
--no-reactions-emojis |
Skip downloading custom emojis used in reactions. |
--no-inline-emojis |
Skip downloading custom emojis used inline in messages. |
--no-attachments |
Skip downloading message attachments. |
--no-dupes |
Avoid downloading duplicate files based on URL. |
--skip <exts> |
Skip files with specified comma-separated extensions. |
--timestamp-only |
Set timestamps on existing files without downloading. |
--organize |
Organize files into categories: icons, avatars, emojis, and channels (for attachments). |
--loglevel <level> |
Set the logging level (NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL). Default: ERROR. |
🚧 TODO
- Refactor for Concurrency: Re-architect the download logic using
asyncioandaiohttpto replace the current sequential, blockingrequestsimplementation. This will significantly improve performance. - Implement Persistent Cache: Replace the in-memory
visited_urlsset with a persistent on-disk cache (e.g., a simple database or a state file). This will allow the application to be stopped and resumed, prevent redundant downloads, and enable recovery from interruptions. - Add Robust Retry Logic: Integrate a library such as
tenacityorretryinginto the download function to automatically handle transient network errors, timeouts, and HTTP 429 (Too Many Requests) status codes with exponential backoff. - Establish Formal Testing: Develop a formal test suite using
pytest. Implement mocking for network requests to test application logic without relying on expiring Discord URLs. Addcoverageto measure test effectiveness and identify untested code paths.
📜 License
This project is licensed under the MIT License. See the LICENSE file for details.
🤝 Support
Metadata
Release files for dimage 2025.7.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dimage-2025.7.7.tar.gz | 12.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dimage-2025.7.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.4 kB
Release files / dimage-2025.7.7.tar.gz
| Download URL | dimage-2025.7.7.tar.gz |
|---|---|
| Size | 12.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d13e5096484601a8a67fb6959b664c4cd95e4db845285007016f2b5d5d0409f5
|
|
BLAKE2b-256 checksum How to use checksums |
1b33bda91c27d15cc03362b561138ed058eda70e9a1aaafce3b8348a1d683f79
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.23
|
Release files / dimage-2025.7.7-py3-none-any.whl
| Download URL | dimage-2025.7.7-py3-none-any.whl |
|---|---|
| Size | 11.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b50a4060ebe4a6b4c469265ee88309f32c0a4f7499f8b7e329305233233eb776
|
|
BLAKE2b-256 checksum How to use checksums |
bbfafc176c3f65628e2bc99bfcd1aa0ab3e1254ebe9dd0255dd1f08418d442cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.23
|