Interface gráfica para yt-dlp YouTube Downloder

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!!

8 curtidas

Muito legal sua iniciativa.

Para quem quiser salvar em outros formatos, vai algumas configs que eu utilizo:
1080p (137) video:H264 audio:aac (234) ext:mp4

yt-dlp -f 137+234 -o "%(title)s.%(ext)s"

720p (136) video:H264 audio:aac (234) ext:mp4

yt-dlp -f 136+234 -o "%(title)s.%(ext)s"

Para outros formatos, basta pegar o código via comando:
yt-dlp -F --list-formats URL_YOUTUBE

4 curtidas

inclusive dá para substituir o comando do script python e colocar esses seus também. O bom de trabalhar com script é isso, dá para customizar ao “gosto do cliente”.

Sim, este é o intuito de eu ter postado. Dar opções e oferecer como encontrar a melhor opção para os diversos gostos.

2 curtidas

Que legal @SobDex , parabéns pela iniciativa!

Eu tava na dúvida de uma coisa devido a uma necessidade que eu tenho que é:
Criar um app similar ao keyviz pois o ScreenKey que existe atualmente é o melhorzinho para personalizar porém não sobrepõe telas especificas durante a gravação, para ele mostrar as teclas pressionadas durante a gravação eu tenho que mostrar a tela inteira do desktop (o que não é interessante pra mim durante os meus tutoriais) procurei alternativas mas infelizmente não são boas.

Problema:
Até tentei instalar o pack deles mas infelizmente ta com erro, não consigo instalar.

DÚVIDA:
Então da pra criar programas como esse em PYTHON?
Quais linguagens mais populares que a galera prograva software para LINUX?
Fica aqui minha sugestão para tu criar um app similar pra gente que é criador de conteúdo.

Abraço :hugs:

2 curtidas

Tenho usado esse app de Android que é excelente:

1 curtida

Sobre esse programa em específico eu não vou conseguir te informar pois não conheço como ele funciona, se tem algum comando cli etc. Isso por que nunca usei um programa com essa funcionalidade.

Sim o python tem muitas bibliotecas com várias funcionalides para criar algo similar ao keyviz. No meu caso, isso exigiria muito estudo pois sou leigo nesse assunto que, por sinal, é bem mais complexo do que essa simples interface que fiz.

São muitas, no meu caso eu uso mais o python e java script. Mas tem a linguagem C, ruby e por aí vai…

Obrigado pela sugestão. Como sou leigo nesse tipo de programa vou ter que pesquisar um pouco para poder saber se serei capaz disso.

1 curtida

Legal yt-dlp é muito rápido no que se propõe a fazer, se esse app android usa ele como backend, tenho certeza que é bom. Vou pesquisar…
Antes tinha (ou ainda tem) um programa com interface que fazia isso, o youtube-dl. Mas em relação ao yt-dlp ele era bem mais lento para baixar o conteúdo.

E para baixar as legendas em pt-br, por exemplo?

--write-subs --sub-langs 'pt.*'

(Botei pt.* para pegar tanto pt quando pt-BR, às vezes os vídeos fazem essa distinção).

5 curtidas

É isso mesmo, estava eu procurando um app front-end para yt-dlp de celular e achei esse.

Ele tem uma interface muito bem organizada para tantas opções que o yt-dlp traz, e ainda você pode editar a linha de comando antes de executar a tarefa, caso saiba. Você também consegue baixá-lo pela IzzyOnDroid.

Tem outro que também é bem bom, mas acho a interface meio confusa e não muito completo:

2 curtidas

Parabéns pela iniciativa, e obrigado por compartilhá-la com todos nós!

Pessoalmente, prefiro ficar com os comandos do yt-dlp – que ainda acho muito menos “complicados”, do que fazer isso tudo.

Por favor, não vejam (no que digo), nada contra “propor”, “desenvolver” – e muito menos, nada contra “debater”, “participar” – pois a meu ver, isso é que faz o mundo andar para a frente!

Quero, apenas, oferecer alguma contribuição para o debate. – Se vejo algo “errado”, ou “perigoso”, ou etc., não aponto isso para “matar a ideia”, muito menos o debate. – Espero apenas que, o que digo, possa ajudar a levar a ideia adiante, por algum caminho melhor (que eu, mesmo, não posso afirmar, qual seria).

  1. Para resolver uma (suposta) dificuldade, complexidade etc. dos comandos, a alternativa terá de ser muito mais simples e “amigável”.
  • 1.1 - A meu ver, usar o comando yt-dlp é muito mais simples e fácil, do que a alternativa proposta – pelo menos, “por enquanto”. – Ok, estamos debatendo um projeto, então, no momento precisamos mergulhar em águas mais complexas, para no futuro chegarmos a uma solução simples e “amigável”.

  • 1.2 - Dito isso, quero lembrar que cada usuário precisa (apenas) anotar meia-dúzia de parâmetros – e depois de usar esses comandos “compostos”, basta teclar Seta Para Cima (↑), para recuperá-los da “história / memória do Bash”.

It downloads to the directory where you ran the youtube-dl command:

$ cd /run/media/flavio/Depot1/Videos/

$ yt-dlp [URL]
$ yt-dlp --trim-filenames 20 [URL]

Com legendas "enviadas pelo proprietário":

yt-dlp --write-srt --sub-lang en [URL]

Com legendas "geradas automaticamente":

yt-dlp --write-auto-sub [URL]

Ignorar nome longo demais ou inadequado:

$ yt-dlp --id URL

Extrair áudio:

$ yt-dlp -x --audio-format mp3 URL

Playlist --> "View full playlist":

$ yt-dlp --yes-playlist -x --audio-format mp3 URL

$ yt-dlp --playlist-items 1,3-15 -x --audio-format mp3 URL

Só listar

$ yt-dlp --flat-playlist -x --audio-format mp3 URL

(Tem mais, mas acho que esses exemplos já bastam).

Ok, “não está explicado”. – É só um punhado de exemplos, que guardei para meu próprio uso. – Cada um pode guardar os exemplos que lhe interessam (e se quiser, pode acrescentar as explicações que achar necessárias). O que quero dizer é que “não quebra o braço”.

A cada nova necessidade, invisto mais um tempo, pesquiso, e quando consigo o que quero, anoto – pois o “histórico do Bash” só me ajuda naquela distro – e eu quero um lembrete “independente”, para quando eu precisar fazer a mesma coisa, em outra distro.

Mas, ok, estamos discutindo um “facilitador”. – Então, que prossiga o debate, até chegarmos a um projeto – que deverá exibir a Autoria do colega que propõe, e se dispõe a liderar o projeto (e mantê-lo, daí em diante).

  1. Não sou desenvolvedor, e o que digo, não tem nenhum valor “técnico”. – Como “mero usuário”, o uso de python, aqui ou ali (sem entender nada, do que significa!) tem me causado várias “perguntinhas difíceis”. – De repente, alguma distro, ao atualizar, me pergunta se eu prefiro pipipi, ou se eu prefiro popopó. Com mil bits & bytes! Eu só queria que aquela bagaça funcionasse, sem ficar me fazendo essas perguntinhas enjoadas, que me dão dor de cabeça :crazy_face:
  • 2.1 - Por quê, com mil bits & bytes, uma ou outra distro me faz essas perguntas enjoadas?? Eu pago meus impostos, sempre procurei tratar bem os meus filhos, não saio por aí roubando nem assaltando… Então, por quê, com mil catióros, essa ou aquela distro vem me botar pressão, fazendo perguntas difíceis, complicadas, xatas bagaray?? – A única pista que tenho, para iniciar uma investigação, é que, um belo dia, resolvi instalar um tal de corona-cli… usando um tal de npm… e daí por diante.

  • 2.2 - Todos vocês são testemunhas de que eu não sou developer, nem hacker, nem expert, nem nenhuma dessas coisas que poderiam, supostamente, atrair os raios de Zeus sobre mim, pobre mortal. – Sou inocente!!! Não tenho culpa!

  1. Apoio, incentivo, aplaudo, quero muito que o projeto funcione, atenda ao pobre usuário – mas peço, PADD!, que o App “final”… não exija que o pobre usuário jogue suas mãos para o Céu, e agradeça a quem acaso puder tirá-lo de um buraco sem fundo.

Desculpem, se pareço brincar (só um pouco!), com um assunto tão sério.

Como mero “usuário” – nem tão “iniciante” assim – até o momento, me parece muito mais simples usar o comando yt-dlp.

Mas, torço pelo melhor resultado da iniciativa desse projeto. – Só quis apontar alguns possíveis problemas – que seria bom, que o “usuário final” não se veja obrigado a enfrentar.

3 curtidas

Concordo contigo que usar o comando via cli é bem mais simples. Sem dúvida alguma digitar o comando yt-dlp é bem mais rápido do que instalar biblioteca python, criar ambiente virtual, criar arquivo python e editá-lo etc… Realmente o trabalho é bem maior do que um ctrl-C e ctrl-v, ou até mesmo usar a seta para cima e acessar o histórico no terminal. O fato é que uso esse script já tem mais de um ano e nunca mais precisei recorrer ao terminal ou pesquisar sobre os comandos do yt-dlp, mas isso não muda o fato de que passei horas quebrando a cabeça com a lógica do programa em si já que também não sou um developer profiossinal, apenas um amador gastando o tempo criando uma coisa que até mesmo eu me pergunto no final do processo se valeu a pena ou se realmente era necessária kkkkk.
Para o usuário final seria bem melhor que o programa já estivesse empacotado ou disponível no github com um script de instalação.

Isso é exatamente o que eu também penso. O código está aberto a todos para modificá-lo como desejar, apontar algum erro, sugerir uma melhoria ou apenas ignorá-lo e chegar a mesma conclusão que você: " usar o comando yt-dlp é muito mais simples e fácil, do que a alternativa proposta".
Obrigado mano, gostei muito que você compartilhou sua opinião.

3 curtidas

O yt-dlp sem suporte ao +SBT em 02/11/2024

Esses dias eu descobri uma interface pra esse software mexendo no Synaptic no Ubuntu. Quem lembra dele? kkk

O nome é youtubedl-gui. Pra instalar só mandar isso:

sudo apt install youtubedl-gui

Olha ele aí:

Captura de tela de 2024-11-03 02-47-41

3 curtidas

Nem uso esse aplicativo.
Tem o VideoDownloader instalável por flatpak, que é muito bom.

4 curtidas

Uso o Parabolic, simples e direto. Tem no FlatHub.

5 curtidas

Não conhecia, vou olhar.