import os from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QComboBox, QFileDialog, QMessageBox) from utils.converter import MediaConverter class ConverterTab(QWidget): PRESETS = { "MP4 Estándar (H.264 + AAC)": {"key": "mp4_std", "ext": ".mp4", "tag": "_converted"}, "MP4 Estándar (Máx. 1080p Vertical)": {"key": "mp4_1080p", "ext": ".mp4", "tag": "_1080p"}, "Audio MP3 Estándar (Estéreo 192 kbps)": {"key": "mp3_192k", "ext": ".mp3", "tag": "_audio"}, "Audio MP3 - Solo Canal 1 / Izquierdo (192 kbps)": {"key": "mp3_ch1", "ext": ".mp3", "tag": "_ch1"}, "Audio MP3 - Solo Canal 2 / Derecho (192 kbps)": {"key": "mp3_ch2", "ext": ".mp3", "tag": "_ch2"} } def __init__(self): super().__init__() self.converter_thread = None self.initUI() def initUI(self): layout = QVBoxLayout() # Archivo de entrada layout.addWidget(QLabel("Archivo de entrada (In):")) in_layout = QHBoxLayout() self.in_input = QLineEdit() self.in_input.setPlaceholderText("Selecciona un archivo de vídeo o audio...") in_layout.addWidget(self.in_input) self.in_browse_btn = QPushButton("Examinar") self.in_browse_btn.clicked.connect(self.browse_input_file) in_layout.addWidget(self.in_browse_btn) layout.addLayout(in_layout) # Combo de Presets layout.addWidget(QLabel("Preset de conversión:")) self.preset_combo = QComboBox() for label in self.PRESETS.keys(): self.preset_combo.addItem(label) self.preset_combo.currentIndexChanged.connect(self.on_preset_changed) layout.addWidget(self.preset_combo) # Archivo de salida layout.addWidget(QLabel("Archivo de salida (Out):")) out_layout = QHBoxLayout() self.out_input = QLineEdit() self.out_input.setPlaceholderText("Ruta del archivo de salida...") out_layout.addWidget(self.out_input) self.out_browse_btn = QPushButton("Examinar") self.out_browse_btn.clicked.connect(self.browse_output_file) out_layout.addWidget(self.out_browse_btn) layout.addLayout(out_layout) # Botón de Conversión self.convert_btn = QPushButton("Iniciar Conversión") self.convert_btn.clicked.connect(self.start_conversion) layout.addWidget(self.convert_btn) # Label de estado self.status_label = QLabel("") layout.addWidget(self.status_label) layout.addStretch() self.setLayout(layout) def browse_input_file(self): file_path, _ = QFileDialog.getOpenFileName( self, "Seleccionar archivo de entrada", "", "Archivos Multimedia (*.mkv *.mp4 *.avi *.mov *.m4a *.mp3 *.wav *.flac *.webm);;Todos los archivos (*.*)" ) if file_path: self.in_input.setText(file_path) self.update_output_path_from_input(file_path) def browse_output_file(self): selected_preset = self.PRESETS[self.preset_combo.currentText()] ext = selected_preset["ext"] file_path, _ = QFileDialog.getSaveFileName( self, "Guardar archivo como", self.out_input.text(), f"Archivo (*{ext})" ) if file_path: self.out_input.setText(file_path) def update_output_path_from_input(self, input_path): base_path, _ = os.path.splitext(input_path) selected_preset = self.PRESETS[self.preset_combo.currentText()] new_output = f"{base_path}{selected_preset['tag']}{selected_preset['ext']}" self.out_input.setText(new_output) def on_preset_changed(self): input_path = self.in_input.text().strip() if input_path: self.update_output_path_from_input(input_path) else: current_out = self.out_input.text().strip() if current_out: base_path, _ = os.path.splitext(current_out) selected_preset = self.PRESETS[self.preset_combo.currentText()] self.out_input.setText(f"{base_path}{selected_preset['ext']}") def start_conversion(self): input_file = self.in_input.text().strip() output_file = self.out_input.text().strip() selected_preset = self.PRESETS[self.preset_combo.currentText()] if not input_file or not os.path.exists(input_file): QMessageBox.warning(self, "Atención", "Por favor, selecciona un archivo de entrada válido.") return if not output_file: QMessageBox.warning(self, "Atención", "Especifica la ruta del archivo de salida.") return self.set_inputs_enabled(False) self.status_label.setText("Iniciando conversión...") self.converter_thread = MediaConverter(input_file, output_file, selected_preset["key"]) self.converter_thread.progress_signal.connect(self.update_status) self.converter_thread.finished_signal.connect(self.on_conversion_finished) self.converter_thread.start() def update_status(self, message): self.status_label.setText(message) def on_conversion_finished(self, success, message): self.set_inputs_enabled(True) self.status_label.setText("") if success: QMessageBox.information(self, "Éxito", message) else: QMessageBox.critical(self, "Error", message) def set_inputs_enabled(self, enabled: bool): self.in_input.setEnabled(enabled) self.in_browse_btn.setEnabled(enabled) self.out_input.setEnabled(enabled) self.out_browse_btn.setEnabled(enabled) self.preset_combo.setEnabled(enabled) self.convert_btn.setEnabled(enabled)