Criei um script usando ia para baixar vídeos do youtube na pasta que está selecionada, apenas aperte com o botão direito sobre a pasta, escolha o script e baixe o vídeo direto nela. Funciona também para playlists, e caso seja um vídeo que possua faixa de áudio, ele sempre irá baixar com a faixa de áudio em pt-br, caso não possua faixa ele apenas baixa o vídeo normal. Ele baixa em mkv para suportar faixas de áudio mas eu só converto depois com outro script para mp4.
essas são as dependências:
sudo apt install ffmpeg python3-gi gir1.2-gtk-3.0 -y
pipx install yt-dlp
e esse é o código:
#!/usr/bin/env python3
#!/usr/bin/env python3
import os
import subprocess
import threading
import re
import gi
gi.require_version(“Gtk”, “3.0”)
from gi.repository import Gtk, GLib
def get_nemo_directory():
uri = os.environ.get(“NEMO_SCRIPT_CURRENT_URI”)
if uri and uri.startswith(“file://”):
path = uri.replace(“file://”, “”)
if os.path.isdir(path):
return path
selected = os.environ.get("NEMO_SCRIPT_SELECTED_FILE_PATHS")
if selected:
first = selected.splitlines()[0]
if os.path.isfile(first):
return os.path.dirname(first)
elif os.path.isdir(first):
return first
return os.path.expanduser("~")
class DownloaderApp(Gtk.Window):
def init(self):
super().init(title=“YouTube Downloader PRO (Áudio PT-BR)”)
self.set_border_width(12)
self.set_default_size(420, 120)
self.dir = get_nemo_directory()
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8)
self.add(box)
self.entry = Gtk.Entry()
self.entry.set_placeholder_text("Cole o link do vídeo ou playlist...")
box.pack_start(self.entry, True, True, 0)
self.progress = Gtk.ProgressBar()
box.pack_start(self.progress, True, True, 0)
self.button = Gtk.Button(label="Baixar")
self.button.connect("clicked", self.start_download)
box.pack_start(self.button, True, True, 0)
def start_download(self, widget):
url = self.entry.get_text().strip()
if not url:
return
self.button.set_sensitive(False)
thread = threading.Thread(target=self.download, args=(url,))
thread.start()
def download(self, url):
yt_dlp_path = os.path.expanduser("~/.local/bin/yt-dlp")
if not os.path.exists(yt_dlp_path):
yt_dlp_path = "yt-dlp"
cmd = [
yt_dlp_path,
"--cookies-from-browser", "brave",
# 🔥 vídeo + TODAS faixas de áudio
"-f", "bv*+ba/b",
# 🔥 mantém TODAS as faixas (incluindo PT-BR)
"--audio-multistreams",
# 🔥 prioridade para português
"--extractor-args", "youtube:lang=pt",
# 🔥 container profissional
"--merge-output-format", "mkv",
"--ffmpeg-location", "/usr/bin/ffmpeg",
"--newline",
"-o", os.path.join(self.dir, "%(title)s.%(ext)s"),
url
]
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
for line in process.stdout:
match = re.search(r"(\d{1,3}\.\d+)%", line)
if match:
percent = float(match.group(1)) / 100
GLib.idle_add(self.progress.set_fraction, percent)
process.wait()
GLib.idle_add(self.finish)
def finish(self):
self.progress.set_fraction(1.0)
self.destroy()
app = DownloaderApp()
app.connect(“destroy”, Gtk.main_quit)
app.show_all()
Gtk.main()
é um arquivo python.