mirror of
https://github.com/Yuvi9587/Kemono-Downloader.git
synced 2025-12-29 16:14:44 +00:00
118 lines
4.7 KiB
Python
118 lines
4.7 KiB
Python
|
|
# multipart_scope_dialog.py
|
||
|
|
from PyQt5.QtWidgets import (
|
||
|
|
QDialog, QVBoxLayout, QGroupBox, QRadioButton, QDialogButtonBox, QButtonGroup,
|
||
|
|
QLabel, QLineEdit, QHBoxLayout, QFrame
|
||
|
|
)
|
||
|
|
from PyQt5.QtGui import QIntValidator
|
||
|
|
from PyQt5.QtCore import Qt
|
||
|
|
|
||
|
|
# It's good practice to get this constant from the source
|
||
|
|
# but for this example, we will define it here.
|
||
|
|
MAX_PARTS = 16
|
||
|
|
|
||
|
|
class MultipartScopeDialog(QDialog):
|
||
|
|
"""
|
||
|
|
A dialog to let the user select the scope, number of parts, and minimum size for multipart downloads.
|
||
|
|
"""
|
||
|
|
SCOPE_VIDEOS = 'videos'
|
||
|
|
SCOPE_ARCHIVES = 'archives'
|
||
|
|
SCOPE_BOTH = 'both'
|
||
|
|
|
||
|
|
def __init__(self, current_scope='both', current_parts=4, current_min_size_mb=100, parent=None):
|
||
|
|
super().__init__(parent)
|
||
|
|
self.setWindowTitle("Multipart Download Options")
|
||
|
|
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
|
||
|
|
self.setMinimumWidth(350)
|
||
|
|
|
||
|
|
# Main Layout
|
||
|
|
layout = QVBoxLayout(self)
|
||
|
|
|
||
|
|
# --- Options Group for Scope ---
|
||
|
|
self.options_group_box = QGroupBox("Apply multipart downloads to:")
|
||
|
|
options_layout = QVBoxLayout()
|
||
|
|
# ... (Radio buttons and button group code remains unchanged) ...
|
||
|
|
self.radio_videos = QRadioButton("Videos Only")
|
||
|
|
self.radio_archives = QRadioButton("Archives Only (.zip, .rar, etc.)")
|
||
|
|
self.radio_both = QRadioButton("Both Videos and Archives")
|
||
|
|
|
||
|
|
if current_scope == self.SCOPE_VIDEOS:
|
||
|
|
self.radio_videos.setChecked(True)
|
||
|
|
elif current_scope == self.SCOPE_ARCHIVES:
|
||
|
|
self.radio_archives.setChecked(True)
|
||
|
|
else:
|
||
|
|
self.radio_both.setChecked(True)
|
||
|
|
|
||
|
|
self.button_group = QButtonGroup(self)
|
||
|
|
self.button_group.addButton(self.radio_videos)
|
||
|
|
self.button_group.addButton(self.radio_archives)
|
||
|
|
self.button_group.addButton(self.radio_both)
|
||
|
|
|
||
|
|
options_layout.addWidget(self.radio_videos)
|
||
|
|
options_layout.addWidget(self.radio_archives)
|
||
|
|
options_layout.addWidget(self.radio_both)
|
||
|
|
self.options_group_box.setLayout(options_layout)
|
||
|
|
layout.addWidget(self.options_group_box)
|
||
|
|
|
||
|
|
# --- START: MODIFIED Download Settings Group ---
|
||
|
|
self.settings_group_box = QGroupBox("Download settings:")
|
||
|
|
settings_layout = QVBoxLayout()
|
||
|
|
|
||
|
|
# Layout for Parts count
|
||
|
|
parts_layout = QHBoxLayout()
|
||
|
|
self.parts_label = QLabel("Number of download parts per file:")
|
||
|
|
self.parts_input = QLineEdit(str(current_parts))
|
||
|
|
self.parts_input.setValidator(QIntValidator(2, MAX_PARTS, self))
|
||
|
|
self.parts_input.setFixedWidth(40)
|
||
|
|
self.parts_input.setToolTip(f"Set the number of concurrent connections per file (2-{MAX_PARTS}).")
|
||
|
|
parts_layout.addWidget(self.parts_label)
|
||
|
|
parts_layout.addStretch()
|
||
|
|
parts_layout.addWidget(self.parts_input)
|
||
|
|
settings_layout.addLayout(parts_layout)
|
||
|
|
|
||
|
|
# Layout for Minimum Size
|
||
|
|
size_layout = QHBoxLayout()
|
||
|
|
self.size_label = QLabel("Minimum file size for multipart (MB):")
|
||
|
|
self.size_input = QLineEdit(str(current_min_size_mb))
|
||
|
|
self.size_input.setValidator(QIntValidator(10, 10000, self)) # Min 10MB, Max ~10GB
|
||
|
|
self.size_input.setFixedWidth(40)
|
||
|
|
self.size_input.setToolTip("Files smaller than this will use a normal, single-part download.")
|
||
|
|
size_layout.addWidget(self.size_label)
|
||
|
|
size_layout.addStretch()
|
||
|
|
size_layout.addWidget(self.size_input)
|
||
|
|
settings_layout.addLayout(size_layout)
|
||
|
|
|
||
|
|
self.settings_group_box.setLayout(settings_layout)
|
||
|
|
layout.addWidget(self.settings_group_box)
|
||
|
|
# --- END: MODIFIED Download Settings Group ---
|
||
|
|
|
||
|
|
# OK and Cancel Buttons
|
||
|
|
self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||
|
|
self.button_box.accepted.connect(self.accept)
|
||
|
|
self.button_box.rejected.connect(self.reject)
|
||
|
|
layout.addWidget(self.button_box)
|
||
|
|
|
||
|
|
self.setLayout(layout)
|
||
|
|
|
||
|
|
def get_selected_scope(self):
|
||
|
|
# ... (This method remains unchanged) ...
|
||
|
|
if self.radio_videos.isChecked():
|
||
|
|
return self.SCOPE_VIDEOS
|
||
|
|
if self.radio_archives.isChecked():
|
||
|
|
return self.SCOPE_ARCHIVES
|
||
|
|
return self.SCOPE_BOTH
|
||
|
|
|
||
|
|
def get_selected_parts(self):
|
||
|
|
# ... (This method remains unchanged) ...
|
||
|
|
try:
|
||
|
|
parts = int(self.parts_input.text())
|
||
|
|
return max(2, min(parts, MAX_PARTS))
|
||
|
|
except (ValueError, TypeError):
|
||
|
|
return 4
|
||
|
|
|
||
|
|
def get_selected_min_size(self):
|
||
|
|
"""Returns the selected minimum size in MB as an integer."""
|
||
|
|
try:
|
||
|
|
size = int(self.size_input.text())
|
||
|
|
return max(10, min(size, 10000)) # Enforce valid range
|
||
|
|
except (ValueError, TypeError):
|
||
|
|
return 100 # Return a safe default
|