Update deviantart_downloader_thread.py

This commit is contained in:
Yuvi9587 2025-12-24 09:26:07 +05:30
parent cb8dd3b7f3
commit e806b6de66

View File

@ -3,7 +3,7 @@ import time
import requests import requests
import re import re
from datetime import datetime from datetime import datetime
from concurrent.futures import ThreadPoolExecutor, wait # REMOVED: ThreadPoolExecutor, wait (Not needed for sequential speed)
from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtCore import QThread, pyqtSignal
from ...core.deviantart_client import DeviantArtClient from ...core.deviantart_client import DeviantArtClient
from ...utils.file_utils import clean_folder_name from ...utils.file_utils import clean_folder_name
@ -21,21 +21,17 @@ class DeviantArtDownloadThread(QThread):
self.pause_event = pause_event self.pause_event = pause_event
self.cancellation_event = cancellation_event self.cancellation_event = cancellation_event
# Pass logger to client so we see "Rate Limit" messages in the UI # Pass logger to client
self.client = DeviantArtClient(logger_func=self.progress_signal.emit) self.client = DeviantArtClient(logger_func=self.progress_signal.emit)
self.parent_app = parent self.parent_app = parent
self.download_count = 0 self.download_count = 0
self.skip_count = 0 self.skip_count = 0
# --- THREAD SETTINGS ---
# STRICTLY 1 THREAD (Sequential) to match 1.py and avoid Rate Limits
self.max_threads = 1
def run(self): def run(self):
self.progress_signal.emit("=" * 40) self.progress_signal.emit("=" * 40)
self.progress_signal.emit(f"🚀 Starting DeviantArt download for: {self.url}") self.progress_signal.emit(f"🚀 Starting DeviantArt download for: {self.url}")
self.progress_signal.emit(f" Mode: Sequential (1 thread) to prevent 429 errors.") self.progress_signal.emit(f" Mode: High-Speed Sequential (Matches 1.py)")
try: try:
if not self.client.authenticate(): if not self.client.authenticate():
@ -91,7 +87,7 @@ class DeviantArtDownloadThread(QThread):
if not os.path.exists(base_folder): if not os.path.exists(base_folder):
os.makedirs(base_folder, exist_ok=True) os.makedirs(base_folder, exist_ok=True)
with ThreadPoolExecutor(max_workers=self.max_threads) as executor: # --- OPTIMIZED LOOP (Matches 1.py structure) ---
while has_more: while has_more:
if self._check_pause_cancel(): break if self._check_pause_cancel(): break
@ -102,16 +98,12 @@ class DeviantArtDownloadThread(QThread):
if not results: break if not results: break
futures = [] # DIRECT LOOP - No ThreadPoolExecutor overhead
for deviation in results: for deviation in results:
if self._check_pause_cancel(): break if self._check_pause_cancel(): break
future = executor.submit(self._process_deviation_task, deviation, base_folder) self._process_deviation_task(deviation, base_folder)
futures.append(future)
# Wait for this batch to finish before getting the next page # Be nice to API (1 second sleep per batch of 24)
wait(futures)
# Match 1.py: Sleep 1s between pages to be nice to API
time.sleep(1) time.sleep(1)
def _process_deviation_task(self, deviation, base_folder): def _process_deviation_task(self, deviation, base_folder):
@ -121,7 +113,7 @@ class DeviantArtDownloadThread(QThread):
title = deviation.get('title', 'Unknown') title = deviation.get('title', 'Unknown')
try: try:
# This handles the fallback logic internally # Try to get content (Handles fallback internally now)
content = self.client.get_deviation_content(dev_id) content = self.client.get_deviation_content(dev_id)
if content: if content:
self._download_file(content['src'], deviation, override_dir=base_folder) self._download_file(content['src'], deviation, override_dir=base_folder)
@ -155,7 +147,6 @@ class DeviantArtDownloadThread(QThread):
final_filename = f"{safe_title}{ext}" final_filename = f"{safe_title}{ext}"
# Naming logic
if self.parent_app and self.parent_app.manga_mode_checkbox.isChecked(): if self.parent_app and self.parent_app.manga_mode_checkbox.isChecked():
try: try:
creator_name = metadata.get('author', {}).get('username', 'Unknown') creator_name = metadata.get('author', {}).get('username', 'Unknown')
@ -177,7 +168,8 @@ class DeviantArtDownloadThread(QThread):
final_filename = f"{clean_folder_name(new_name)}{ext}" final_filename = f"{clean_folder_name(new_name)}{ext}"
except Exception as e: except Exception as e:
self.progress_signal.emit(f" ⚠️ Renaming failed ({e}), using default.") # Reduced logging verbosity slightly for speed
pass
save_dir = override_dir if override_dir else self.output_dir save_dir = override_dir if override_dir else self.output_dir
if not os.path.exists(save_dir): if not os.path.exists(save_dir):