Postagem em destaque

tuxtube.sh - Baixe e converta videos do Youtube.

Quem não curte assistir um vídeo no YouTube ? Ou baixar seus vídeos favoritos e assistir na hora que quiser.
Existem inúmeros plugins para incorporar no seu navegador, que lhe permite baixar e converter o vídeos nos formatos mais populares ou até mesmo extrair somente o audio.

Além desses plugins, existe uma ferramenta chamada youtube-dl que nada mais é que uma CLI que permite ao usuário realizar downloads/conversão dos seus vídeos via linha de comando. Como algumas pessoas não estão familiarizadas com seu uso, resolvi criar o tuxtube.sh.

O tuxtube.sh é um script com interface gtk que utiliza o recurso arrasta e solta para iniciar o download.

Arraste a miniatura do vídeo desejado e solte em cima do TUXTUBE para iniciar o processo de download.

#!/bin/bash
#----------------------------------------------------------------------------------------------
# Data:         25 de Outubro de 2016
# Criado por: Juliano Santos [SHAMAN]
# Página:       http://shellscriptx.blogspot.com.br
# Script:       tuxtube.sh
# Descrição: Script com interface (gtk/yad) utilizando o recurso dnd (arrasta e solta)
#               para realizar download de vídeos no 'youtube' através do comando 'youtube-dl'
#               permitindo ao usuário selecionar o formato de saída do video e posteriormente
#               a conversão por meio do comando 'ffmpeg'.
#               Formatos disponíveis:
#               Vídeos: mp4, mkv, avi, ogg, webm, flv
#               Aúdio:  best, aac, vorbis, mp3, m4a, opus, wav
#----------------------------------------------------------------------------------------------

# Nome do script
SCRIPT=$(basename "$0")

# Lista os pacotes requeridos
for pkg in youtube-dl ffmpeg notify-send yad
do
 # Verifica se os pacotes estão presentes, caso contrário imprime
 # a mensagem de erro e finaliza o script com status 1
 if ! which $pkg 1>/dev/null; then
  echo "$SCRIPT: erro: pacote '$pkg' não está instalado." 1>&2
  exit 1
 fi
done

# Suprime todas as saidas.
exec &>/dev/null

# Se o script for interrompido pelo usuário, chama a função kill_proc
trap 'kill_proc' INT

# Função que mata os processos em segundo plano do 'youtube-dl' (se existir)
kill_proc(){ kill -9 $PID; killall youtube-dl; }

# Download do vídeo
down_vid()
{
 # Aplica uma expressão regular para validar a 'URI' passada no argumento,
 # verificando se é um link válido do 'youtube', caso contrário sai da função.
 if [[ ! $1 =~ ^https://www.youtube.com/watch\?v=[a-zA-Z0-9_-]+$ ]]; then
  # Mensagem erro
  yad --form \
   --fixed \
   --center \
   --title='Error' \
   --text="Link: $1\nO link do vídeo selecionado é inválido. !!!" \
   --image=gtk-dialog-error \
   --button='Ok':0

   return 0
 fi
 
 # Armazena o argumento
 URL="$1"

 # Exibe o 'form' de seleção do tipo de arquivo e armazena em 'TYPE'
 TYPE=$(yad --title='Tipo do arquivo' \
  --center \
  --width=200 \
  --height=400 \
  --fixed \
  --text='Converter vídeo para:' \
  --separator='' \
  --button='Baixar!gtk-save!Inicia o processo de download.':0 \
  --print-column=2 \
  --list --radiolist \
  --column='Opção' \
  --column='Formato' \
  TRUE 'mp4' \
  FALSE 'mkv' \
  FALSE 'avi' \
  FALSE 'ogg' \
  FALSE 'webm' \
  FALSE 'flv' \
  FALSE 'best' \
  FALSE 'aac' \
  FALSE 'vorbis' \
  FALSE 'mp3' \
  FALSE 'm4a' \
  FALSE 'opus' \
  FALSE 'wav')
  
  # Se o usuário clicou em baixar.
  if [ $? -eq 0 ]; then
   # Lê o tipo selecionado e monta os argumentos que seram
   # passados com o comando 'youtube-dl'
   case $TYPE in
     mp4|mkv|avi|ogg|webm|flv)  # Vídeo
     OPTS="--recode-video $TYPE"  # Argumentos
     ;;
    best|aac|vorbis|mp3|m4a|opus|wav)    # Aúdio
     OPTS="--extract-audio --audio-format $TYPE" # Argumentos
     ;;
   esac
  
   # Obtem o título do vídeo passado na url e rediciona para o arquivo '/tmp/vid.title'
   # que será acessado posteriormente pelo 'form' de progresso.
   # O processo é executado em background.
   youtube-dl -e --get-title $URL > /tmp/vid.title &
   TPID=$!  # Salva do 'PID' do processo

   # Inicia um subshell em background
   (
    # Executa o comando com os parâmetros armazenados em 'OPTS', iniciando
    # o donwload do vídeo armazenado em 'URL' e rediciona a saida para o
    # o arquivo '/tmp/vid.prog', criando um status de progresso.
    if youtube-dl --newline $OPTS $URL > /tmp/vid.prog; then
     # Envia notificação após a conclusão do download
     notify-send --urgency=normal \
        --expire-time=5 \
        --app-name="$SCRIPT" \
        --icon="$PWD/tuxtube.icon" "$SCRIPT" "$(cat /tmp/vid.title).\nDownload concluido com sucesso."
    # Imprime mensagem de erro em caso de falha.
    else
     yad --form \
      --title='Erro' \
      --center \
      --fixed \
      --image=gtk-dialog-error \
      --text='Não foi possível realizar o download do vídeo !!!' \
      --button='OK':0 
    fi
   ) &
      
   # Armazena o 'PID' do processo
   PID=$!
   
   # Exibe o 'form' de progresso enquanto o processo armazenado em 'PID' estiver em execução.
   while [ $(ps -q $PID -o comm=) ]
   do
    # Imprime as informações de progresso.
    # Título
    # Converter para
    # Progresso do download
    echo "#Título: $(cat /tmp/vid.title)\nConverter para: $TYPE\n$(awk 'END {print}' /tmp/vid.prog)"
    sleep 1
            done | yad --progress \
      --title 'Download' \
      --center \
      --fixed \
      --pulsate \
      --auto-close \
      --auto-kill \
      --button='Cancelar!gtk-cancel!Cancela o processo de download.':0
  
   # Mata os processos em background
   kill_proc
  fi
}

# Janela principal
yad --title="$SCRIPT - [SHAMAN]" \
 --text='Arraste a miniatura do vídeo para cá :D' \
 --geometry=300x300+0+0 \
 --fixed \
 --image=tuxtube.png \
 --no-buttons \
 --dnd \
 --tooltip | while read url; do down_vid $url; done # Conecta o pipe de saida do 'form' ao 'while' que lê os
              # dados de saída quando o usuário arrasta o objeto para
              # cima do 'form', chamando a função 'down_vid' com a 
              # 'URI' armazenada em 'vid'.

exit 0
#FIM

Comentários

Contato

Nome

E-mail *

Mensagem *