This guide provides a detailed overview of all user interface elements, input fields, buttons, popups, and functionalities available in the application.
-
-
-
1. URL Input (π)
-
This is the primary input field where you specify the content you want to download.
-
-
Functionality:
-
-
Creator URL: A link to a creator's main page (e.g., https://kemono.su/patreon/user/12345). Downloads all posts from the creator.
-
Post URL: A direct link to a specific post (e.g., .../post/98765). Downloads only the specified post.
-
-
-
Interaction with Other Features: The content of this field influences "Manga Mode" and "Page Range". "Page Range" is enabled only with a creator URL.
-
-
-
-
2. Creator Selection & Update (π¨)
-
The color palette emoji button opens the Creator Selection & Update dialog. This allows managing and downloading from a local creator database.
-
-
Functionality:
-
-
Creator Browser: Loads a list from creators.json. Search by name, service, or paste a URL to find creators.
-
Batch Selection: Select multiple creators and click "Add Selected" to add them to the batch download session.
-
Update Checker: Use a saved profile (.json) to download only new content based on previously fetched posts.
-
Post Fetching & Filtering: "Fetch Posts" loads post titles, allowing you to choose specific posts for download.
-
-
-
-
-
3. Download Location Input (π)
-
This input defines the destination directory for downloaded files.
-
-
Functionality:
-
-
Manual Entry: Enter or paste the folder path.
-
Browse Button: Opens a system dialog to choose a folder.
-
Directory Creation: If the folder doesn't exist, the app can create it after user confirmation.
-
-
-
-
-
4. Filter by Character(s) & Scope Button
-
Used to download content for specific characters or series and organize them into subfolders.
-
-
Input Field (Filter by Character(s)):
-
-
Enter comma-separated names (e.g., Tifa, Aerith).
-
Group aliases using parentheses (e.g., (Cloud, Zack)).
-
Names are matched against titles, filenames, or comments.
-
If "Separate Folders by Known.txt" is enabled, the name becomes the subfolder name.
-
-
-
Scope Button Modes:
-
-
Filter: Title (default) β Match names in post titles only.
-
Filter: Files β Match names in filenames only.
-
Filter: Both β Try title match first, then filenames.
-
Filter: Comments β Try filenames first, then post comments if no match.
-
-
-
-
-
5. Skip with Words & Scope Button
-
Prevents downloading content based on keywords.
-
-
Input Field (Skip with Words):
-
-
Enter comma-separated keywords (e.g., WIP, sketch, preview).
-
Matching is case-insensitive.
-
If a keyword matches, the file or post is skipped.
-
-
-
Scope Button Modes:
-
-
Scope: Posts (default) β Skips post if title contains a keyword.
-
Scope: Files β Skips individual files with keyword matches.
-
Scope: Both β Skips entire post if title matches, otherwise filters individual files.
-
-
-
-
Filter File Section (Radio Buttons)
-
This section uses a group of radio buttons to control the primary download mode, dictating which types of files are targeted. Only one of these modes can be active at a time.
-
-
-
- All: Default mode. Downloads every file and attachment provided by the API, regardless of type.
-
-
- Images/GIFs: Filters for common image formats (.jpg, .png, .gif, .webp), skipping non-image files.
-
-
- Videos: Filters for common video formats like .mp4, .webm, and .mov, skipping all others.
-
-
- Only Archives: Downloads only archive files (.zip, .rar). Disables "Compress to WebP" and unchecks "Skip Archives".
-
-
- Only Audio: Filters for common audio formats like .mp3, .wav, and .flac.
-
-
- Only Links: Extracts external hyperlinks from post descriptions (e.g., Mega, Google Drive) and displays them in the log. Disables all download options.
-
-
- More: Opens the "More Options" dialog to download text-based content instead of media files.
-
-
Scope: Choose to extract from post description or comments.
-
Export Format: Save text as PDF, DOCX, or TXT.
-
Single PDF: Optionally compile all text into one PDF.
-
-
-
-
-
-
-
Check Box Buttons
-
These checkboxes provide additional toggles to refine the download behavior and enable special features.
-
-
-
- β Favorite Mode: Changes workflow to download from your personal favorites. Disables the URL input.
-
-
Favorite Artists: Opens a dialog to select from your favorited creators.
-
Favorite Posts: Opens a dialog to select from your favorited posts on Kemono and Coomer.
-
-
-
- Skip Archives: When checked, archive files (.zip, .rar) are ignored. Disabled in "Only Archives" mode.
-
-
- Download Thumbnail Only: Saves only thumbnail previews, not full-resolution files. Enables "Scan Content for Images".
-
-
- Scan Content for Images: Parses post HTML for embedded images not listed in the API. Looks for <img> tags and direct image links.
-
-
- Compress to WebP: Converts large images (over 1.5 MB) to WebP format using the Pillow library for space-saving.
-
-
- Keep Duplicates: Provides control over duplicate handling via the "Duplicate Handling Options" dialog.
-
-
Skip by Hash: Default β skip identical files.
-
Keep Everything: Save all files regardless of duplication.
-
Limit: Set a limit on how many copies of the same file are saved. A limit of 0 means no limit.
-
-
-
-
-
Folder Organization Checkboxes
+
Kemono Downloader - Comprehensive Feature Guide
+
This guide provides a detailed overview of all user interface elements, input fields, buttons, popups, and functionalities available in the application.
+
+
1. Core Concepts & Supported Sites
+
URL Input (π)
+
This is the primary input field where you specify the content you want to download.
+
Supported URL Types:
-
- Separate folders by Known.txt: Automatically organizes downloads into folders based on name matches.
-
-
Uses "Filter by Character(s)" input first, if available.
-
Then checks names in Known.txt.
-
Falls back to extracting from post title.
-
-
-
- Subfolder per post: Creates a unique folder per post, using the postβs title.
-
-
Prevents mixing files from multiple posts.
-
Can be combined with Known.txt-based folders.
-
Ensures uniqueness (e.g., My Post Title_1).
-
Automatically removes empty folders.
-
-
-
- Date prefix: Enabled only with "Subfolder per post". Prepends the post date (e.g., 2025-08-03 My Post Title) for chronological sorting.
-
+
Creator URL: A link to a creator's main page. Downloads all posts from that creator.
+
Post URL: A direct link to a specific post. Downloads only that single post.
+
Batch Command: Special keywords to trigger bulk downloading from a text file (see Batch Downloading section).
-
-
General Functionality Checkboxes
+
Supported Websites:
-
- Use cookie: Enables login-based access via cookies.
+
Kemono (kemono.su, kemono.party, etc.)
+
Coomer (coomer.su, coomer.party, etc.)
+
Discord (via Kemono/Coomer API)
+
Bunkr
+
Erome
+
Saint2.su
+
nhentai
+
+
+
2. Main Download Controls & Inputs
+
Download Location (π)
+
This input defines the main folder where your files will be saved.
+
+
Browse Button: Opens a system dialog to choose a folder.
+
Directory Creation: If the folder doesn't exist, the app will ask for confirmation to create it.
+
+
Filter by Character(s) & Scope
+
Used to download content for specific characters or series and organize them into subfolders.
+
+
Input Field: Enter comma-separated names (e.g., Tifa, Aerith). Group aliases using parentheses for folder naming (e.g., (Cloud, Zack)).
+
Scope Button: Cycles through where to look for name matches:
-
Paste cookie string directly, or browse to select a cookies.txt file.
-
Cookies are used in all authenticated API requests.
-
-
-
- Use Multithreading: Enables parallel downloading of posts.
-
-
Specify the number of worker threads (e.g., 10).
-
Disabled for Manga Mode and Only Links mode.
-
-
-
- Show external links in log: Adds a secondary log that displays links (e.g., Mega, Dropbox) found in post text.
-
-
- Manga/Comic mode: Sorts posts chronologically before download.
-
Name: Date + Original β e.g., 2025-08-03_filename.png
-
Name: Date + Title β e.g., 2025-08-03_Chapter-1.jpg
-
Name: Title+G.Num β e.g., Page_001.jpg
-
Name: Date Based β e.g., 001.jpg, with optional prefix
-
Name: Post ID β uses unique post ID as filename
+
Filter: Title: Matches names in the post title.
+
Filter: Files: Matches names in the filenames.
+
Filter: Both: Checks the title first, then filenames.
+
Filter: Comments: Checks filenames first, then post comments.
-
Start Download
+
Skip with Words & Scope
+
Prevents downloading content based on keywords or file size.
-
- Default State ("β¬οΈ Start Download"): When idle, this button gathers all current settings (URL, filters, checkboxes, etc.) and begins the download process via the DownloadManager.
-
-
- Restore State: If an interrupted session is detected, the tooltip will indicate that starting a new download will discard previous session progress.
-
-
- Update Mode (Phase 1 - "π Check For Updates"): If a creator profile is loaded, clicking this button will fetch the creator's posts and compare them against your saved profile to identify new content.
-
-
- Update Mode (Phase 2 - "β¬οΈ Start Download (X new)"): After new posts are found, the button text updates to reflect the number. Clicking it downloads only the new content.
-
-
-
-
Pause / Resume Download
-
-
- While Downloading: The button toggles between:
+
Input Field: Enter comma-separated keywords (e.g., WIP, sketch, preview).
+
Skip by Size: Enter a number in square brackets to skip any file smaller than that size in MB. For example, WIP, [200] skips files with "WIP" in the name AND any file smaller than 200 MB.
+
Scope Button: Cycles through where to apply keyword filters:
-
"βΈοΈ Pause Download": Sets a pause_event, which tells all worker threads to halt their current task and wait.
-
"βΆοΈ Resume Download": Clears the pause_event, allowing threads to resume their work.
-
-
-
- While Idle: The button is disabled.
-
-
- Restore State: Changes to "π Restore Download", which resumes the last session from saved data.
-
-
-
-
Cancel & Reset UI
-
-
- Functionality: Stops downloads gracefully using a cancellation_event. Threads finish current tasks before shutting down.
-
-
- The Soft Reset: After cancellation is confirmed by background threads, the UI resets via the download_finished function. Input fields (URL and Download Location) are preserved for convenience.
-
-
- Restore State: Changes to "ποΈ Discard Session", which deletes session.json and resets the UI.
-
-
- Update State: Changes to "ποΈ Clear Selection", unloading the selected creator profile and returning to normal UI state.
-
-
-
-
Error Button
-
-
- Error Counter: Shows how many files failed to download (e.g., (3) Error). Disabled if there are no errors.
-
-
- Error Dialog: Clicking opens the "Files Skipped Due to Errors" dialog (defined in ErrorFilesDialog.py), listing all failed files.
-
-
- Dialog Features:
-
-
View Failed Files: Shows filenames and related post info.
-
Select and Retry: Retry selected failed files in a focused download session.
-
Export URLs: Save a .txt file of direct download links. Optionally include post metadata with each URL.
+
Scope: Posts: Skips the entire post if the title matches.
+
Scope: Files: Skips individual files if the filename matches.
+
Scope: Both: Checks the post title first, then individual files.
-
"Known Area" and its Controls
-
This section, located on the right side of the main window, manages your personal name database (Known.txt), which the app uses to organize downloads into subfolders.
-
+
Remove Words from Name (βοΈ)
+
Enter comma-separated words to remove from final filenames (e.g., patreon, [HD]). This helps clean up file naming.
+
+
3. Primary Download Modes (Filter File Section)
+
This section uses radio buttons to set the main download mode. Only one can be active at a time.
-
- Open Known.txt: Opens the Known.txt file in your system's default text editor for manual editing, such as bulk changes or cleanup.
-
-
- Search character input: A live search filter that hides any list items not matching your input text. Useful for quickly locating specific names in large lists.
-
-
- Known Series/Characters Area: Displays all names currently stored in your Known.txt. These names are used when "Separate folders by Known.txt" is enabled.
-
-
- Input at bottom & Add button: Type a new character or series name into the input field, then click "β Add". The app checks for duplicates, updates the list, and saves to Known.txt.
-
-
- Add to Filter: Opens a dialog showing all entries from Known.txt with checkboxes. You can select one or more to auto-fill the "Filter by Character(s)" field at the top of the app.
-
-
- Delete Selected: Select one or more entries from the list and click "ποΈ Delete Selected" to remove them from the app and update Known.txt accordingly.
-
-
-
-
Other Buttons
-
-
- (?_?) mark button (Help Guide): Opens a multi-page help dialog with step-by-step instructions and explanations for all app features. Useful for new users.
-
-
- History Button: Opens the Download History dialog (from DownloadHistoryDialog.py), showing:
+
All: Default mode. Downloads every file and attachment.
+
Images/GIFs: Downloads only common image formats.
+
Videos: Downloads only common video formats.
+
Only Archives: Downloads only .zip, .rar, etc.
+
Only Audio: Downloads only common audio formats.
+
Only Links: Extracts external hyperlinks (e.g., Mega, Google Drive) from post descriptions instead of downloading files. This mode unlocks special features (see section 6).
+
More: Opens a dialog to download text-based content.
-
Recently downloaded files
-
The first few posts processed in the last session
-
- This allows for a quick review of recent activity.
-
-
- Settings Button: Opens the Settings dialog (from FutureSettingsDialog.py), where you can change app-wide settings such as theme (light/dark) and language.
-
-
- Support Button: Opens the Support dialog (from SupportDialog.py), which includes developer info, source links, and donation platforms like Ko-fi or Patreon.
-
-
-
Log Area Controls
-
These controls are located around the main log panel and offer tools for managing downloads, configuring advanced options, and resetting the application.
-
-
-
- Multi-part: OFF
- This button acts as both a status indicator and a configuration panel for multi-part downloading (parallel downloading of large files).
-
-
Function: Opens the Multipart Download Options dialog (defined in MultipartScopeDialog.py).
-
Scope Options: Choose between "Videos Only", "Archives Only", or "Both".
-
Number of parts: Set how many simultaneous connections to use (2β16).
-
Minimum file size: Set a threshold (MB) below which files are downloaded normally.
-
Status: After applying settings, the button's text updates (e.g., Multi-part: Both); otherwise, it resets to Multi-part: OFF.
-
-
-
-
- ποΈ Eye Emoji Button (Log View Toggle)
- Switches between two views in the log panel:
-
-
ποΈ Progress Log View: Shows real-time download progress, status messages, and errors.
-
π« Missed Character View: Displays names detected in posts that didnβt match the current filter β useful for updating Known.txt.
-
-
-
-
- Reset Button
- Performs a full "soft reset" of the UI when the application is idle.
-
-
Clears all inputs (except saved Download Location)
-
Resets checkboxes, buttons, and logs
-
Clears counters, queues, and restores the UI to its default state
-
Note: This is different from Cancel & Reset UI, which halts active downloads
+
Scope: Choose to extract text from the post description or comments.
+
Export Format: Save as PDF, DOCX, or TXT.
+
Single PDF: Compile all text from the session into one consolidated PDF file.
-
-
The Progress Log and "Only Links" Mode Controls
-
+
+
4. Advanced Features & Toggles (Checkboxes)
+
Folder Organization
-
- Standard Mode (Progress Log)
- This is the default behavior. The main_log_output field displays:
+
Separate folders by Known.txt: Automatically organizes downloads into subfolders based on name matches from your Known.txt list or the "Filter by Character(s)" input.
+
Subfolder per post: Creates a unique folder for each post, named after the post's title. This prevents files from different posts from mixing.
+
Date prefix: (Only available with "Subfolder per post") Prepends the post date to the folder name (e.g., 2025-08-03 My Post Title) for chronological sorting.
+
+
Special Modes
+
+
β Favorite Mode: Switches the UI to download from your personal favorites list instead of using the URL input.
+
Manga/Comic mode: Sorts a creator's posts from oldest to newest before downloading, ensuring correct page order. A scope button appears to control the filename style (e.g., using post title, date, or a global number).
+
+
File Handling
+
+
Skip Archives: Ignores .zip and .rar files during downloads.
+
Download Thumbnail Only: Saves only the small preview images instead of full-resolution files.
+
Scan Content for Images: Parses post HTML to find embedded images that may not be listed in the API data.
+
Compress to WebP: Converts large images (over 1.5 MB) to the space-saving WebP format.
+
Keep Duplicates: Opens a dialog to control how duplicate files are handled (skip by default, keep all, or keep a specific number of copies).
+
+
General Functionality
+
+
Use cookie: Enables login-based access. You can paste a cookie string or browse for a cookies.txt file.
+
Use Multithreading: Enables parallel processing of posts for faster downloads. You can set the number of concurrent worker threads.
+
Show external links in log: Opens a secondary log panel that displays external links found in post descriptions.
+
+
+
5. Specialized Downloaders & Batch Mode
+
Discord Features
+
+
When a Discord URL is entered, a Scope button appears.
-
Post processing steps
-
Download/skipped file notifications
-
Error messages
-
Session summaries
+
Scope: Files: Downloads all files from the channel/server.
+
Scope: Messages: Saves the entire message history of the channel/server as a formatted PDF.
-
-
- "Only Links" Mode
- When enabled, the log panel switches modes and reveals new controls.
+
A "Save as PDF" button also appears as a shortcut for the message saving feature.
+
+
Batch Downloading (nhentai & saint2.su)
+
This feature allows you to download hundreds of galleries or videos from a simple text file.
+
+
In the appdata folder, create nhentai.txt or saint2.su.txt.
+
Add one full URL per line to the corresponding file.
+
In the app's URL input, type either nhentai.net or saint2.su and click "Start Download".
+
The app will read the file and process every URL in the queue.
+
+
+
6. "Only Links" Mode: Extraction & Direct Download
+
When you select the "Only Links" radio button, the application's behavior changes significantly.
+
+
Link Extraction: Instead of downloading files, the main log panel will fill with all external links found (Mega, Google Drive, Dropbox, etc.).
+
Export Links: An "Export Links" button appears, allowing you to save the full list of extracted URLs to a .txt file.
+
Direct Cloud Download: A "Download" button appears next to the export button.
-
π Extracted Links Log: Replaces progress info with a list of found external links (e.g., Mega, Dropbox).
-
Export Links Button: Saves the extracted links to a .txt file.
-
Download Button: Opens the Download Selected External Links dialog (from DownloadExtractedLinksDialog.py), where you can:
-
Clicking this opens a new dialog listing all supported cloud links (Mega, G-Drive, Dropbox).
+
You can select which files you want to download from this list.
+
The application will then download the selected files directly from the cloud service to your chosen download location.
+
+
7. Session & Process Management
+
Main Action Buttons
+
+
Start Download: Begins the download process. This button's text changes contextually (e.g., "Extract Links", "Check for Updates").
+
Pause / Resume: Pauses or resumes the ongoing download. When paused, you can safely change some settings.
+
Cancel & Reset UI: Stops the current download and performs a soft reset of the UI, preserving your URL and download location.
+
+
Restore Interrupted Download
+
If the application is closed unexpectedly during a download, it will save its progress.
+
+
On the next launch, the UI will be pre-filled with the settings from the interrupted session.
+
The Pause button will change to "π Restore Download". Clicking it will resume the download exactly where it left off, skipping already processed posts.
+
The Cancel button will change to "ποΈ Discard Session", allowing you to clear the saved state and start fresh.
+
+
Other UI Controls
+
+
Error Button: Shows a count of failed files. Clicking it opens a dialog where you can view, export, or retry the failed downloads.
+
History Button: Shows a log of recently downloaded files and processed posts.
+
Settings Button: Opens the settings dialog where you can change the theme, language, and check for application updates.
+
Support Button: Opens a dialog with links to the project's source code and developer support pages.
+
diff --git a/src/core/erome_client.py b/src/core/erome_client.py
index 90eb27c..6282379 100644
--- a/src/core/erome_client.py
+++ b/src/core/erome_client.py
@@ -1,4 +1,3 @@
-# src/core/erome_client.py
import os
import re
@@ -7,10 +6,8 @@ import time
import urllib.parse
import requests
from datetime import datetime
+import cloudscraper
-# #############################################################################
-# SECTION: Utility functions adapted from the original script
-# #############################################################################
def extr(txt, begin, end, default=""):
"""Stripped-down version of 'extract()' to find text between two delimiters."""
@@ -49,14 +46,10 @@ def nameext_from_url(url):
def parse_timestamp(ts, default=None):
"""Creates a datetime object from a Unix timestamp."""
try:
- # Use fromtimestamp for simplicity and compatibility
return datetime.fromtimestamp(int(ts))
except (ValueError, TypeError):
return default
-# #############################################################################
-# SECTION: Main Erome Fetching Logic
-# #############################################################################
def fetch_erome_data(url, logger):
"""
@@ -78,15 +71,10 @@ def fetch_erome_data(url, logger):
album_id = album_id_match.group(1)
page_url = f"https://www.erome.com/a/{album_id}"
- session = requests.Session()
- session.headers.update({
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
- "Referer": "https://www.erome.com/"
- })
+ session = cloudscraper.create_scraper()
try:
logger(f" Fetching Erome album page: {page_url}")
- # Add a loop to handle "Please wait" pages
for attempt in range(5):
response = session.get(page_url, timeout=30)
response.raise_for_status()
@@ -103,17 +91,14 @@ def fetch_erome_data(url, logger):
title = html.unescape(extr(page_content, 'property="og:title" content="', '"'))
user = urllib.parse.unquote(extr(page_content, 'href="https://www.erome.com/', '"', default="unknown_user"))
- # Sanitize title and user for folder creation
sanitized_title = re.sub(r'[<>:"/\\|?*]', '_', title).strip()
sanitized_user = re.sub(r'[<>:"/\\|?*]', '_', user).strip()
album_folder_name = f"Erome - {sanitized_user} - {sanitized_title} [{album_id}]"
urls = []
- # Split the page content by media groups to find all videos
media_groups = page_content.split('
tag, fall back to data-src for images
+ for group in media_groups[1:]:
video_url = extr(group, '