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 |