Criei um script usando ia que baixa vídeos do youtube na pasta selecionada

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.

2 curtidas