Executando verificação de segurança...
10

🤖 O dia que fiz um programa para baixar vídeos e playlists do Youtube 🎵

💡 Ideia

Tenho uma amiga que em 2024 trabalhava em uma "papelaria" (seu próprio empreendimento 🥹) chamada Mg Multicoisas. Ela fazia vários serviços e vendia muitas coisas na loja, as melhores tardes eram as que passavamos juntos, tomando tereré ou sorvete 😁

Ela tambem vendia Pen Drives, e alguns clientes começaram a pedir com músicas gravadas, sertanejos, modas, populares... E ela sempre rejeitava esse serviços, até que perguntei para ela: "Porque você não grava as músicas? Tem um computador aqui".

Ela disse que não sabia e me pediu uma forma, mas como eu iria ensinar ela? ksks Porque quando eu precisava, baixava vídeos por conversores online, mas sinceramente... Eles são cheios de ADS, vários estão sempre saindo do ar e não tem a função principal que ela precisaria, baixar playlists.

É completamente inviável ter que baixar 100 músicas do Gustavo Lima uma a uma. Procurei por alternativas online e não encontrei nenhuma boa. Foi quando arregacei as mangas e falei:

"Deixa que eu resolvo meu bem! 💪" (kkkk, não foi exatamente assim, mas na minha cabeça foi algo semelhante)

🌐 Baixando um vídeo do Youtube

A maneira mais fácil para implementar isso é com a API do Youtube, você faz uma requisição com os parametros deles lá, e sucesso! 😁👍

O problema é que eles cobram, e eu não queria pagar, nem entregar uma alternativa paga para ela, então resolvi tentar pelo jeito mais difícil...

O Youtube é um app de streaming, que baixa os vídeos de pouco a pouco do seu servidor, então para baixar um vídeo completo, teria descobrir um padrão para fazer o download desses pedaços de vídeo, baixar todos eles e juntar em um só por um script.

E como eu sabia que ia dar muito trabalho, resolvi procurar no Git Hub para ver se alguem já tinha adentrado nessa zona sombria ai ksksk

Depois de muito buscar, quando já estava quase começando a fazer o meu script, encontrei o bendito! 🤩

Um programa em python chamado yt-dlp. Fazia download rápido de vídeos e audios e ainda me retorna os dados do vídeo (Titulo, Banner, e informações no geral) era perfeito! 🎊

⚙️ Desenvolvimento

Agora bastava desenvolver um app! Resolvi fazer com Electron porque ainda não conhecia nenhuma alternativa de interface com Python, e para isso poderia ser necessário várias funções, então precisava trabalhar com uma tecnologia que era mais familiarizado.

Escolhi ElectronJS porque já tinha quebrado muito a cabeça com ele quando fizemos a versão do Discipline Aluno (Essa versão com Electron, eu não publiquei porque acabou se descontinuando e trasformamos no código da versão web atual).

Mas o yt-dlp é python, então terminei fazendo duas aplicações. Um servidor Flask que faz o download, e a parte Electron faz o papel de client apenas consumindo a API.

🚀 Resultado

O programa ainda está na sua primeira versão, pensei em fazer algo simples e atendeu a demanda dela, então não adicionei outras features que estava pensando como controle de qualidade de exportação, queues para download multiplos...

Hoje ela fechou a papelaria mas pessoalmente uso bastante ele no dia a dia kkkkk, então essas features devem acabar saindo em algum momento.

🧑‍💻 Tecnologias

Vai lá dar uma estrelinha ⭐!

Repositório: https://github.com/PHGodoyCosta/Youtube_Downloader

JavaScript Python Electron
Flask
FFMPEG

Download

Deixei o instalador do programa para Linux e Windows dentro das [Releases do Git Hub] (https://github.com/PHGodoyCosta/Youtube_Downloader/releases/latest). Bom proveito 😁

Carregando publicação patrocinada...
2
1
2

Interessante seu trabalho e parabéns pela iniciativa, confesso que imaginava que havia extensão para fazer isso direto do browser (baixar video do youtube), porém não tenho certeza.

1

Tem sim, eu inclusive tenho uma. Mas ele não resolvia o problema de baixar as playlists. A extensão é simples, só deixa baixar vídeos, não para controlar a qualidade (se bem na versão atual do programa tambem não é possível ksksk, mas está como uma feature futura)

1

Parabéns pela iniciativa!

Isso é muito legal, computadores sendo realmente úteis dentro das corporações, não simplesmente uma maquina de datilografia moderna. Eu sou realmente apaixonado por automações e tudo o que eu posso automatizar na minha empresa eu faço: criação de instaladores, deploy, traduções dos programas, backups etc.

Algumas dicas pra sua automação:
1. Remova a logo da loja do repositório publico. O youtube dificilmente vai processar a sua pessoa fisica, mas a pessoa juridica da empresa que você trabalha eles podem processar. Isso também vale pras gravadoras e músicos detentores de direitos autorais.
2. Detecção de tipo de link automática. O formato do link já canta a bola se é uma playlist ou não, não é necessário um seletor disso.

Sua automação é realmente muito top, eu fiz uma semelhante que baixava vídeos do shorts, do tiktok e do reels, buscava automaticamente por palavras-chave e relevância. Hoje em dia é bem mais dificil baixar um vídeo do TikTok, na época também era.

1

Muito bom, criei alguns scripts e adicionei alguns alias seguindo a mesma ideia.

Talvez isso te atenda bem tbm, esse trecho corta o video em videos menores.

`#!/bin/bash

Uso:

./download_serie_live.sh "https://youtu.be/-1GWW4XjO10" --tempo-total-horas=8 --tempo-total-minutos=15 --tempo-video-minutos=15

URL_DEFAULT="https://youtu.be/-1GWW4XjO10"
URL="$URL_DEFAULT"

DOWNLOAD_PATH="HOME/Downloads/YoutubeLiveParts/PartTwo" mkdir -p "DOWNLOAD_PATH"

Valores padrão

INICIO_HORAS=0
INICIO_MINUTOS=0
TEMPO_TOTAL_MINUTOS_EXTRA=0

Parsing de parâmetros

for arg in "@" do case arg in
--tempo-total-horas=) TEMPO_TOTAL_HORAS="{arg#*=}" ;; --tempo-total-minutos=*) TEMPO_TOTAL_MINUTOS_EXTRA="{arg#=}" ;;
--tempo-video-minutos=) TEMPO_VIDEO_MINUTOS="{arg#*=}" ;; --quantidade-videos=*) QUANTIDADE_VIDEOS="{arg#=}" ;;
--inicio-horas=) INICIO_HORAS="{arg#*=}" ;; --inicio-minutos=*) INICIO_MINUTOS="{arg#=}" ;;
http*) URL="$arg" ;;
esac
done

if [ -z "TEMPO_TOTAL_HORAS" ] || [ -z "TEMPO_VIDEO_MINUTOS" ]; then
echo "Uso: $0 [URL] --tempo-total-horas=10 --tempo-total-minutos=15 --tempo-video-minutos=30 [--quantidade-videos=20] [--inicio-horas=H] [--inicio-minutos=M]"
exit 1
fi

echo ">>> Usando URL: $URL"
echo ">>> Baixando vídeo..."

Baixar vídeo consolidado

yt-dlp --no-part -o "DOWNLOAD_PATH/live_raw.%(ext)s" "URL"

RAW_FILE=(ls "DOWNLOAD_PATH" | grep live_raw | head -n 1)
RAW_PATH="DOWNLOAD_PATH/RAW_FILE"

if [ ! -f "$RAW_PATH" ]; then
echo "❌ ERRO: Arquivo da live não foi encontrado. Verifique o link."
exit 1
fi

Converte para .mp4

echo ">>> Convertendo para MP4..."
ffmpeg -i "RAW_PATH" -c copy "DOWNLOAD_PATH/live_completa.mp4" -y

Calcula blocos

TOTAL_MINUTOS=((TEMPO_TOTAL_HORAS * 60 + TEMPO_TOTAL_MINUTOS_EXTRA)) SEGMENTO_MINUTOS=TEMPO_VIDEO_MINUTOS
INICIO_TOTAL_MINUTOS=$((INICIO_HORAS * 60 + INICIO_MINUTOS))

if [ -z "QUANTIDADE_VIDEOS" ]; then QUANTIDADE_VIDEOS=(( (TOTAL_MINUTOS + SEGMENTO_MINUTOS - 1) / SEGMENTO_MINUTOS ))
fi

convert_to_hhmmss() {
local t=1 printf "%02d:%02d:%02d" ((t/3600)) (((t%3600)/60)) ((t%60))
}

Corta em partes

for ((i=0; i<QUANTIDADE_VIDEOS; i++))
do
START_MIN=((INICIO_TOTAL_MINUTOS + i * SEGMENTO_MINUTOS)) START_SEC=((START_MIN * 60))
START_TIME=(convert_to_hhmmss START_SEC)

END_MIN=$((INICIO_TOTAL_MINUTOS + (i+1) * SEGMENTO_MINUTOS))
if [ $END_MIN -gt $((INICIO_TOTAL_MINUTOS + TOTAL_MINUTOS)) ]; then
    END_MIN=$((INICIO_TOTAL_MINUTOS + TOTAL_MINUTOS))
fi
END_SEC=$((END_MIN * 60))
DURATION=$((END_SEC - START_SEC))

echo ">>> Cortando parte $((i+1)) (Início: $START_TIME, Duração: ${DURATION}s)"
ffmpeg -ss $START_TIME -i "$DOWNLOAD_PATH/live_completa.mp4" -t $DURATION -c copy \
    "$DOWNLOAD_PATH/parte_$((i+1)).mp4" -y

done

echo "✅ Processo finalizado! Arquivos salvos em: $DOWNLOAD_PATH"`