mirror of
https://github.com/Yuvi9587/Kemono-Downloader.git
synced 2025-12-29 16:14:44 +00:00
86 lines
3.8 KiB
Python
86 lines
3.8 KiB
Python
|
|
from PyQt5.QtCore import QThread, pyqtSignal
|
|||
|
|
|
|||
|
|
from ...services.drive_downloader import (
|
|||
|
|
download_dropbox_file,
|
|||
|
|
download_gdrive_file,
|
|||
|
|
download_mega_file as drive_download_mega_file,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ExternalLinkDownloadThread(QThread):
|
|||
|
|
"""A QThread to handle downloading multiple external links sequentially."""
|
|||
|
|
progress_signal = pyqtSignal(str)
|
|||
|
|
file_complete_signal = pyqtSignal(str, bool)
|
|||
|
|
finished_signal = pyqtSignal()
|
|||
|
|
overall_progress_signal = pyqtSignal(int, int)
|
|||
|
|
file_progress_signal = pyqtSignal(str, object)
|
|||
|
|
|
|||
|
|
def __init__(self, tasks_to_download, download_base_path, parent_logger_func, parent=None, use_post_subfolder=False):
|
|||
|
|
super().__init__(parent)
|
|||
|
|
self.tasks = tasks_to_download
|
|||
|
|
self.download_base_path = download_base_path
|
|||
|
|
self.parent_logger_func = parent_logger_func
|
|||
|
|
self.is_cancelled = False
|
|||
|
|
self.use_post_subfolder = use_post_subfolder
|
|||
|
|
|
|||
|
|
def run(self):
|
|||
|
|
total_tasks = len(self.tasks)
|
|||
|
|
self.progress_signal.emit(f"ℹ️ Starting external link download thread for {total_tasks} link(s).")
|
|||
|
|
self.overall_progress_signal.emit(total_tasks, 0)
|
|||
|
|
|
|||
|
|
for i, task_info in enumerate(self.tasks):
|
|||
|
|
if self.is_cancelled:
|
|||
|
|
self.progress_signal.emit("External link download cancelled by user.")
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
self.overall_progress_signal.emit(total_tasks, i + 1)
|
|||
|
|
|
|||
|
|
platform = task_info.get('platform', 'unknown').lower()
|
|||
|
|
full_url = task_info['url']
|
|||
|
|
post_title = task_info['title']
|
|||
|
|
|
|||
|
|
self.progress_signal.emit(f"Download ({i + 1}/{total_tasks}): Starting '{post_title}' ({platform.upper()}) from {full_url}")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
if platform == 'mega':
|
|||
|
|
drive_download_mega_file(
|
|||
|
|
full_url,
|
|||
|
|
self.download_base_path,
|
|||
|
|
logger_func=self.parent_logger_func,
|
|||
|
|
progress_callback_func=self.file_progress_signal.emit,
|
|||
|
|
overall_progress_callback=self.overall_progress_signal.emit
|
|||
|
|
)
|
|||
|
|
elif platform == 'google drive':
|
|||
|
|
download_gdrive_file(
|
|||
|
|
full_url,
|
|||
|
|
self.download_base_path,
|
|||
|
|
logger_func=self.parent_logger_func,
|
|||
|
|
progress_callback_func=self.file_progress_signal.emit,
|
|||
|
|
overall_progress_callback=self.overall_progress_signal.emit,
|
|||
|
|
use_post_subfolder=self.use_post_subfolder,
|
|||
|
|
post_title=post_title
|
|||
|
|
)
|
|||
|
|
elif platform == 'dropbox':
|
|||
|
|
download_dropbox_file(
|
|||
|
|
full_url,
|
|||
|
|
self.download_base_path,
|
|||
|
|
logger_func=self.parent_logger_func,
|
|||
|
|
progress_callback_func=self.file_progress_signal.emit,
|
|||
|
|
use_post_subfolder=self.use_post_subfolder,
|
|||
|
|
post_title=post_title
|
|||
|
|
)
|
|||
|
|
else:
|
|||
|
|
self.progress_signal.emit(f"⚠️ Unsupported platform '{platform}' for link: {full_url}")
|
|||
|
|
self.file_complete_signal.emit(full_url, False)
|
|||
|
|
continue
|
|||
|
|
self.file_complete_signal.emit(full_url, True)
|
|||
|
|
except Exception as e:
|
|||
|
|
self.progress_signal.emit(f"❌ Error downloading ({platform.upper()}) link '{full_url}': {e}")
|
|||
|
|
self.file_complete_signal.emit(full_url, False)
|
|||
|
|
|
|||
|
|
self.finished_signal.emit()
|
|||
|
|
|
|||
|
|
def cancel(self):
|
|||
|
|
"""Sets the cancellation flag to stop the thread gracefully."""
|
|||
|
|
self.progress_signal.emit(" [External Links] Cancellation signal received by thread.")
|
|||
|
|
self.is_cancelled = True
|