#!/bin/bash
#Ej. vx-yt-dlp -f bestaudio --extract-audio --audio-format mp3 -o "~/Descargas/%(uploader)s/%(title)s.%(ext)s" "https://youtu.be/LHCob76kigA?si=AKest3anhZEtN8mR"

help() {
    echo "#> $(basename "${0}"): Descarga de vídeos y música de youtube y otras plataformas (ver opcion -a)"
    echo "# Tienes que indicar la URL como último parámetro y opcionalmente:"
    echo "# -o: Directorio de salida donde dejar el archivo resultante. Por defecto: '~/Descargas/%(uploader)s/%(title)s.%(ext)s'"
    echo "# -v: Para indicar que no queremos sólo el audio, sino el vídeo completo"
    echo "# Ejemplos:"
    echo "$ $(basename "${0}") -a # Muestra la lista de plataformas de las que soporta descargar música y vídeos"
    echo "$ $(basename "${0}") -o /home/arturo/Música URL_youtube|instagram|vimeo... # Personalizamos el directorio de descarga del audio"
    echo "$ $(basename "${0}") -v -o /home/arturo/Música URL_youtube|instagram|vimeo... # Personalizamos el directorio de descarga del vídeo"
    echo "$ $(basename "${0}") -F # Muestra los formatos disponibles de descarga de un vídeo"
    echo "$ $(basename "${0}") -f 136+140 URL_youtube|instagram|vimeo..."
    echo '# Para descargar partes de una playlist con vx-yt-dlp:
	Descargar toda la lista:		vx-yt-dlp -f bestvideo+bestaudio --merge-output-format mp4 "URL"
	Descargar videos específicos		vx-yt-dlp --playlist-items 1,3,5-7 "URL"
	Descargar desde un video en adelante:	vx-yt-dlp --playlist-start 5 "URL"
	Descargar los primeros N videos:	vx-yt-dlp --playlist-end 3 "URL"
    Filtrar por duración:			vx-yt-dlp --match-filter "duration < 600" "URL"'
    exit 0
}

help_support() {
    clear
    # Se necesita instalar un interprete de markdown para la terminal (glow, mdcat, bat, ...):
    VISORES=( glow mdcat bat )
    # Comprobamos si están disponibles en los repositorios del sistema alguno de los visores anteriores por orden de mejor visor:
    for VISOR in "${VISORES[@]}" ; do
        apt show "${VISOR}" > /dev/null 2>&1 && break
    done
    dpkg -l "${VISOR}" > /dev/null 2>&1 && INSTALADO="true" || INSTALADO="false"
    ! "${INSTALADO}" && \
    read -p "# Se necesita instalar ${VISOR} (glow, mdcat, bat, ...) para interpretar markdown desde la terminal de linux y mostrar la lista de sitios Web donde descargar música o vídeos. Lo instalamos? (s/n): " RESPUESTA
    [[ "${RESPUESTA}" == "s" ]] && sudo apt install -y "${VISOR}"
    # En función del visor se necesita ejecutar una instrucción u otra:
    case "${VISOR}" in
        "bat") COMANDO="batcat --language=md" ;;
        "glow" ) COMANDO="glow -p" ;;
        "mdcat" ) COMANDO="mdcat" ;;
    esac
    URL="https://raw.githubusercontent.com/yt-dlp/yt-dlp/master/supportedsites.md"
    # wget: parámetros importantes para la descarga de la lista markdown y su visualización
    # -q → Silencia mensajes de descarga
    # -O- → Muestra el contenido en la terminal en lugar de guardarlo
    dpkg -l "${VISOR}" > /dev/null 2>&1 && \
    wget -qO- "${URL}" | eval "${COMANDO}" || \
    wget -qO- "${URL}"
    exit 0
}

! [[ "${1}" ]] && help
DESTINO="~/Descargas/%(uploader)s/%(title)s.%(ext)s"
OPCIONES_DESCARGA=( -f bestaudio --extract-audio --audio-format mp3 )
MOSTRAR_FORMATOS="false"
while getopts :hao:vf:F OPT; do
    case "${OPT}" in
        a) help_support ;;
        o) DESTINO="${OPTARG}" ;;
        v) # Indicamos que no sólo queremos el audio, sino el vídeo entero:
        OPCIONES_DESCARGA=( "-f" "best") ;;
        F) MOSTRAR_FORMATOS="true" ;;
        f) # Comprobamos si se ha elegido algún formato en concreto de descarga de audio y vídeo:
        FORMATO="${OPTARG}" ;;
        \?) help ;;
        :) help ;;
        h | *) help ;;
    esac
done
shift $((OPTIND - 1))  # Eliminar las opciones ya procesadas por getops
URL=("$@")  # Almacenar los argumentos posicionales restantes, que no van precedidos de una opción

# En el caso de tener que mostrar formatos los mostramos:
"${MOSTRAR_FORMATOS}" && \
echo "#> Los formatos de descarga disponibles son:" && \
vx-yt-dlp -F "${URL}" && \
echo "#> Puedes descargar la combinación de estos con la opción -f: '-f 136+140' # mp4 1280x720 + m4a audio only" && \
exit 0

# Comprobamos si se ha elegido algún formato en concreto de descarga de audio y vídeo:
[[ "${FORMATO}" ]] && OPCIONES_DESCARGA=( "-f" "${FORMATO}" --merge-output-format mp4 )

#vx-yt-dlp -f bestaudio --extract-audio --audio-format mp3 -o "${DESTINO}/%(title)s.%(ext)s" "${URL}"
echo "# Se va a ejecutar el siguiente comando: vx-yt-dlp ${OPCIONES_DESCARGA[*]} -o ${DESTINO}/%(title)s.%(ext)s ${URL}"
# eval "${COMANDO_DESCARGA}"
vx-yt-dlp "${OPCIONES_DESCARGA[@]}" -o "${DESTINO}/%(title)s.%(ext)s" "${URL}"
