From be03f914ef6f73766818aa8745adcfe077139add Mon Sep 17 00:00:00 2001
From: Yuvi63771 <114073886+Yuvi9587@users.noreply.github.com>
Date: Wed, 12 Nov 2025 20:10:13 +0530
Subject: [PATCH] Commit
---
src/ui/classes/simp_city_downloader_thread.py | 61 ++++++++++++++----
src/ui/main_window.py | 64 -------------------
2 files changed, 47 insertions(+), 78 deletions(-)
diff --git a/src/ui/classes/simp_city_downloader_thread.py b/src/ui/classes/simp_city_downloader_thread.py
index e630acb..78ab0e8 100644
--- a/src/ui/classes/simp_city_downloader_thread.py
+++ b/src/ui/classes/simp_city_downloader_thread.py
@@ -134,7 +134,9 @@ class SimpCityDownloadThread(QThread):
with self.counter_lock: self.total_skip_count += 1
return
self.progress_signal.emit(f" -> Downloading (Image): '{filename}'...")
- response = session.get(job['url'], stream=True, timeout=90, headers={'Referer': self.start_url})
+ # --- START MODIFICATION ---
+ response = session.get(job['url'], stream=True, timeout=180, headers={'Referer': self.start_url})
+ # --- END MODIFICATION ---
response.raise_for_status()
with open(filepath, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
@@ -227,7 +229,9 @@ class SimpCityDownloadThread(QThread):
else:
self.progress_signal.emit(f" -> Downloading: '{filename}'...")
headers = file_data.get('headers', {'Referer': source_url})
- response = session.get(file_data.get('url'), stream=True, timeout=90, headers=headers)
+ # --- START MODIFICATION ---
+ response = session.get(file_data.get('url'), stream=True, timeout=180, headers=headers)
+ # --- END MODIFICATION ---
response.raise_for_status()
with open(filepath, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
@@ -298,16 +302,30 @@ class SimpCityDownloadThread(QThread):
try:
page_title, jobs_on_page, final_url = fetch_single_simpcity_page(page_url, self._log_interceptor, cookies=self.cookies)
+ # --- START: MODIFIED REDIRECT LOGIC ---
if final_url != page_url:
self.progress_signal.emit(f" -> Redirect detected from {page_url} to {final_url}")
try:
req_page_match = re.search(r'/page-(\d+)', page_url)
final_page_match = re.search(r'/page-(\d+)', final_url)
- if req_page_match and final_page_match and int(final_page_match.group(1)) < int(req_page_match.group(1)):
- self.progress_signal.emit(" -> Redirected to an earlier page. Reached end of thread.")
- end_of_thread = True
+
+ if req_page_match:
+ req_page_num = int(req_page_match.group(1))
+
+ # Scenario 1: Redirect to an earlier page (e.g., page-11 -> page-10)
+ if final_page_match and int(final_page_match.group(1)) < req_page_num:
+ self.progress_signal.emit(f" -> Redirected to an earlier page ({final_page_match.group(0)}). Reached end of thread.")
+ end_of_thread = True
+
+ # Scenario 2: Redirect to base URL (e.g., page-11 -> /)
+ # We check req_page_num > 1 because page-1 often redirects to base URL, which is normal.
+ elif not final_page_match and req_page_num > 1:
+ self.progress_signal.emit(f" -> Redirected to base thread URL. Reached end of thread.")
+ end_of_thread = True
+
except (ValueError, TypeError):
- pass
+ pass # Ignore parsing errors
+ # --- END: MODIFIED REDIRECT LOGIC ---
if end_of_thread:
page_fetch_successful = True; break
@@ -316,25 +334,40 @@ class SimpCityDownloadThread(QThread):
self.progress_signal.emit(f" -> Page {page_counter} is invalid or has no title. Reached end of thread.")
end_of_thread = True
elif not jobs_on_page:
+ self.progress_signal.emit(f" -> Page {page_counter} has no content. Reached end of thread.")
end_of_thread = True
else:
new_jobs = [job for job in jobs_on_page if job.get('url') not in self.processed_job_urls]
if not new_jobs and page_counter > 1:
+ self.progress_signal.emit(f" -> Page {page_counter} contains no new content. Reached end of thread.")
end_of_thread = True
else:
enriched_jobs = self._get_enriched_jobs(new_jobs)
- for job in enriched_jobs:
- self.processed_job_urls.add(job.get('url'))
- if job['type'] == 'image': self.image_queue.put(job)
- else: self.service_queue.put(job)
+ if not enriched_jobs and not new_jobs:
+ # This can happen if all new_jobs were e.g. pixeldrain and it's disabled
+ self.progress_signal.emit(f" -> Page {page_counter} content was filtered out. Reached end of thread.")
+ end_of_thread = True
+ else:
+ for job in enriched_jobs:
+ self.processed_job_urls.add(job.get('url'))
+ if job['type'] == 'image': self.image_queue.put(job)
+ else: self.service_queue.put(job)
page_fetch_successful = True; break
except requests.exceptions.HTTPError as e:
- if e.response.status_code in [403, 404]: end_of_thread = True; break
- elif e.response.status_code == 429: time.sleep(5 * (retries + 2)); retries += 1
- else: end_of_thread = True; break
+ if e.response.status_code in [403, 404]:
+ self.progress_signal.emit(f" -> Page {page_counter} returned {e.response.status_code}. Reached end of thread.")
+ end_of_thread = True; break
+ elif e.response.status_code == 429:
+ self.progress_signal.emit(f" -> Rate limited (429). Waiting...")
+ time.sleep(5 * (retries + 2)); retries += 1
+ else:
+ self.progress_signal.emit(f" -> HTTP Error {e.response.status_code} on page {page_counter}. Stopping crawl.")
+ end_of_thread = True; break
except Exception as e:
self.progress_signal.emit(f" Stopping crawl due to error on page {page_counter}: {e}"); end_of_thread = True; break
- if not page_fetch_successful and not end_of_thread: end_of_thread = True
+ if not page_fetch_successful and not end_of_thread:
+ self.progress_signal.emit(f" -> Failed to fetch page {page_counter} after {MAX_RETRIES} attempts. Stopping crawl.")
+ end_of_thread = True
if not end_of_thread: page_counter += 1
except Exception as e:
self.progress_signal.emit(f"❌ A critical error occurred during the main fetch phase: {e}")
diff --git a/src/ui/main_window.py b/src/ui/main_window.py
index 26b163a..00a46b9 100644
--- a/src/ui/main_window.py
+++ b/src/ui/main_window.py
@@ -3888,30 +3888,6 @@ class DownloaderApp (QWidget ):
num_threads_from_gui = MAX_THREADS
self.thread_count_input.setText(str(MAX_THREADS))
self.log_signal.emit(f"⚠️ User attempted {num_threads_from_gui} threads, capped to {MAX_THREADS}.")
- if SOFT_WARNING_THREAD_THRESHOLD < num_threads_from_gui <= MAX_THREADS:
- soft_warning_msg_box = QMessageBox(self)
- soft_warning_msg_box.setIcon(QMessageBox.Question)
- soft_warning_msg_box.setWindowTitle("Thread Count Advisory")
- soft_warning_msg_box.setText(
- f"You've set the thread count to {num_threads_from_gui}.\n\n"
- "While this is within the allowed limit, using a high number of threads (typically above 40-50) can sometimes lead to:\n"
- " - Increased errors or failed file downloads.\n"
- " - Connection issues with the server.\n"
- " - Higher system resource usage.\n\n"
- "For most users and connections, 10-30 threads provide a good balance.\n\n"
- f"Do you want to proceed with {num_threads_from_gui} threads, or would you like to change the value?"
- )
- proceed_button = soft_warning_msg_box.addButton("Proceed Anyway", QMessageBox.AcceptRole)
- change_button = soft_warning_msg_box.addButton("Change Thread Value", QMessageBox.RejectRole)
- soft_warning_msg_box.setDefaultButton(proceed_button)
- soft_warning_msg_box.setEscapeButton(change_button)
- soft_warning_msg_box.exec_()
-
- if soft_warning_msg_box.clickedButton() == change_button:
- self.log_signal.emit(f"ℹ️ User opted to change thread count from {num_threads_from_gui} after advisory.")
- self.thread_count_input.setFocus()
- self.thread_count_input.selectAll()
- return False
raw_skip_words_text = self.skip_words_input.text().strip()
skip_words_parts = [part.strip() for part in raw_skip_words_text.split(',') if part.strip()]
@@ -4018,26 +3994,6 @@ class DownloaderApp (QWidget ):
if end_page is not None and end_page <= 0: raise ValueError("End page must be positive.")
if start_page and end_page and start_page > end_page: raise ValueError("Start page cannot be greater than end page.")
- if manga_mode and start_page and end_page:
- msg_box = QMessageBox(self)
- msg_box.setIcon(QMessageBox.Warning)
- msg_box.setWindowTitle("Renaming Mode & Page Range Warning")
- msg_box.setText(
- "You have enabled Renaming Mode with a sequential naming style (Date Based or Title + G.Num) and also specified a Page Range.\n\n"
- "These modes rely on processing all posts from the beginning to create a correct sequence. "
- "Using a page range may result in an incomplete or incorrectly ordered download.\n\n"
- "It is recommended to use these styles without a page range.\n\n"
- "Do you want to proceed anyway?"
- )
- proceed_button = msg_box.addButton("Proceed Anyway", QMessageBox.AcceptRole)
- cancel_button = msg_box.addButton("Cancel Download", QMessageBox.RejectRole)
- msg_box.setDefaultButton(proceed_button)
- msg_box.setEscapeButton(cancel_button)
- msg_box.exec_()
-
- if msg_box.clickedButton() == cancel_button:
- self.log_signal.emit("❌ Download cancelled by user due to Renaming Mode & Page Range warning.")
- return False
except ValueError as e:
QMessageBox.critical(self, "Page Range Error", f"Invalid page range: {e}")
return False
@@ -6819,26 +6775,6 @@ class DownloaderApp (QWidget ):
char_filter_is_empty = not self.character_input.text().strip()
extract_links_only = (self.radio_only_links and self.radio_only_links.isChecked())
- if manga_mode_is_checked and char_filter_is_empty and not extract_links_only:
- msg_box = QMessageBox(self)
- msg_box.setIcon(QMessageBox.Warning)
- msg_box.setWindowTitle("Renaming Mode Filter Warning")
- msg_box.setText(
- "Renaming Mode is enabled, but 'Filter by Character(s)' is empty.\n\n"
- "This is a one-time warning for this entire batch of downloads.\n\n"
- "Proceeding without a filter may result in generic filenames and folders.\n\n"
- "Proceed with the entire batch?"
- )
- proceed_button = msg_box.addButton("Proceed Anyway", QMessageBox.AcceptRole)
- cancel_button = msg_box.addButton("Cancel Entire Batch", QMessageBox.RejectRole)
- msg_box.exec_()
- if msg_box.clickedButton() == cancel_button:
- self.log_signal.emit("❌ Entire favorite queue cancelled by user at Renaming Mode warning.")
- self.favorite_download_queue.clear()
- self.is_processing_favorites_queue = False
- self.set_ui_enabled(True)
- return # Stop processing the queue
-
if self ._is_download_active ():
self .log_signal .emit ("ℹ️ Waiting for current download to finish before starting next favorite.")
return