Advertisement
maxpdkl

download mp3 and mp4

Mar 10th, 2023 (edited)
582
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.62 KB | None | 0 0
  1. # Importando os módulos necessários
  2. import os
  3. import subprocess
  4. from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QMessageBox, QVBoxLayout, \
  5.     QHBoxLayout, QComboBox, QProgressBar
  6. from PyQt5.QtCore import QThread, pyqtSignal
  7. from pytube import YouTube
  8.  
  9.  
  10. # Criando uma classe para a thread que faz o download
  11. class DownloadThread(QThread):
  12.     # Definindo os sinais personalizados
  13.     progress_signal = pyqtSignal(int)
  14.     complete_signal = pyqtSignal(str)
  15.     error_signal = pyqtSignal(str)
  16.  
  17.     def __init__(self, url, format):
  18.         super().__init__()
  19.         # Recebendo os parâmetros da interface gráfica
  20.         self.url = url
  21.         self.format = format
  22.  
  23.     def run(self):
  24.         # Tentando baixar o vídeo usando o pytube
  25.         try:
  26.             yt = YouTube(self.url)
  27.             if self.format == "MP4":
  28.                 stream = yt.streams.first()
  29.             elif self.format == "MP3":
  30.                 stream = yt.streams.filter(only_audio=True).first()
  31.             # Registrando as funções de callback para o progresso e a conclusão do download
  32.             yt.register_on_progress_callback(self.on_progress)
  33.             yt.register_on_complete_callback(self.on_complete)
  34.             # Fazendo o download do vídeo ou do áudio na pasta padrão ou na pasta "audio"
  35.             if self.format == "MP4":
  36.                 stream.download()
  37.             elif self.format == "MP3":
  38.                 stream.download(output_path="audio", filename_prefix="audio_")
  39.         except Exception as e:
  40.             # Emitindo um sinal de erro se ocorrer alguma exceção
  41.             self.error_signal.emit(str(e))
  42.  
  43.     def on_progress(self, stream, chunk, bytes_remaining):
  44.         # Calculando o progresso do download em porcentagem
  45.         size = stream.filesize
  46.         progress = int((size - bytes_remaining) / size * 100)
  47.         # Emitindo um sinal de progresso com o valor atual
  48.         self.progress_signal.emit(progress)
  49.  
  50.     def on_complete(self, stream, file_path):
  51.         # Se o formato for MP3, converte o arquivo baixado usando ffmpeg
  52.         if self.format == "MP3":
  53.             new_file_path = file_path.replace(".mp4", ".mp3")
  54.             subprocess.run(
  55.                 [
  56.                     "ffmpeg",
  57.                     "-i",
  58.                     os.path.join("audio", file_path),
  59.                     os.path.join("audio", new_file_path),
  60.                 ]
  61.             )
  62.             # Apaga o arquivo original em formato webm
  63.             os.remove(file_path)
  64.             # Atualiza a variável file_path com o novo caminho do arquivo mp3
  65.             file_path = new_file_path
  66.  
  67.         # Emitindo um sinal de conclusão com o título do vídeo e o caminho do arquivo
  68.         self.complete_signal.emit(stream.title + "|" + file_path)
  69.  
  70.  
  71. class App(QWidget):
  72.  
  73.     def __init__(self):
  74.         super().__init__()
  75.         self.initUI()
  76.  
  77.     def initUI(self):
  78.         # Definindo o título e o tamanho da janela
  79.         self.setWindowTitle('Download de vídeos do YouTube')
  80.         self.resize(400, 200)
  81.  
  82.         # Criando um rótulo para a URL
  83.         self.label = QLabel('Digite a URL do vídeo:', self)
  84.  
  85.         # Criando uma caixa de texto para a URL
  86.         self.url = QLineEdit(self)
  87.  
  88.         # Criando um botão para baixar o vídeo
  89.         self.button = QPushButton('Baixar', self)
  90.         self.button.clicked.connect(self.download)
  91.  
  92.         # Criando um ComboBox para escolher o formato do download
  93.         self.format = QComboBox(self)
  94.         self.format.addItem("MP4")
  95.         self.format.addItem("MP3")
  96.  
  97.         # Criando uma barra de progresso para mostrar o andamento do download
  98.         self.progress = QProgressBar(self)
  99.  
  100.         # Criando um layout vertical
  101.         vbox = QVBoxLayout()
  102.  
  103.         # Criando um layout horizontal para a URL e o botão
  104.         hbox1 = QHBoxLayout()
  105.         hbox1.addWidget(self.label)
  106.         hbox1.addWidget(self.url)
  107.         vbox.addLayout(hbox1)
  108.  
  109.         # Adicionando o ComboBox ao layout vertical
  110.         vbox.addWidget(self.format)
  111.  
  112.         # Adicionando a barra de progresso ao layout vertical
  113.         vbox.addWidget(self.progress)
  114.  
  115.         # Criando um layout horizontal para o botão
  116.         hbox2 = QHBoxLayout()
  117.         hbox2.addStretch(1)
  118.         hbox2.addWidget(self.button)
  119.         hbox2.addStretch(1)
  120.         vbox.addLayout(hbox2)
  121.  
  122.         # Definindo o layout da janela
  123.         self.setLayout(vbox)
  124.  
  125.         # Mostrando a janela
  126.         self.show()
  127.  
  128.     def download(self):
  129.         # Obtendo a URL digitada pelo usuário
  130.         url = self.url.text()
  131.  
  132.         # Verificando se a URL é válida
  133.         if url.startswith('https://www.youtube.com/watch?v='):
  134.             # Obtendo o formato escolhido pelo usuário
  135.             format = self.format.currentText()
  136.             # Criando uma instância da thread de download com os parâmetros da interface gráfica
  137.             self.thread = DownloadThread(url, format)
  138.             # Conectando os sinais da thread às funções da interface gráfica
  139.             self.thread.progress_signal.connect(self.update_progress)
  140.             self.thread.complete_signal.connect(self.show_complete_message)
  141.             self.thread.error_signal.connect(self.show_error_message)
  142.             # Iniciando a thread de download
  143.             self.thread.start()
  144.             # Desabilitando o botão enquanto o download estiver em andamento
  145.             self.button.setEnabled(False)
  146.         else:
  147.             # Mostrando uma mensagem de aviso se a URL for inválida
  148.             QMessageBox.warning(self, 'Aviso', 'URL inválida. Digite uma URL válida do YouTube.')
  149.  
  150.     def update_progress(self, value):
  151.         # Atualizando o valor da barra de progresso com o sinal recebido da thread
  152.         self.progress.setValue(value)
  153.  
  154.     def show_complete_message(self, message):
  155.         # Recebendo o título do vídeo e o caminho do arquivo separados por "|"
  156.         title, file_path = message.split("|")
  157.  
  158.         # Mostrando uma mensagem de sucesso quando o download for concluído
  159.         QMessageBox.information(self, 'Sucesso', f'Vídeo {title} baixado com sucesso em {file_path}.')
  160.  
  161.         # Habilitando o botão novamente
  162.         self.button.setEnabled(True)
  163.  
  164.     def show_error_message(self, error):
  165.         # Mostrando uma mensagem de erro se ocorrer alguma exceção na thread de download
  166.         QMessageBox.critical(self, 'Erro', f'Ocorreu um erro ao baixar o vídeo: {error}')
  167.  
  168.         # Habilitando o botão novamente
  169.         self.button.setEnabled(True)
  170.  
  171.     # Criando uma instância da aplicação e executando-a
  172. app = QApplication([])
  173. ex = App()
  174. app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement