Merge pull request #281 from exislow/180-feature-multi-threaded-downloads-download-album-covers

✨ Multithreaded downloads implemented (for Playlists, Albums etc.). F…
This commit is contained in:
exislow
2024-12-15 23:35:31 +01:00
committed by GitHub
5 changed files with 80 additions and 19 deletions
+1 -1
View File
@@ -162,7 +162,7 @@ class DialogPreferences(QtWidgets.QDialog):
]
def _init_spin_box(self):
self.parameters_spin_box = ["album_track_num_pad_min"]
self.parameters_spin_box = ["album_track_num_pad_min", "downloads_concurrent_max"]
def _init_comboboxes(self):
self.parameters_combo = [
+11 -3
View File
@@ -621,9 +621,11 @@ class Download:
# Iterate through list items
while not self.progress.finished:
for item_media in items:
# Download the item.
status, result_path_file = self.item(
with futures.ThreadPoolExecutor(max_workers=self.settings.data.downloads_concurrent_max) as executor:
# Dispatch all download tasks to worker threads
l_futures: [any] = [
executor.submit(
self.item,
media=item_media,
file_template=file_name_relative,
quality_audio=quality_audio,
@@ -631,6 +633,12 @@ class Download:
download_delay=download_delay,
is_parent_album=is_album,
)
for item_media in items
]
# Report results as they become available
for future in futures.as_completed(l_futures):
# Retrieve result
status, result_path_file = future.result()
# Advance progress bar.
self.progress.advance(p_task1)
+4 -2
View File
@@ -40,7 +40,8 @@ class Settings:
downloads_simultaneous_per_track_max: int = 20
download_delay_sec_min: float = 3.0
download_delay_sec_max: float = 5.0
album_track_num_pad_min: int = 0
album_track_num_pad_min: int = 1
downloads_concurrent_max: int = 3
@dataclass_json
@@ -86,8 +87,9 @@ class HelpSettings:
download_delay_sec_min: str = "Lower boundary for the calculation of the download delay in seconds."
download_delay_sec_max: str = "Upper boundary for the calculation of the download delay in seconds."
album_track_num_pad_min: str = (
"Minimum length of the album track count, will be padded with zeroes (0). To disable " "padding set this to 0."
"Minimum length of the album track count, will be padded with zeroes (0). To disable padding set this to 1."
)
downloads_concurrent_max: str = "Maximum concurrent number of downloads (threads)."
@dataclass_json
+24 -1
View File
@@ -27,7 +27,7 @@ class Ui_DialogSettings:
def setupUi(self, DialogSettings):
if not DialogSettings.objectName():
DialogSettings.setObjectName("DialogSettings")
DialogSettings.resize(640, 705)
DialogSettings.resize(640, 767)
sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(100)
sizePolicy.setVerticalStretch(100)
@@ -293,6 +293,27 @@ class Ui_DialogSettings:
self.verticalLayout_8.addLayout(self.horizontalLayout_9)
self.horizontalLayout_11 = QHBoxLayout()
self.horizontalLayout_11.setObjectName("horizontalLayout_11")
self.l_downloads_concurrent_max = QLabel(self.gb_numbers)
self.l_downloads_concurrent_max.setObjectName("l_downloads_concurrent_max")
self.horizontalLayout_11.addWidget(self.l_downloads_concurrent_max)
self.l_icon_downloads_concurrent_max = QLabel(self.gb_numbers)
self.l_icon_downloads_concurrent_max.setObjectName("l_icon_downloads_concurrent_max")
self.horizontalLayout_11.addWidget(self.l_icon_downloads_concurrent_max)
self.sb_downloads_concurrent_max = QSpinBox(self.gb_numbers)
self.sb_downloads_concurrent_max.setObjectName("sb_downloads_concurrent_max")
self.sb_downloads_concurrent_max.setMinimum(1)
self.sb_downloads_concurrent_max.setMaximum(5)
self.horizontalLayout_11.addWidget(self.sb_downloads_concurrent_max)
self.verticalLayout_8.addLayout(self.horizontalLayout_11)
self.lv_main.addWidget(self.gb_numbers)
self.gb_path = QGroupBox(DialogSettings)
@@ -563,6 +584,8 @@ class Ui_DialogSettings:
self.gb_numbers.setTitle(QCoreApplication.translate("DialogSettings", "Numbers", None))
self.l_album_track_num_pad_min.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
self.l_icon_album_track_num_pad_min.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
self.l_downloads_concurrent_max.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
self.l_icon_downloads_concurrent_max.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
self.gb_path.setTitle(QCoreApplication.translate("DialogSettings", "Path", None))
self.l_icon_download_base_path.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
self.l_download_base_path.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+29 -1
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>640</width>
<height>705</height>
<height>767</height>
</rect>
</property>
<property name="sizePolicy">
@@ -386,6 +386,34 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_11">
<item>
<widget class="QLabel" name="l_downloads_concurrent_max">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_icon_downloads_concurrent_max">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="sb_downloads_concurrent_max">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>5</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>