Skip to content

Commit 829c340

Browse files
committed
improve UI
1 parent 36769b3 commit 829c340

File tree

2 files changed

+74
-25
lines changed

2 files changed

+74
-25
lines changed

src/modules/audio_converter.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __init__(self) -> None:
1313
self.output = ""
1414
# outputs
1515
self.allowed_formats = ['aiff', 'wav']
16-
self.allowed_quality = ['normal', 'high']
16+
self.allowed_quality = ['normal', 'high', 'copy']
1717
try:
1818
self.settings = {
1919
"file_filter": config['FileFilter'],
@@ -45,6 +45,12 @@ def __init__(self) -> None:
4545
"bit_rate": None,
4646
"custom": [],
4747
},
48+
"aiff_copy": {
49+
"codec": 'copy',
50+
"sampling_rate": 'copy',
51+
"bit_rate": 'copy',
52+
"custom": [],
53+
},
4854
"wav_normal": {
4955
"codec": 'pcm_s16le', # 16 Bit PCM Little Endian
5056
"sampling_rate": '44100', # 44.1 kHz
@@ -57,6 +63,12 @@ def __init__(self) -> None:
5763
"bit_rate": None,
5864
"custom": [],
5965
},
66+
"wav_copy": {
67+
"codec": 'copy',
68+
"sampling_rate": 'copy',
69+
"bit_rate": 'copy',
70+
"custom": [],
71+
},
6072
}
6173

6274
# all ffmpeg arguments: https://gist.github.com/tayvano/6e2d456a9897f55025e25035478a3a50
@@ -114,17 +126,24 @@ def save_print(self, s):
114126
self.output += "\n"
115127
print(s)
116128

117-
def generate_file_tree(self, path, mirror_file_structure=True, is_file=True):
118-
root_path_parent = Path(path).parent.resolve()
119-
root_target_folder_name = path[len(str(root_path_parent))+1:]
120-
if is_file:
121-
file = Path(path).name
122-
self.save_print(f"\t* {file}")
123-
if self.is_file_type_correct(file):
124-
converted_without_errors = self.convert_file_to_wav_with_ffmpeg(Path(path), str(root_path_parent))
125-
else:
126-
self.save_print(f"\t INFO: ignoring file {file}")
129+
def generate_file_tree(self, paths: list, mirror_file_structure=True, is_files=True):
130+
if len(paths) == 0:
131+
return
132+
133+
if is_files:
134+
for _p in paths:
135+
root_path_parent = Path(_p).parent.resolve()
136+
root_target_folder_name = str(Path(_p).resolve())[len(str(root_path_parent))+1:]
137+
file = Path(_p).name
138+
self.save_print(f"\t* {file}")
139+
if self.is_file_type_correct(file):
140+
converted_without_errors = self.convert_file_to_wav_with_ffmpeg(Path(_p), str(root_path_parent))
141+
else:
142+
self.save_print(f"\t INFO: ignoring file {file}")
127143
else:
144+
directory = paths[0]
145+
root_path_parent = Path(directory).parent.resolve()
146+
root_target_folder_name = str(Path(directory).resolve())[len(str(root_path_parent))+1:]
128147
converted_files_dir_abs = f"{root_path_parent}/{root_target_folder_name}_{self.settings['converted_files_dir_name']}-{int(datetime.utcnow().timestamp())}"
129148
Path(converted_files_dir_abs).mkdir(parents=True, exist_ok=True)
130149

@@ -135,9 +154,9 @@ def generate_file_tree(self, path, mirror_file_structure=True, is_file=True):
135154
"total": 0,
136155
}
137156

138-
for root, subdirs, files in os.walk(path):
157+
for root, subdirs, files in os.walk(directory):
139158
abs_root = Path(root)
140-
relative_root = str(root).replace(path, '')
159+
relative_root = str(root).replace(str(directory), '')
141160
converted_files_subdir_abs = f"{converted_files_dir_abs}/{relative_root}"
142161
Path(converted_files_subdir_abs).mkdir(parents=True, exist_ok=True)
143162
self.save_print(

src/modules/gui1.py

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from modules.audio_converter import AudioConverter
33
from modules.config import config, application_path
44
from pathlib import Path
5+
import subprocess
56

67

78
class ConverterPromptWidget(QtWidgets.QWidget):
@@ -16,11 +17,13 @@ def __init__(self):
1617
self.selected_items = []
1718

1819
self.out_settings_groupbox = QtWidgets.QGroupBox("Output Settings")
20+
self.in_files_groupbox = QtWidgets.QGroupBox("Input Files/Folders (double click to open)")
1921

20-
self.files_list = QtWidgets.QLabel("No File(s) or Directory Selected")
22+
self.__file_list = QtWidgets.QListWidget()
2123
self.convert_button = QtWidgets.QPushButton("Convert File(s)")
2224
self.file_button = QtWidgets.QPushButton("Select File(s)")
2325
self.dir_button = QtWidgets.QPushButton("Select Directory")
26+
self.remove_converted_files_checkbox = QtWidgets.QCheckBox("Remove Converted Files")
2427
self.mirror_checkbox = QtWidgets.QCheckBox("Mirror Folder Structure")
2528
self.dironly_checkbox = QtWidgets.QCheckBox(
2629
"Only allow directory selection")
@@ -33,6 +36,9 @@ def __init__(self):
3336
self.dironly_checkbox.setChecked(True)
3437
self.metadata_naming_checkbox.setChecked(
3538
config['RecreateFileNameFromMetadata'])
39+
self.remove_converted_files_checkbox.setChecked(
40+
config['RemoveConvertedFiles'])
41+
self.remove_converted_files_checkbox.setDisabled(True)
3642

3743
for i in self.audio_converter.allowed_formats:
3844
self.allowed_formats_dropdown.addItem(i)
@@ -43,9 +49,14 @@ def __init__(self):
4349
self.allowed_quality_dropdown.setCurrentText(config['ExportQuality'])
4450

4551
self.layout = QtWidgets.QVBoxLayout(self)
46-
self.layout.addWidget(self.files_list)
52+
self.in_files_groupbox_layout = QtWidgets.QVBoxLayout()
53+
#self.in_files_groupbox_layout.addStretch(1)
54+
self.in_files_groupbox_layout.addWidget(self.__file_list)
55+
self.in_files_groupbox.setLayout(self.in_files_groupbox_layout)
56+
self.layout.addWidget(self.in_files_groupbox)
4757
out_settings_groupbox_layout = QtWidgets.QVBoxLayout()
4858
out_settings_groupbox_layout.addWidget(self.metadata_naming_checkbox)
59+
out_settings_groupbox_layout.addWidget(self.remove_converted_files_checkbox)
4960
out_settings_groupbox_layout.addWidget(self.dironly_checkbox)
5061
out_settings_groupbox_layout.addWidget(self.mirror_checkbox)
5162
out_settings_groupbox_layout.addWidget(QtWidgets.QLabel(
@@ -54,9 +65,9 @@ def __init__(self):
5465
out_settings_groupbox_layout.addWidget(QtWidgets.QLabel(
5566
"Output Audio File Quality", alignment=QtCore.Qt.AlignLeft))
5667
out_settings_groupbox_layout.addWidget(self.allowed_quality_dropdown)
57-
# out_settings_groupbox_layout.addStretch(1)
5868
self.out_settings_groupbox.setLayout(out_settings_groupbox_layout)
5969
self.layout.addWidget(self.out_settings_groupbox)
70+
6071
self.layout.addWidget(self.file_button)
6172
self.layout.addWidget(self.dir_button)
6273
self.layout.addWidget(self.convert_button)
@@ -65,27 +76,42 @@ def __init__(self):
6576
self.file_button.clicked.connect(self.get_files)
6677
self.dir_button.clicked.connect(self.get_dirs)
6778
self.dironly_checkbox.toggled.connect(self.dir_only_checkbox_changed)
68-
self.metadata_naming_checkbox.toggled.connect(
69-
self.metadata_naming_checkbox_changed)
79+
self.metadata_naming_checkbox.toggled.connect(self.metadata_naming_checkbox_changed)
80+
self.remove_converted_files_checkbox.toggled.connect(self.remove_converted_files_checkbox_changed)
81+
self.__file_list.itemDoubleClicked.connect(self.directory_path_clicked)
7082

7183
self.dir_only_checkbox_changed()
7284
self.set_selected_items()
7385

7486
def convert_files(self):
75-
selected_item = self.selected_items[0]
87+
selected_items = []
88+
for x in range(self.__file_list.count()):
89+
selected_items.append(Path(self.__file_list.item(x).text()))
90+
7691
self.audio_converter.settings['export_format'] = self.allowed_formats_dropdown.currentText(
7792
)
7893
self.audio_converter.settings['export_quality'] = self.allowed_quality_dropdown.currentText(
7994
)
8095
is_mirroring_enabled = self.mirror_checkbox.checkState() == QtCore.Qt.CheckState.Checked
81-
is_file = self.dironly_checkbox.checkState() != QtCore.Qt.CheckState.Checked
96+
is_files = self.dironly_checkbox.checkState() != QtCore.Qt.CheckState.Checked
8297
self.audio_converter.generate_file_tree(
83-
selected_item, mirror_file_structure=is_mirroring_enabled, is_file=is_file)
98+
selected_items, mirror_file_structure=is_mirroring_enabled, is_files=is_files)
99+
100+
def directory_path_clicked(self, item: QtWidgets.QListWidgetItem):
101+
path = Path(item.text())
102+
if Path.is_dir(path):
103+
path = str(path.resolve())
104+
else:
105+
path = str(path.parent.resolve())
106+
subprocess.Popen(f'explorer "{path}"')
84107

85108
def metadata_naming_checkbox_changed(self):
86109
is_checked = self.metadata_naming_checkbox.checkState() == QtCore.Qt.CheckState.Checked
87110
p_val = self.audio_converter.settings['file_name_modifications']['recreate_file_name_from_metadata']
88111
self.audio_converter.settings['file_name_modifications']['recreate_file_name_from_metadata'] = not p_val
112+
113+
def remove_converted_files_checkbox_changed(self):
114+
pass
89115

90116
def dir_only_checkbox_changed(self):
91117
is_checked = self.dironly_checkbox.checkState() == QtCore.Qt.CheckState.Checked
@@ -96,10 +122,13 @@ def dir_only_checkbox_changed(self):
96122
def set_selected_items(self, items: list = []):
97123
self.selected_items = items
98124
no_items_selected = len(items) == 0
99-
self.files_list.setText(
100-
"No File(s) or Directory Selected" if no_items_selected else str(items))
101125
self.convert_button.setDisabled(no_items_selected)
102126

127+
self.__file_list.clear()
128+
if not no_items_selected:
129+
for i in items:
130+
self.__file_list.addItem(i)
131+
103132
def get_dirs(self):
104133
dlg = QtWidgets.QFileDialog(self, 'Select Directory')
105134
dlg.setFileMode(QtWidgets.QFileDialog.Directory)
@@ -112,7 +141,8 @@ def get_dirs(self):
112141

113142
def get_files(self):
114143
dlg = QtWidgets.QFileDialog(self, 'Select File(s)')
115-
# dlg.setFileMode(QtWidgets.QFileDialog.AnyFile)
144+
dlg.setFileMode(QtWidgets.QFileDialog.ExistingFiles)
145+
116146
filter_raw = ""
117147
for fex in config['FileFilter'].split('|'):
118148
filter_raw += f"*.{fex} "
@@ -121,8 +151,8 @@ def get_files(self):
121151
file_filter = f"Audio Files ({filter_raw})"
122152
dlg.setNameFilters([file_filter, "Any (*)"])
123153
dlg.selectNameFilter(file_filter)
124-
filenames = []
125154

155+
filenames = []
126156
if dlg.exec():
127157
filenames = dlg.selectedFiles()
128158
self.set_selected_items(filenames)

0 commit comments

Comments
 (0)