Descargar vídeo o audio de Youtube usando Python

Esta aplicación hecha en PYthon permite descargar vídeos o audio de Youtube seleccionando la calidad. También se puede descargar solo el audio de un vídeo y puede hacerse link a link o en bucle usando un fichero.

Funcionamiento 🔧

Podemos descargar los vídeos uno a uno usando su link a Youtube o poner las urls en un fichero de texto y que la aplicación los descargue en bucle.

Al iniciar la aplicación nos pide que seleccionemos una de las dos opciones:

Descarga un solo link

Nos pedirá la url del vídeo:

Ahora tendremos que seleccionar una de estas tres opciones:

  • Descarga rápida de vídeo y audio: descarga el vídeo junto con el audio en baja calidad
  • Descargar vídeo seleccionando la calidad: nos mostrará las calidades disponibles en el vídeo para que seleccionemos una. Esta opción es la que más tarda porque tiene que descargar el vídeo por un lado y el audio por otro para mergearlo después. Este proceso es transparente para el usuario y se hace de forma automática.
  • Descargar audio: descarga únicamente el audio de la canción.

Descarga en bucle

Nos pedirá la ruta del fichero de texto que contiene los enlaces:

El fichero tendrá este formato:

Cuando el proceso acabe, veremos los vídeos o audios en la ruta configurada.

Funcionamiento 💻

Vamos a analizar por encima el código.

En la función principal simplemente mostramos un menú para pedir al usuario si desea descargar un solo vídeo o varios a través de un fichero de texto con enlaces. En cualquiera de las dos opciones el link se guarda en una lista.

if __name__ == "__main__":
    tarea = 0
    job = 0
    enlaces = []    
    parent_dir = cfg.get_ruta_descargas()  # Obtener ruta donde se guardan las descargas

    while tarea != '3':        
        enlaces.clear()
        tarea = menu_inicio()  # Mostrar menú inicial
        loop = False

        clear()

        # Llenar una lista con los enlaces a descargar
        if tarea == '1':  # Un solo vídeo
            enlaces.append(pide_url())            
        elif tarea == '2': # Fichero de texto
            loop = True
            ruta_fichero = input('Ruta fichero enlaces: ')
            enlaces = procesa_fichero(ruta_fichero)        
        
        # Seleccionar qué tipo de descarga hacer
        while job not in ['1', '2', '3']:
            clear()
            job = seleccionar_accion()

        [inicia_proceso_descarga(x, job, loop) for x in enlaces]

    print_proceso_terminado()

Del bloque de arriba, la línea que inicia el proceso de descarga es esta (se recorre la lista usando list comprehension y le pasa cada link a la función “inicia_proceso_descarga”):

[inicia_proceso_descarga(x, job, loop) for x in enlaces]

Este bloque de abajo es el que lee el fichero e inserta en la lista cada enlace:

def procesa_fichero(ruta) -> list:
    list_enlaces = []

    file_object = open(ruta, 'r')

    [list_enlaces.append(linea) for linea in file_object]    

    file_object.close()

    return list_enlaces

Esta parte es la que permite descargar el vídeo + audio de forma rápida (opción 1), descargar el vídeo y audio permitiendo seleccionar la calidad (opción 3) y descargar solo el audio (opción 2):

if job == '1':  # Vídeo y audio rápido
        video_y_audio.download(parent_dir + '/video')
        print_proceso_terminado()
    elif job == '3': # Solo audio
        ruta_fin = yt.streams.get_audio_only().download(parent_dir + '/audio')
        audioclip = AudioFileClip(ruta_fin)                
        audioclip.write_audiofile(audioclip.filename.replace('.mp4', '.mp3'))

        os.remove(audioclip.filename)

        print_proceso_terminado()
    elif job == '2':  # Descargar vídeo y audio seleccionando calidad    
        num_video_descargar = 1

        if not loop:
            print('')
            print('Seleccionar vídeo (1..{0})'.format(len(vids)))    

            for video in vids:
                print('    ({1}) - {0}'.format(video, contador))
                contador += 1

            print('')

            num_video_descargar = int(input('Nº vídeo: '))    

        num_video_descargar -= 1    

        nombre_video = vids[num_video_descargar].default_filename
        nombre_video_final = 'f_' + nombre_video
        vids[num_video_descargar].download(parent_dir + '/video')

        yt.streams.get_audio_only().download(parent_dir + '/audio')

        audioclip = AudioFileClip(parent_dir + '/audio/' + nombre_video)

        videoclip2 = VideoFileClip(parent_dir + '/video/' + nombre_video)
        videoclip2 = videoclip2.set_audio(audioclip)
        
        videoclip2.write_videofile(parent_dir + '/video/' + nombre_video_final)    

        os.remove(videoclip2.filename)
        os.remove(audioclip.filename)

La parte más enrevesada es la opción 2 (descargar vídeo y audio seleccionando la calidad) porque Youtube no tiene el vídeo + audio en el mismo archivo, lo que hace el programa es descargar el vídeo por un lado, el audio por otro y mergearlos en un solo archivo, después borra los ficheros de vídeo y audio que se descargaron por separado.

La parte del audio, también tiene un poco de miga, ya que el audio se descarga en formato mp4 y el programa lo convierte a mp3 borrando después el mp4 original.

Aquí está el repositorio de GitHub con todo el código. https://github.com/Dynam1co/Python_youtube_video_downloader

Publicado por Fj Asensi

BigData & MachineLearning Developer | Senior Microsoft Dynamics 365 Business Central Developer

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: