Files

230 lines
8.6 KiB
Python

import threading
from app.models.download_request import DownloadRequest
class MainController:
def __init__(self, app):
self.app = app
def build_request_from_ui(self) -> DownloadRequest:
return DownloadRequest(
url=self.app.url_entry.get().strip(),
download_folder=self.app.download_folder,
download_images=bool(self.app.download_images_check.get()),
download_videos=bool(self.app.download_videos_check.get()),
download_compressed=bool(self.app.download_compressed_check.get()),
max_downloads=getattr(self.app, "max_downloads", 3),
only_this_url=bool(self.app.only_this_url_check.get()),
)
def start_download(self):
request = self.build_request_from_ui()
if not request.download_folder:
self.app.show_error(
self.app.tr("ERROR"),
self.app.tr("PLEASE_SELECT_DOWNLOAD_FOLDER")
)
return
if not request.url:
self.app.show_error(
self.app.tr("ERROR"),
self.app.tr("PLEASE_ENTER_VALID_URL")
)
return
self.app.prepare_download_ui()
parsed = self.app.url_service.parse_download_url(request.url)
download_thread = None
if parsed.site_type == "erome":
self.app.add_log_message_safe(self.app.tr("DOWNLOADING_EROME"))
self.app.setup_erome_downloader(is_profile_download=parsed.is_profile)
self.app.active_downloader = self.app.erome_downloader
if parsed.is_album:
self.app.add_log_message_safe(self.app.tr("ALBUM_URL"))
download_thread = threading.Thread(
target=self.wrapped_download,
args=(
self.app.active_downloader.process_album_page,
request.url,
request.download_folder,
request.download_images,
request.download_videos,
),
daemon=True
)
else:
self.app.add_log_message_safe("bunkr", self.app.tr("PROFILE_URL"))
download_thread = threading.Thread(
target=self.wrapped_download,
args=(
self.app.active_downloader.process_profile_page,
request.url,
request.download_folder,
request.download_images,
request.download_videos,
),
daemon=True
)
elif parsed.site_type == "bunkr":
self.app.add_log_message_safe("bunkr", self.app.tr("DOWNLOADING_BUNKR"))
self.app.setup_bunkr_downloader()
self.app.active_downloader = self.app.bunkr_downloader
if parsed.is_post:
self.app.add_log_message_safe(self.app.tr("POST_URL"))
download_thread = threading.Thread(
target=self.wrapped_download,
args=(self.app.bunkr_downloader.descargar_post_bunkr, request.url),
daemon=True
)
else:
self.app.add_log_message_safe("bunkr", self.app.tr("PROFILE_URL"))
download_thread = threading.Thread(
target=self.wrapped_download,
args=(self.app.bunkr_downloader.descargar_perfil_bunkr, request.url),
daemon=True
)
elif parsed.site_type == "coomer_kemono":
self.app.add_log_message_safe(self.app.tr("STARTING_DOWNLOAD"))
self.app.setup_general_downloader()
self.app.active_downloader = self.app.general_downloader
site = f"{parsed.parsed_url.netloc}"
service = parsed.service
user = parsed.user
post = parsed.post
if service is None or user is None:
if service is None:
self.app.add_log_message_safe(self.app.tr("FAILED_TO_EXTRACT_SERVICE"))
self.app.show_error(
self.app.tr("ERROR"),
self.app.tr("FAILED_TO_EXTRACT_SERVICE")
)
else:
self.app.add_log_message_safe(self.app.tr("FAILED_TO_EXTRACT_USER_ID"))
self.app.show_error(
self.app.tr("ERROR"),
self.app.tr("FAILED_TO_EXTRACT_USER_ID")
)
self.app.add_log_message_safe("SYSTEM", self.app.tr("INVALID_URL"))
self.app.enable_widgets()
return
self.app.add_log_message_safe(
self.app.tr(
"EXTRACTED_SERVICE_SITE",
service=service,
site=site
)
)
if parsed.is_post:
self.app.add_log_message_safe(self.app.tr("DOWNLOADING_SINGLE_POST"))
download_thread = threading.Thread(
target=self.wrapped_download,
args=(self.start_ck_post_download, site, service, user, post),
daemon=True
)
else:
self.app.add_log_message_safe(self.app.tr("DOWNLOADING_ALL_USER_CONTENT"))
download_thread = threading.Thread(
target=self.wrapped_download,
args=(
self.start_ck_profile_download,
site,
service,
user,
parsed.query,
True,
parsed.offset,
request.only_this_url,
),
daemon=True
)
elif parsed.site_type == "simpcity":
self.app.add_log_message_safe(self.app.tr("DOWNLOADING_SIMPCITY"))
self.app.setup_simpcity_downloader()
self.app.active_downloader = self.app.simpcity_downloader
download_thread = threading.Thread(
target=self.wrapped_download,
args=(
self.app.active_downloader.download_images_from_simpcity,
request.url,
not request.only_this_url,
),
daemon=True
)
elif parsed.site_type == "jpg5":
self.app.add_log_message_safe(self.app.tr("DOWNLOADING_FROM_JPG5"))
self.app.setup_jpg5_downloader()
download_thread = threading.Thread(
target=self.wrapped_download,
args=(self.app.active_downloader.descargar_imagenes,),
daemon=True
)
else:
self.app.add_log_message_safe(self.app.tr("INVALID_URL"))
self.app.enable_widgets()
return
if download_thread:
download_thread.start()
self.app.app_state.current_download_thread = download_thread
def wrapped_download(self, download_method, *args):
try:
download_method(*args)
finally:
self.app.active_downloader = None
self.app.enable_widgets()
self.app.export_logs()
def start_ck_profile_download(self, site, service, user, query, download_all, initial_offset, only_this_url=False):
download_info = self.app.active_downloader.download_media(
site,
user,
service,
query=query,
download_all=download_all,
initial_offset=initial_offset,
only_first_page=only_this_url,
)
if download_info:
self.app.add_log_message_safe(
self.app.tr("DOWNLOAD_INFO", download_info=download_info)
)
return download_info
def start_ck_post_download(self, site, service, user, post):
download_info = self.app.active_downloader.download_single_post(site, post, service, user)
if download_info:
self.app.add_log_message_safe(
self.app.tr("DOWNLOAD_INFO", download_info=download_info)
)
return download_info
def cancel_download(self):
if self.app.active_downloader:
try:
self.app.active_downloader.request_cancel()
except Exception:
pass
self.app.active_downloader = None
self.app.clear_progress_bars()
else:
self.app.add_log_message_safe(self.app.tr("NO_ACTIVE_DOWNLOAD_TO_CANCEL"))
self.app.enable_widgets()