Mais uma interface gráfica para um programa que é de linha de comando e, cá para nós, é uma linha de comando chata de decorar…
Essa é uma interface para o yt-dlp (youtube downloader) feita em python.
**
Dependências:
**
yt-dlp
pyQt5 (geralmente toda distro já tem ele para instalar).
Também é possível instalar o pyqt5 em um ambiente virtual. Para isso siga os passos abaixo:
1: Comando para criar o ambiente virtual. Ele vai criar uma pasta no local onde for executado o comando.
python -m venv <nome_do_ambiente_vitual>
2: Ative o ambiente virtual:
source <nome_do_ambiente_virtual>/bin/activate
3: Instale o pyqt5
pip install pyqt5
4: Rode o programa em python:
Se você estiver dentro do ambiente é só rodar o python normalmente python3 programa.py (para sair do ambiente virtual digite deactivate).
Também tem como rodar o programa fora do ambiente usando o caminho completo do ambiente virtual seguido de /bin/python programa.py. Por exemplo:
/home/$USER/ambientevirtual/bin/python programa.py
.
**
Como funciona o aplicativo para o yt-dlp:
**
O programa trabalha com dois arquivos. Um é o arquivo python e outro é o arquivo gerado pelo qt-designer, que dei o nome de yt.ui (o mais importante é ser .ui). De preferência coloque-os na mesma pasta.
arquivo python (nomeei de yt.py):
import sys
import subprocess
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QCheckBox, QTextEdit, QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.uic import loadUi
import os
user = os.getlogin()
class MainUi(QMainWindow):
def __init__(self):
super(MainUi, self).__init__()
# Defina o caminho para o arquivo .ui (interface gráfica)
loadUi(f"/home/{user}/youtube/yt.ui", self)
self.setWindowTitle("Youtube DLP")
# Caso queira usar um ícone para o app coloque o caminho para o ícone na linha abaixo
#self.setWindowIcon(QIcon(f'/home/{user}/Projetos/Aplicativos/YouTubeDLP/youtubedl.svg'))
# Inicialmente, marque a checkbox de áudio
self.checkBox.setChecked(True)
# Bloquear QTextEdit para escrita
self.textEdit.setReadOnly(True)
# Conecta o botão à função de download
self.pushButton.clicked.connect(self.download)
# Desconectar checkboxes e conectar uma função para desmarcar a outra
self.checkBox.clicked.connect(self.uncheckVideo)
self.checkBox_2.clicked.connect(self.uncheckAudio)
def download(self):
weblink = self.lineEdit.text()
formato = 1 if self.checkBox.isChecked() else 2
download_audio_folder = f"/home/{user}"
download_video_folder = f"/home/{user}"
if not weblink: # Verifica se o campo está vazio
QMessageBox.critical(self, "Erro", "Digite um link antes de baixar.")
return
if formato == 1:
command = f"yt-dlp --extract-audio --audio-format mp3 --audio-quality 0 -o '{download_audio_folder}/%(title)s.%(ext)s' {weblink}"
elif formato == 2:
command = f"yt-dlp -f 'bv*[height=1080]+ba' -o '{download_video_folder}/%(title)s.%(ext)s' {weblink}"
process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
shell=True,
universal_newlines=True
)
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
self.textEdit.insertPlainText(output)
self.textEdit.ensureCursorVisible()
QApplication.processEvents()
process.communicate()
self.textEdit.insertPlainText('\n--- DOWNLOAD CONCLUÍDO ---\n')
def uncheckVideo(self):
if self.checkBox.isChecked():
self.checkBox_2.setChecked(False)
def uncheckAudio(self):
if self.checkBox_2.isChecked():
self.checkBox.setChecked(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MainUi()
ui.show()
sys.exit(app.exec_())
arquivo .ui (nomeei de yt.ui):
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>541</width>
<height>388</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: #24273a;
color: #fff</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>170</x>
<y>0</y>
<width>201</width>
<height>61</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>24</pointsize>
</font>
</property>
<property name="text">
<string>Youtube DLP</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox">
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>97</width>
<height>26</height>
</rect>
</property>
<property name="text">
<string>Áudio</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_2">
<property name="geometry">
<rect>
<x>10</x>
<y>140</y>
<width>97</width>
<height>26</height>
</rect>
</property>
<property name="text">
<string>Vídeo</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>521</width>
<height>31</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background: #181926;</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>430</x>
<y>120</y>
<width>99</width>
<height>38</height>
</rect>
</property>
<property name="text">
<string>Baixar</string>
</property>
</widget>
<widget class="QTextEdit" name="textEdit">
<property name="geometry">
<rect>
<x>10</x>
<y>170</y>
<width>521</width>
<height>211</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background-color: #181926;
color: #fff</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections/>
</ui>
Note que no arquivo python o caminho que ele buscará para carregar a interface gráfica é ~/youtube/yt.ui, caso queira salvar o programa em outra pasta, altere o caminho do arquivo .ui na linha que começa com loadUi. Além disso, se desejar adicionar um ícone para o aplicativo, descomente a linha que começa com self.setWindowIcone defina o caminho para o ícone. As músicas ou vídeos estão sendo salvas por padrão na home do usuário mas isso pode ser configurado também é só editar as variáveis download_audio_folder e download_video_folder. Os vídeos estão sendo baixados na resolução de 1080p no formato .webm e os áudios em mp3.
Imagens:
tmj glr!!




