diff --git a/tidal_dl_ng/dialog.py b/tidal_dl_ng/dialog.py
index 43d14b1..8757675 100644
--- a/tidal_dl_ng/dialog.py
+++ b/tidal_dl_ng/dialog.py
@@ -1,13 +1,25 @@
-from PySide6.QtWidgets import QDialog
+import os.path
+from enum import Enum
+from pathlib import Path
+
+from PySide6 import QtCore, QtGui, QtWidgets
+from tidalapi import Quality as QualityAudio
from tidal_dl_ng import __version__
+from tidal_dl_ng.config import Settings
+from tidal_dl_ng.constants import CoverDimensions, QualityVideo, SkipExisting
+from tidal_dl_ng.model.cfg import HelpSettings
+from tidal_dl_ng.model.cfg import Settings as ModelSettings
from tidal_dl_ng.ui.dialog_login import Ui_DialogLogin
+from tidal_dl_ng.ui.dialog_settings import Ui_DialogSettings
from tidal_dl_ng.ui.dialog_version import Ui_DialogVersion
-class DialogVersion(QDialog):
+class DialogVersion(QtWidgets.QDialog):
"""Version dialog."""
+ ui: Ui_DialogVersion
+
def __init__(self, parent=None):
super().__init__(parent)
@@ -22,9 +34,10 @@ class DialogVersion(QDialog):
self.exec()
-class DialogLogin(QDialog):
+class DialogLogin(QtWidgets.QDialog):
"""Version dialog."""
+ ui: Ui_DialogLogin
url_redirect: str
return_code: int
@@ -44,5 +57,151 @@ class DialogLogin(QDialog):
self.url_redirect = self.ui.te_url_redirect.toPlainText()
- def accept1(self):
- pass
+
+class DialogPreferences(QtWidgets.QDialog):
+ """Preferences dialog."""
+
+ ui: Ui_DialogSettings
+ settings: Settings
+ data: ModelSettings
+ s_settings_save: QtCore.Signal
+ icon: QtGui.QIcon
+ help_settings: HelpSettings
+ parameters_checkboxes: [str]
+ parameters_combo: [(str, Enum)]
+ parameters_line_edit: [str]
+ prefix_checkbox: str = "cb_"
+ prefix_label: str = "l_"
+ prefix_icon: str = "icon_"
+ prefix_line_edit: str = "le_"
+ prefix_combo: str = "c_"
+
+ def __init__(self, settings: Settings, settings_save: QtCore.Signal, parent=None):
+ super().__init__(parent)
+
+ self.settings = settings
+ self.data = settings.data
+ self.s_settings_save = settings_save
+ self.help_settings = HelpSettings()
+ pixmapi: QtWidgets.QStyle.StandardPixmap = QtWidgets.QStyle.SP_MessageBoxQuestion
+ self.icon = self.style().standardIcon(pixmapi)
+
+ self.parameters_checkboxes = [
+ "lyrics_embed",
+ "lyrics_file",
+ "video_download",
+ "download_delay",
+ "video_convert_mp4",
+ ]
+ self.parameters_combo = [
+ ("skip_existing", SkipExisting),
+ ("quality_audio", QualityAudio),
+ ("quality_video", QualityVideo),
+ ("metadata_cover_dimension", CoverDimensions),
+ ]
+ self.parameters_line_edit = [
+ "download_base_path",
+ "format_album",
+ "format_playlist",
+ "format_mix",
+ "format_track",
+ "format_video",
+ ]
+
+ # Create an instance of the GUI
+ self.ui = Ui_DialogSettings()
+
+ # Run the .setupUi() method to show the GUI
+ self.ui.setupUi(self)
+ # Set data.
+ self.gui_populate()
+
+ self.exec()
+
+ def gui_populate(self):
+ self.populate_checkboxes()
+ self.populate_combo()
+ self.populate_line_edit()
+
+ def dialog_dir_open(self, obj_line_edit):
+ # If a path is set, use it otherwise the users home directory.
+ settings_path: str = os.path.expanduser(obj_line_edit.text()) if obj_line_edit.text() else ""
+ dir_current = settings_path if settings_path and os.path.exists(settings_path) else str(Path.home())
+ dialog = QtWidgets.QFileDialog()
+
+ # Set to directory mode only but show files.
+ dialog.setFileMode(QtWidgets.QFileDialog.Directory)
+ dialog.setViewMode(QtWidgets.QFileDialog.Detail)
+ dialog.setOption(QtWidgets.QFileDialog.ShowDirsOnly, False)
+ # There is a bug in the PyQt implementation, which hides files in Directory mode.
+ # Thus, we need to use the PyQt dialog instead of the native dialog.
+ if os.name == "nt":
+ dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
+ dialog.setDirectory(dir_current)
+
+ # Execute dialog and set path is something is choosen.
+ if dialog.exec():
+ dir_name = dialog.selectedFiles()[0]
+ path = Path(dir_name)
+ obj_line_edit.setText(str(path))
+
+ def populate_line_edit(self):
+
+ for pn in self.parameters_line_edit:
+ label_icon: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + self.prefix_icon + pn)
+ label: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + pn)
+ line_edit: QtWidgets.QLineEdit = getattr(self.ui, self.prefix_line_edit + pn)
+
+ label_icon.setPixmap(QtGui.QPixmap(self.icon.pixmap(QtCore.QSize(16, 16))))
+ label_icon.setToolTip(getattr(self.help_settings, pn))
+ label.setText(pn)
+ line_edit.setText(getattr(self.data, pn))
+
+ # Base Path File Dialog
+ self.ui.b_download_base_path.clicked.connect(lambda x: self.dialog_dir_open(self.ui.le_download_base_path))
+
+ def populate_combo(self):
+
+ for p in self.parameters_combo:
+ pn: str = p[0]
+ values: Enum = p[1]
+ label_icon: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + self.prefix_icon + pn)
+ label: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + pn)
+ combo: QtWidgets.QComboBox = getattr(self.ui, self.prefix_combo + pn)
+ setting_current = getattr(self.data, pn)
+
+ label_icon.setPixmap(QtGui.QPixmap(self.icon.pixmap(QtCore.QSize(16, 16))))
+ label_icon.setToolTip(getattr(self.help_settings, pn))
+ label.setText(pn)
+
+ for index, v in enumerate(values):
+ combo.addItem(v.name, v)
+
+ if v == setting_current:
+ combo.setCurrentIndex(index)
+
+ def populate_checkboxes(self):
+ for pn in self.parameters_checkboxes:
+ checkbox: QtWidgets.QCheckBox = getattr(self.ui, self.prefix_checkbox + pn)
+
+ checkbox.setText(pn)
+ checkbox.setToolTip(getattr(self.help_settings, pn))
+ checkbox.setIcon(self.icon)
+ checkbox.setChecked(getattr(self.data, pn))
+
+ def accept(self):
+ # Get settings. TODO
+ self.to_settings()
+ self.done(1)
+
+ def to_settings(self):
+ for item in self.parameters_checkboxes:
+ setattr(self.settings.data, item, getattr(self.ui, self.prefix_checkbox + item).isChecked())
+
+ for item in self.parameters_line_edit:
+ setattr(self.settings.data, item, getattr(self.ui, self.prefix_line_edit + item).text())
+
+ for item in self.parameters_combo:
+ setattr(self.settings.data, item[0], getattr(self.ui, self.prefix_combo + item[0]).currentData())
+
+ self.s_settings_save.emit()
diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py
index 267ff3b..81f70a4 100644
--- a/tidal_dl_ng/gui.py
+++ b/tidal_dl_ng/gui.py
@@ -5,7 +5,7 @@ from collections.abc import Callable
from requests.exceptions import HTTPError
from tidal_dl_ng import __version__
-from tidal_dl_ng.dialog import DialogLogin, DialogVersion
+from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion
from tidal_dl_ng.helper.path import get_format_template
from tidal_dl_ng.helper.tidal import items_results_all, search_results_all, user_media_lists
@@ -52,6 +52,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
s_populate_tree_lists: QtCore.Signal = QtCore.Signal(list)
s_statusbar_message: QtCore.Signal = QtCore.Signal(object)
s_tr_results_add_top_level_item: QtCore.Signal = QtCore.Signal(object)
+ s_settings_save: QtCore.Signal = QtCore.Signal()
def __init__(self, tidal: Tidal | None = None):
super().__init__()
@@ -326,6 +327,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def on_tr_results_add_top_level_item(self, widget_item: QtWidgets.QTreeWidgetItem):
self.tr_results.addTopLevelItem(widget_item)
+ def on_settings_save(self):
+ self.settings.save()
+ self.apply_settings(self.settings)
+
def search(self, query: str, types_media: SearchTypes) -> [ResultItem]:
result_search: dict[str, [SearchTypes]] = search_results_all(
session=self.tidal.session, needle=query, types_media=types_media
@@ -410,10 +415,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.s_populate_tree_lists.connect(self.on_populate_tree_lists)
self.s_statusbar_message.connect(self.on_statusbar_message)
self.s_tr_results_add_top_level_item.connect(self.on_tr_results_add_top_level_item)
+ self.s_settings_save.connect(self.on_settings_save)
# Menubar
self.a_exit.triggered.connect(sys.exit)
self.a_version.triggered.connect(self.on_version)
+ self.a_preferences.triggered.connect(self.on_preferences)
# Results
self.tr_results.itemExpanded.connect(self.on_tr_results_expanded)
@@ -520,6 +527,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def on_version(self) -> None:
DialogVersion(self)
+ def on_preferences(self) -> None:
+ DialogPreferences(settings=self.settings, settings_save=self.s_settings_save, parent=self)
+
def on_tr_results_expanded(self, child: QtWidgets.QTreeWidgetItem) -> None:
child.removeChild(child.child(0))
media_list: [Mix | Album | Playlist] = child.data(5, QtCore.Qt.ItemDataRole.UserRole)
diff --git a/tidal_dl_ng/model/cfg.py b/tidal_dl_ng/model/cfg.py
index 0af7f84..9997101 100644
--- a/tidal_dl_ng/model/cfg.py
+++ b/tidal_dl_ng/model/cfg.py
@@ -22,7 +22,7 @@ class Settings:
# TODO: Implement multi threading for downloads.
# multi_thread: bool = False
download_delay: bool = True
- download_base_path: str = "./download"
+ download_base_path: str = "~/download"
quality_audio: Quality = Quality.low_320k
quality_video: QualityVideo = QualityVideo.P480
format_album: str = "Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - {track_title}"
diff --git a/tidal_dl_ng/ui/dialog_settings.py b/tidal_dl_ng/ui/dialog_settings.py
new file mode 100644
index 0000000..019fdc6
--- /dev/null
+++ b/tidal_dl_ng/ui/dialog_settings.py
@@ -0,0 +1,493 @@
+################################################################################
+## Form generated from reading UI file 'dialog_settings.ui'
+##
+## Created by: Qt User Interface Compiler version 6.6.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import QCoreApplication, QMetaObject, Qt
+from PySide6.QtWidgets import (
+ QCheckBox,
+ QComboBox,
+ QDialogButtonBox,
+ QGroupBox,
+ QHBoxLayout,
+ QLabel,
+ QLayout,
+ QLineEdit,
+ QPushButton,
+ QSizePolicy,
+ QVBoxLayout,
+)
+
+
+class Ui_DialogSettings:
+ def setupUi(self, DialogSettings):
+ if not DialogSettings.objectName():
+ DialogSettings.setObjectName("DialogSettings")
+ DialogSettings.resize(640, 682)
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(100)
+ sizePolicy.setVerticalStretch(100)
+ sizePolicy.setHeightForWidth(DialogSettings.sizePolicy().hasHeightForWidth())
+ DialogSettings.setSizePolicy(sizePolicy)
+ DialogSettings.setSizeGripEnabled(True)
+ self.lv_dialog_settings = QVBoxLayout(DialogSettings)
+ self.lv_dialog_settings.setObjectName("lv_dialog_settings")
+ self.lv_dialog_settings.setContentsMargins(0, 0, 0, 0)
+ self.lv_main = QVBoxLayout()
+ self.lv_main.setObjectName("lv_main")
+ self.lv_main.setContentsMargins(12, 12, 12, 12)
+ self.gb_flags = QGroupBox(DialogSettings)
+ self.gb_flags.setObjectName("gb_flags")
+ sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
+ sizePolicy1.setHorizontalStretch(100)
+ sizePolicy1.setVerticalStretch(100)
+ sizePolicy1.setHeightForWidth(self.gb_flags.sizePolicy().hasHeightForWidth())
+ self.gb_flags.setSizePolicy(sizePolicy1)
+ self.gb_flags.setFlat(False)
+ self.gb_flags.setCheckable(False)
+ self.lv_flags = QVBoxLayout(self.gb_flags)
+ self.lv_flags.setObjectName("lv_flags")
+ self.lh_flags_1 = QHBoxLayout()
+ self.lh_flags_1.setObjectName("lh_flags_1")
+ self.lv_flags_video_download = QVBoxLayout()
+ self.lv_flags_video_download.setObjectName("lv_flags_video_download")
+ self.cb_video_download = QCheckBox(self.gb_flags)
+ self.cb_video_download.setObjectName("cb_video_download")
+ sizePolicy1.setHeightForWidth(self.cb_video_download.sizePolicy().hasHeightForWidth())
+ self.cb_video_download.setSizePolicy(sizePolicy1)
+
+ self.lv_flags_video_download.addWidget(self.cb_video_download)
+
+ self.lh_flags_1.addLayout(self.lv_flags_video_download)
+
+ self.lv_flags_video_convert = QVBoxLayout()
+ self.lv_flags_video_convert.setObjectName("lv_flags_video_convert")
+ self.cb_video_convert_mp4 = QCheckBox(self.gb_flags)
+ self.cb_video_convert_mp4.setObjectName("cb_video_convert_mp4")
+ sizePolicy1.setHeightForWidth(self.cb_video_convert_mp4.sizePolicy().hasHeightForWidth())
+ self.cb_video_convert_mp4.setSizePolicy(sizePolicy1)
+
+ self.lv_flags_video_convert.addWidget(self.cb_video_convert_mp4)
+
+ self.lh_flags_1.addLayout(self.lv_flags_video_convert)
+
+ self.lv_flags.addLayout(self.lh_flags_1)
+
+ self.lh_flags_2 = QHBoxLayout()
+ self.lh_flags_2.setObjectName("lh_flags_2")
+ self.lh_flags_lyrics_embed = QHBoxLayout()
+ self.lh_flags_lyrics_embed.setObjectName("lh_flags_lyrics_embed")
+ self.cb_lyrics_embed = QCheckBox(self.gb_flags)
+ self.cb_lyrics_embed.setObjectName("cb_lyrics_embed")
+ sizePolicy2 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
+ sizePolicy2.setHorizontalStretch(0)
+ sizePolicy2.setVerticalStretch(0)
+ sizePolicy2.setHeightForWidth(self.cb_lyrics_embed.sizePolicy().hasHeightForWidth())
+ self.cb_lyrics_embed.setSizePolicy(sizePolicy2)
+
+ self.lh_flags_lyrics_embed.addWidget(self.cb_lyrics_embed)
+
+ self.lh_flags_2.addLayout(self.lh_flags_lyrics_embed)
+
+ self.lh_flags_lyrics_file = QHBoxLayout()
+ self.lh_flags_lyrics_file.setObjectName("lh_flags_lyrics_file")
+ self.cb_lyrics_file = QCheckBox(self.gb_flags)
+ self.cb_lyrics_file.setObjectName("cb_lyrics_file")
+ sizePolicy1.setHeightForWidth(self.cb_lyrics_file.sizePolicy().hasHeightForWidth())
+ self.cb_lyrics_file.setSizePolicy(sizePolicy1)
+
+ self.lh_flags_lyrics_file.addWidget(self.cb_lyrics_file)
+
+ self.lh_flags_2.addLayout(self.lh_flags_lyrics_file)
+
+ self.lv_flags.addLayout(self.lh_flags_2)
+
+ self.lh_flag_3 = QHBoxLayout()
+ self.lh_flag_3.setObjectName("lh_flag_3")
+ self.lv_flag_download_delay = QVBoxLayout()
+ self.lv_flag_download_delay.setObjectName("lv_flag_download_delay")
+ self.cb_download_delay = QCheckBox(self.gb_flags)
+ self.cb_download_delay.setObjectName("cb_download_delay")
+ sizePolicy1.setHeightForWidth(self.cb_download_delay.sizePolicy().hasHeightForWidth())
+ self.cb_download_delay.setSizePolicy(sizePolicy1)
+
+ self.lv_flag_download_delay.addWidget(self.cb_download_delay)
+
+ self.lh_flag_3.addLayout(self.lv_flag_download_delay)
+
+ self.verticalLayout_4 = QVBoxLayout()
+ self.verticalLayout_4.setObjectName("verticalLayout_4")
+
+ self.lh_flag_3.addLayout(self.verticalLayout_4)
+
+ self.lv_flags.addLayout(self.lh_flag_3)
+
+ self.lv_main.addWidget(self.gb_flags)
+
+ self.gb_choices = QGroupBox(DialogSettings)
+ self.gb_choices.setObjectName("gb_choices")
+ sizePolicy3 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
+ sizePolicy3.setHorizontalStretch(0)
+ sizePolicy3.setVerticalStretch(0)
+ sizePolicy3.setHeightForWidth(self.gb_choices.sizePolicy().hasHeightForWidth())
+ self.gb_choices.setSizePolicy(sizePolicy3)
+ self.lv_choices = QVBoxLayout(self.gb_choices)
+ self.lv_choices.setObjectName("lv_choices")
+ self.lh_choices_skip_existing = QHBoxLayout()
+ self.lh_choices_skip_existing.setObjectName("lh_choices_skip_existing")
+ self.l_icon_skip_existing = QLabel(self.gb_choices)
+ self.l_icon_skip_existing.setObjectName("l_icon_skip_existing")
+ sizePolicy4 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ sizePolicy4.setHorizontalStretch(0)
+ sizePolicy4.setVerticalStretch(0)
+ sizePolicy4.setHeightForWidth(self.l_icon_skip_existing.sizePolicy().hasHeightForWidth())
+ self.l_icon_skip_existing.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_skip_existing.addWidget(self.l_icon_skip_existing)
+
+ self.l_skip_existing = QLabel(self.gb_choices)
+ self.l_skip_existing.setObjectName("l_skip_existing")
+ sizePolicy4.setHeightForWidth(self.l_skip_existing.sizePolicy().hasHeightForWidth())
+ self.l_skip_existing.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_skip_existing.addWidget(self.l_skip_existing)
+
+ self.c_skip_existing = QComboBox(self.gb_choices)
+ self.c_skip_existing.setObjectName("c_skip_existing")
+
+ self.lh_choices_skip_existing.addWidget(self.c_skip_existing)
+
+ self.lh_choices_skip_existing.setStretch(2, 50)
+
+ self.lv_choices.addLayout(self.lh_choices_skip_existing)
+
+ self.lh_choices_quality_audio = QHBoxLayout()
+ self.lh_choices_quality_audio.setObjectName("lh_choices_quality_audio")
+ self.l_icon_quality_audio = QLabel(self.gb_choices)
+ self.l_icon_quality_audio.setObjectName("l_icon_quality_audio")
+ sizePolicy4.setHeightForWidth(self.l_icon_quality_audio.sizePolicy().hasHeightForWidth())
+ self.l_icon_quality_audio.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_quality_audio.addWidget(self.l_icon_quality_audio)
+
+ self.l_quality_audio = QLabel(self.gb_choices)
+ self.l_quality_audio.setObjectName("l_quality_audio")
+ sizePolicy4.setHeightForWidth(self.l_quality_audio.sizePolicy().hasHeightForWidth())
+ self.l_quality_audio.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_quality_audio.addWidget(self.l_quality_audio)
+
+ self.c_quality_audio = QComboBox(self.gb_choices)
+ self.c_quality_audio.setObjectName("c_quality_audio")
+
+ self.lh_choices_quality_audio.addWidget(self.c_quality_audio)
+
+ self.lh_choices_quality_audio.setStretch(2, 50)
+
+ self.lv_choices.addLayout(self.lh_choices_quality_audio)
+
+ self.lh_choices_quality_video = QHBoxLayout()
+ self.lh_choices_quality_video.setObjectName("lh_choices_quality_video")
+ self.l_icon_quality_video = QLabel(self.gb_choices)
+ self.l_icon_quality_video.setObjectName("l_icon_quality_video")
+ sizePolicy4.setHeightForWidth(self.l_icon_quality_video.sizePolicy().hasHeightForWidth())
+ self.l_icon_quality_video.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_quality_video.addWidget(self.l_icon_quality_video)
+
+ self.l_quality_video = QLabel(self.gb_choices)
+ self.l_quality_video.setObjectName("l_quality_video")
+ sizePolicy4.setHeightForWidth(self.l_quality_video.sizePolicy().hasHeightForWidth())
+ self.l_quality_video.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_quality_video.addWidget(self.l_quality_video)
+
+ self.c_quality_video = QComboBox(self.gb_choices)
+ self.c_quality_video.setObjectName("c_quality_video")
+
+ self.lh_choices_quality_video.addWidget(self.c_quality_video)
+
+ self.lh_choices_quality_video.setStretch(2, 50)
+
+ self.lv_choices.addLayout(self.lh_choices_quality_video)
+
+ self.lh_choices_cover_dimension = QHBoxLayout()
+ self.lh_choices_cover_dimension.setObjectName("lh_choices_cover_dimension")
+ self.lh_choices_cover_dimension.setSizeConstraint(QLayout.SetDefaultConstraint)
+ self.l_icon_metadata_cover_dimension = QLabel(self.gb_choices)
+ self.l_icon_metadata_cover_dimension.setObjectName("l_icon_metadata_cover_dimension")
+ sizePolicy4.setHeightForWidth(self.l_icon_metadata_cover_dimension.sizePolicy().hasHeightForWidth())
+ self.l_icon_metadata_cover_dimension.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_cover_dimension.addWidget(self.l_icon_metadata_cover_dimension)
+
+ self.l_metadata_cover_dimension = QLabel(self.gb_choices)
+ self.l_metadata_cover_dimension.setObjectName("l_metadata_cover_dimension")
+ sizePolicy4.setHeightForWidth(self.l_metadata_cover_dimension.sizePolicy().hasHeightForWidth())
+ self.l_metadata_cover_dimension.setSizePolicy(sizePolicy4)
+
+ self.lh_choices_cover_dimension.addWidget(self.l_metadata_cover_dimension)
+
+ self.c_metadata_cover_dimension = QComboBox(self.gb_choices)
+ self.c_metadata_cover_dimension.setObjectName("c_metadata_cover_dimension")
+ sizePolicy5 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
+ sizePolicy5.setHorizontalStretch(10)
+ sizePolicy5.setVerticalStretch(0)
+ sizePolicy5.setHeightForWidth(self.c_metadata_cover_dimension.sizePolicy().hasHeightForWidth())
+ self.c_metadata_cover_dimension.setSizePolicy(sizePolicy5)
+
+ self.lh_choices_cover_dimension.addWidget(self.c_metadata_cover_dimension)
+
+ self.lh_choices_cover_dimension.setStretch(2, 50)
+
+ self.lv_choices.addLayout(self.lh_choices_cover_dimension)
+
+ self.lv_main.addWidget(self.gb_choices)
+
+ self.gb_path = QGroupBox(DialogSettings)
+ self.gb_path.setObjectName("gb_path")
+ self.horizontalLayout_2 = QHBoxLayout(self.gb_path)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.verticalLayout_2 = QVBoxLayout()
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.lh_path_base = QHBoxLayout()
+ self.lh_path_base.setObjectName("lh_path_base")
+ self.l_icon_download_base_path = QLabel(self.gb_path)
+ self.l_icon_download_base_path.setObjectName("l_icon_download_base_path")
+ sizePolicy4.setHeightForWidth(self.l_icon_download_base_path.sizePolicy().hasHeightForWidth())
+ self.l_icon_download_base_path.setSizePolicy(sizePolicy4)
+
+ self.lh_path_base.addWidget(self.l_icon_download_base_path)
+
+ self.l_download_base_path = QLabel(self.gb_path)
+ self.l_download_base_path.setObjectName("l_download_base_path")
+ sizePolicy3.setHeightForWidth(self.l_download_base_path.sizePolicy().hasHeightForWidth())
+ self.l_download_base_path.setSizePolicy(sizePolicy3)
+
+ self.lh_path_base.addWidget(self.l_download_base_path)
+
+ self.verticalLayout_2.addLayout(self.lh_path_base)
+
+ self.lh_path_fmt_track = QHBoxLayout()
+ self.lh_path_fmt_track.setObjectName("lh_path_fmt_track")
+ self.l_icon_format_track = QLabel(self.gb_path)
+ self.l_icon_format_track.setObjectName("l_icon_format_track")
+ sizePolicy4.setHeightForWidth(self.l_icon_format_track.sizePolicy().hasHeightForWidth())
+ self.l_icon_format_track.setSizePolicy(sizePolicy4)
+
+ self.lh_path_fmt_track.addWidget(self.l_icon_format_track)
+
+ self.l_format_track = QLabel(self.gb_path)
+ self.l_format_track.setObjectName("l_format_track")
+ sizePolicy3.setHeightForWidth(self.l_format_track.sizePolicy().hasHeightForWidth())
+ self.l_format_track.setSizePolicy(sizePolicy3)
+
+ self.lh_path_fmt_track.addWidget(self.l_format_track)
+
+ self.verticalLayout_2.addLayout(self.lh_path_fmt_track)
+
+ self.lh_path_fmt_video = QHBoxLayout()
+ self.lh_path_fmt_video.setObjectName("lh_path_fmt_video")
+ self.l_icon_format_video = QLabel(self.gb_path)
+ self.l_icon_format_video.setObjectName("l_icon_format_video")
+ sizePolicy4.setHeightForWidth(self.l_icon_format_video.sizePolicy().hasHeightForWidth())
+ self.l_icon_format_video.setSizePolicy(sizePolicy4)
+
+ self.lh_path_fmt_video.addWidget(self.l_icon_format_video)
+
+ self.l_format_video = QLabel(self.gb_path)
+ self.l_format_video.setObjectName("l_format_video")
+ sizePolicy3.setHeightForWidth(self.l_format_video.sizePolicy().hasHeightForWidth())
+ self.l_format_video.setSizePolicy(sizePolicy3)
+
+ self.lh_path_fmt_video.addWidget(self.l_format_video)
+
+ self.verticalLayout_2.addLayout(self.lh_path_fmt_video)
+
+ self.lh_path_fmt_album = QHBoxLayout()
+ self.lh_path_fmt_album.setObjectName("lh_path_fmt_album")
+ self.l_icon_format_album = QLabel(self.gb_path)
+ self.l_icon_format_album.setObjectName("l_icon_format_album")
+ sizePolicy6 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred)
+ sizePolicy6.setHorizontalStretch(0)
+ sizePolicy6.setVerticalStretch(0)
+ sizePolicy6.setHeightForWidth(self.l_icon_format_album.sizePolicy().hasHeightForWidth())
+ self.l_icon_format_album.setSizePolicy(sizePolicy6)
+
+ self.lh_path_fmt_album.addWidget(self.l_icon_format_album)
+
+ self.l_format_album = QLabel(self.gb_path)
+ self.l_format_album.setObjectName("l_format_album")
+ sizePolicy3.setHeightForWidth(self.l_format_album.sizePolicy().hasHeightForWidth())
+ self.l_format_album.setSizePolicy(sizePolicy3)
+
+ self.lh_path_fmt_album.addWidget(self.l_format_album)
+
+ self.verticalLayout_2.addLayout(self.lh_path_fmt_album)
+
+ self.lh_fpath_mt_playlist = QHBoxLayout()
+ self.lh_fpath_mt_playlist.setObjectName("lh_fpath_mt_playlist")
+ self.l_icon_format_playlist = QLabel(self.gb_path)
+ self.l_icon_format_playlist.setObjectName("l_icon_format_playlist")
+ sizePolicy4.setHeightForWidth(self.l_icon_format_playlist.sizePolicy().hasHeightForWidth())
+ self.l_icon_format_playlist.setSizePolicy(sizePolicy4)
+
+ self.lh_fpath_mt_playlist.addWidget(self.l_icon_format_playlist)
+
+ self.l_format_playlist = QLabel(self.gb_path)
+ self.l_format_playlist.setObjectName("l_format_playlist")
+ sizePolicy3.setHeightForWidth(self.l_format_playlist.sizePolicy().hasHeightForWidth())
+ self.l_format_playlist.setSizePolicy(sizePolicy3)
+
+ self.lh_fpath_mt_playlist.addWidget(self.l_format_playlist)
+
+ self.verticalLayout_2.addLayout(self.lh_fpath_mt_playlist)
+
+ self.lh_path_fmt_mix = QHBoxLayout()
+ self.lh_path_fmt_mix.setObjectName("lh_path_fmt_mix")
+ self.l_icon_format_mix = QLabel(self.gb_path)
+ self.l_icon_format_mix.setObjectName("l_icon_format_mix")
+ sizePolicy6.setHeightForWidth(self.l_icon_format_mix.sizePolicy().hasHeightForWidth())
+ self.l_icon_format_mix.setSizePolicy(sizePolicy6)
+
+ self.lh_path_fmt_mix.addWidget(self.l_icon_format_mix)
+
+ self.l_format_mix = QLabel(self.gb_path)
+ self.l_format_mix.setObjectName("l_format_mix")
+ sizePolicy3.setHeightForWidth(self.l_format_mix.sizePolicy().hasHeightForWidth())
+ self.l_format_mix.setSizePolicy(sizePolicy3)
+
+ self.lh_path_fmt_mix.addWidget(self.l_format_mix)
+
+ self.verticalLayout_2.addLayout(self.lh_path_fmt_mix)
+
+ self.horizontalLayout_2.addLayout(self.verticalLayout_2)
+
+ self.verticalLayout = QVBoxLayout()
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.horizontalLayout_3 = QHBoxLayout()
+ self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+ self.le_download_base_path = QLineEdit(self.gb_path)
+ self.le_download_base_path.setObjectName("le_download_base_path")
+ sizePolicy2.setHeightForWidth(self.le_download_base_path.sizePolicy().hasHeightForWidth())
+ self.le_download_base_path.setSizePolicy(sizePolicy2)
+ self.le_download_base_path.setDragEnabled(True)
+
+ self.horizontalLayout_3.addWidget(self.le_download_base_path)
+
+ self.b_download_base_path = QPushButton(self.gb_path)
+ self.b_download_base_path.setObjectName("b_download_base_path")
+
+ self.horizontalLayout_3.addWidget(self.b_download_base_path)
+
+ self.verticalLayout.addLayout(self.horizontalLayout_3)
+
+ self.horizontalLayout_7 = QHBoxLayout()
+ self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+ self.le_format_track = QLineEdit(self.gb_path)
+ self.le_format_track.setObjectName("le_format_track")
+
+ self.horizontalLayout_7.addWidget(self.le_format_track)
+
+ self.verticalLayout.addLayout(self.horizontalLayout_7)
+
+ self.horizontalLayout_5 = QHBoxLayout()
+ self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+ self.le_format_video = QLineEdit(self.gb_path)
+ self.le_format_video.setObjectName("le_format_video")
+
+ self.horizontalLayout_5.addWidget(self.le_format_video)
+
+ self.verticalLayout.addLayout(self.horizontalLayout_5)
+
+ self.horizontalLayout_6 = QHBoxLayout()
+ self.horizontalLayout_6.setObjectName("horizontalLayout_6")
+ self.le_format_album = QLineEdit(self.gb_path)
+ self.le_format_album.setObjectName("le_format_album")
+
+ self.horizontalLayout_6.addWidget(self.le_format_album)
+
+ self.verticalLayout.addLayout(self.horizontalLayout_6)
+
+ self.horizontalLayout_4 = QHBoxLayout()
+ self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+ self.le_format_playlist = QLineEdit(self.gb_path)
+ self.le_format_playlist.setObjectName("le_format_playlist")
+ sizePolicy2.setHeightForWidth(self.le_format_playlist.sizePolicy().hasHeightForWidth())
+ self.le_format_playlist.setSizePolicy(sizePolicy2)
+
+ self.horizontalLayout_4.addWidget(self.le_format_playlist)
+
+ self.verticalLayout.addLayout(self.horizontalLayout_4)
+
+ self.horizontalLayout_8 = QHBoxLayout()
+ self.horizontalLayout_8.setObjectName("horizontalLayout_8")
+ self.le_format_mix = QLineEdit(self.gb_path)
+ self.le_format_mix.setObjectName("le_format_mix")
+
+ self.horizontalLayout_8.addWidget(self.le_format_mix)
+
+ self.verticalLayout.addLayout(self.horizontalLayout_8)
+
+ self.horizontalLayout_2.addLayout(self.verticalLayout)
+
+ self.horizontalLayout_2.setStretch(1, 50)
+
+ self.lv_main.addWidget(self.gb_path)
+
+ self.bb_dialog = QDialogButtonBox(DialogSettings)
+ self.bb_dialog.setObjectName("bb_dialog")
+ self.bb_dialog.setOrientation(Qt.Horizontal)
+ self.bb_dialog.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)
+
+ self.lv_main.addWidget(self.bb_dialog)
+
+ self.lv_dialog_settings.addLayout(self.lv_main)
+
+ self.retranslateUi(DialogSettings)
+ self.bb_dialog.accepted.connect(DialogSettings.accept)
+ self.bb_dialog.rejected.connect(DialogSettings.reject)
+
+ QMetaObject.connectSlotsByName(DialogSettings)
+
+ # setupUi
+
+ def retranslateUi(self, DialogSettings):
+ DialogSettings.setWindowTitle(QCoreApplication.translate("DialogSettings", "Preferences", None))
+ self.gb_flags.setTitle(QCoreApplication.translate("DialogSettings", "Flags", None))
+ self.cb_video_download.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None))
+ self.cb_video_convert_mp4.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None))
+ # if QT_CONFIG(whatsthis)
+ self.cb_lyrics_embed.setWhatsThis("")
+ # endif // QT_CONFIG(whatsthis)
+ self.cb_lyrics_embed.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None))
+ self.cb_lyrics_file.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None))
+ self.cb_download_delay.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None))
+ self.gb_choices.setTitle(QCoreApplication.translate("DialogSettings", "Choices", None))
+ self.l_icon_skip_existing.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_skip_existing.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_quality_audio.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_quality_audio.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_quality_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_quality_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_metadata_cover_dimension.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_metadata_cover_dimension.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))
+ self.l_icon_format_track.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_format_track.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_format_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_format_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_format_album.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_format_album.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_format_playlist.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_format_playlist.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_icon_format_mix.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.l_format_mix.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None))
+ self.b_download_base_path.setText(QCoreApplication.translate("DialogSettings", "...", None))
+
+ # retranslateUi
diff --git a/tidal_dl_ng/ui/dialog_settings.ui b/tidal_dl_ng/ui/dialog_settings.ui
new file mode 100644
index 0000000..7826271
--- /dev/null
+++ b/tidal_dl_ng/ui/dialog_settings.ui
@@ -0,0 +1,645 @@
+
+
+ DialogSettings
+
+
+
+ 0
+ 0
+ 640
+ 682
+
+
+
+
+ 100
+ 100
+
+
+
+ Preferences
+
+
+ true
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ 12
+
+
+ 12
+
+
+ 12
+
+
+ 12
+
+
-
+
+
+
+ 100
+ 100
+
+
+
+ Flags
+
+
+ false
+
+
+ false
+
+
+
-
+
+
-
+
+
-
+
+
+
+ 100
+ 100
+
+
+
+ CheckBox
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 100
+ 100
+
+
+
+ CheckBox
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ CheckBox
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 100
+ 100
+
+
+
+ CheckBox
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ 100
+ 100
+
+
+
+ CheckBox
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Choices
+
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+
+ -
+
+
+ QLayout::SetDefaultConstraint
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 10
+ 0
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Path
+
+
+
-
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ TextLabel
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ true
+
+
+
+ -
+
+
+ ...
+
+
+
+
+
+ -
+
+
-
+
+
+
+
+ -
+
+
-
+
+
+
+
+ -
+
+
-
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ -
+
+
-
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+
+
+ bb_dialog
+ accepted()
+ DialogSettings
+ accept()
+
+
+ 319
+ 661
+
+
+ 319
+ 340
+
+
+
+
+ bb_dialog
+ rejected()
+ DialogSettings
+ reject()
+
+
+ 319
+ 661
+
+
+ 319
+ 340
+
+
+
+
+
diff --git a/tidal_dl_ng/ui/main.py b/tidal_dl_ng/ui/main.py
index 50c1b2f..65735e6 100644
--- a/tidal_dl_ng/ui/main.py
+++ b/tidal_dl_ng/ui/main.py
@@ -35,7 +35,7 @@ class Ui_MainWindow:
MainWindow.resize(900, 700)
self.a_preferences = QAction(MainWindow)
self.a_preferences.setObjectName("a_preferences")
- self.a_preferences.setEnabled(False)
+ self.a_preferences.setEnabled(True)
self.a_preferences.setText("Preferences...")
self.a_preferences.setIconText("Preferences...")
# if QT_CONFIG(tooltip)
diff --git a/tidal_dl_ng/ui/main.ui b/tidal_dl_ng/ui/main.ui
index 4152dd7..7a5f86f 100644
--- a/tidal_dl_ng/ui/main.ui
+++ b/tidal_dl_ng/ui/main.ui
@@ -568,7 +568,7 @@
- false
+ true
Preferences...