MizunoBrasil

[Novo] Baixa Youtube e converte para MP3 (outra biblioteca)

Jun 27th, 2023
1,701
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.83 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import filedialog, messagebox
  3. import subprocess
  4. import ctypes
  5. import json
  6. import webbrowser
  7. import os
  8.  
  9. # Obtém o identificador da janela do console
  10. hwnd = ctypes.windll.kernel32.GetConsoleWindow()
  11.  
  12. # Oculta a janela do console
  13. ctypes.windll.user32.ShowWindow(hwnd, 0)  # 0 representa o comando para ocultar a janela
  14.  
  15. # Caminho padrão da pasta de destino
  16. DEFAULT_DESTINATION_PATH = ""
  17.  
  18. def save_destination_path(destination_path):
  19.     # Salva o caminho da pasta de destino em um arquivo JSON
  20.     with open("destination_path.json", "w") as file:
  21.         json.dump({"destination_path": destination_path}, file)
  22.  
  23. def load_destination_path():
  24.     # Carrega o caminho da pasta de destino do arquivo JSON
  25.     try:
  26.         with open("destination_path.json", "r") as file:
  27.             data = json.load(file)
  28.             return data["destination_path"]
  29.     except FileNotFoundError:
  30.         return DEFAULT_DESTINATION_PATH
  31.  
  32. def configure_destination_folder():
  33.     # Abre uma janela de diálogo para escolher a pasta de destino
  34.     folder_selected = filedialog.askdirectory()
  35.     if folder_selected:
  36.         save_destination_path(folder_selected)
  37.         destination_path = load_destination_path()
  38.         destination_label.config(text="Pasta de destino: " + destination_path)
  39.         messagebox.showinfo("Configuração de Pasta", "A pasta de destino foi configurada com sucesso.")
  40.  
  41. def open_destination_folder(event):
  42.     # Abre a pasta de destino configurada usando o Windows Explorer
  43.     destination_path = load_destination_path()
  44.     if destination_path:
  45.         webbrowser.open(destination_path)
  46.  
  47. class HyperlinkLabel(tk.Label):
  48.     def __init__(self, master=None, **kwargs):
  49.         super().__init__(master, **kwargs)
  50.         self.configure(foreground="blue", cursor="hand2")
  51.         self.bind("<Button-1>", self._open_link)
  52.  
  53.     def _open_link(self, event):
  54.         destination_path = load_destination_path()
  55.         if destination_path:
  56.             webbrowser.open(destination_path)
  57.  
  58. def download_video():
  59.     # Obtém a URL digitada na caixa de texto
  60.     video_url = entry.get()
  61.  
  62.     # Verifica se o campo de texto está vazio
  63.     if not video_url:
  64.         messagebox.showwarning("Aviso", "Por favor, informe a URL do vídeo do YouTube.")
  65.         return
  66.  
  67.     # Exibe a mensagem de status
  68.     status_label.config(text="Aguarde, download em andamento.", fg="green")
  69.  
  70.     try:
  71.         # Carrega o caminho da pasta de destino
  72.         destination_path = load_destination_path()
  73.  
  74.         if destination_path:
  75.             # Executa o comando do yt-dlp para baixar o vídeo com o caminho da pasta de destino configurado
  76.             comando = ['yt-dlp', '--output', os.path.join(destination_path, '%(title)s.%(ext)s'), video_url]
  77.             subprocess.call(comando)
  78.  
  79.             # Exibe a mensagem no console
  80.             print("O vídeo foi baixado com sucesso.")
  81.  
  82.             # Exibe a mensagem em uma caixa de diálogo
  83.             messagebox.showinfo("Download Concluído", "O vídeo foi baixado com sucesso.")
  84.  
  85.             # Limpa a caixa de texto e posiciona o cursor nela
  86.             entry.delete(0, tk.END)
  87.             entry.focus()
  88.         else:
  89.             messagebox.showwarning("Aviso", "Nenhuma pasta de destino configurada.")
  90.  
  91.         # Limpa a mensagem de status após o término do download ou em caso de erro
  92.         status_label.config(text="")
  93.     except Exception as e:
  94.         messagebox.showerror("Erro", str(e))
  95.         # Limpa a mensagem de status em caso de erro
  96.         status_label.config(text="")
  97.  
  98. def show_context_menu(event):
  99.     # Exibe o menu de contexto do Windows com a opção "Colar"
  100.     menu.post(event.x_root, event.y_root)
  101.  
  102. def rename_mp4():
  103.     file_path = filedialog.askopenfilename(filetypes=[("Arquivos de Vídeo", "*.mkv *.webm")])
  104.     if file_path:
  105.         try:
  106.             file_name = os.path.splitext(file_path)[0]
  107.             new_file_name = file_name + ".mp4"
  108.             os.rename(file_path, new_file_name)
  109.             messagebox.showinfo("Sucesso", "Renomeado com sucesso.")
  110.         except Exception as e:
  111.             messagebox.showerror("Erro", str(e))
  112.     else:
  113.         messagebox.showwarning("Aviso", "Nenhum arquivo selecionado.")
  114.  
  115. # Cria a janela principal
  116. window = tk.Tk()
  117.  
  118. # Define o título da janela
  119. window.title("Youtube Vídeo Downloader")
  120.  
  121. # Define o tamanho da janela
  122. window.geometry("723x165")
  123.  
  124. # Centraliza a janela no meio da tela
  125. window.eval('tk::PlaceWindow . center')
  126.  
  127. # Cria o rótulo "Informe a URL do vídeo:"
  128. label = tk.Label(window, text="Informe a URL do vídeo:")
  129. label.grid(row=0, column=0, sticky="w", padx=10, pady=10)  # Posiciona na primeira linha, primeira coluna (canto superior esquerdo), alinhado à esquerda, com margem de 10 pixels
  130.  
  131. # Cria a caixa de texto
  132. entry = tk.Entry(window, width=80)
  133. entry.grid(row=1, column=0, padx=10, pady=10)  # Posiciona na segunda linha, primeira coluna (canto superior esquerdo), com margem de 10 pixels à esquerda
  134.  
  135. # Associa o evento de clique com botão direito do mouse à função do menu de contexto
  136. entry.bind("<Button-3>", show_context_menu)
  137.  
  138. # Cria o menu de contexto do Windows
  139. menu = tk.Menu(entry, tearoff=False)
  140. menu.add_command(label="Colar", command=lambda: entry.event_generate("<<Paste>>"))
  141.  
  142. # Cria o botão de download
  143. button = tk.Button(window, text="Baixar vídeo", command=download_video)
  144. button.grid(row=1, column=1, padx=5, pady=10)  # Posiciona na segunda linha, segunda coluna (canto superior direito), com margem de 10 pixels à direita
  145.  
  146. # Cria o rótulo para exibir a mensagem de status
  147. status_label = tk.Label(window, text="", fg="green")
  148. status_label.grid(row=2, column=0, sticky="w", padx=10)
  149.  
  150. # Cria o botão "Configurar Pasta de Destino"
  151. config_button = tk.Button(window, text="Configurar Pasta de Destino", command=configure_destination_folder)
  152. config_button.grid(row=2, column=0, padx=10, pady=10, sticky="w")  # Posiciona na terceira linha, primeira coluna, com margem de 10 pixels à esquerda
  153.  
  154. # Cria a label para exibir o caminho da pasta de destino
  155. destination_label = HyperlinkLabel(window, text="")
  156. destination_label.grid(row=3, column=0, padx=10, pady=5, sticky="w")  # Posiciona na quarta linha, primeira coluna, com margem de 5 pixels à esquerda
  157.  
  158. # Verifica se o arquivo JSON existe e carrega o caminho da pasta de destino se existir
  159. if os.path.isfile("destination_path.json"):
  160.     destination_path = load_destination_path()
  161.     destination_label.config(text="Pasta de destino: " + destination_path)
  162.  
  163. # Cria o botão "Renomear para MP4"
  164. rename_button = tk.Button(window, text="Renomear para MP4", command=rename_mp4)
  165. rename_button.grid(row=1, column=2, padx=5, pady=10)  # Posiciona na segunda linha, terceira coluna (canto superior direito), com margem de 10 pixels à direita
  166.  
  167. # Inicia o loop principal da janela
  168. window.mainloop()
  169.  
Add Comment
Please, Sign In to add comment