Inicial, descargar y conversion basicas
This commit is contained in:
141
gui/tab_converter.py
Normal file
141
gui/tab_converter.py
Normal file
@@ -0,0 +1,141 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user