Python script for download course from platzi.com

Overview

Platzi Downloader Tool

Platzi Downloader Tool Preview Esta es una pequeña herramienta que hace mucho y que te ahorra una gran cantidad de trabajo a la hora de descargar cursos de Platzi

Instalaciones necesarias

De momento solo se da referencia a la instalación en Sistemas GNU/Linux como Debian GNU/Linux, Ubuntu, ArchLinux

  • python 3.x.x

    Instalación en Debian GNU/Linux o Ubuntu

    Ejecuta: sudo apt-get install python3

    Instalación en ArchLinux y Manjaro

    Ejecuta: sudo pacman -S python

    Instalación en otros sistemas operativos o distribuciones

    Ingresa al Sitio Oficial de Python

    Puedes ver esta guia para Windows

  • pip

    Instalación en Debian GNU/Linux o Ubuntu

    Ejecuta: sudo apt-get install python3-pip

    Instalación en ArchLinux y Manjaro

    Ejecuta: sudo pacman -S python-pip

    Para otros sistemas operativos o distribuciones de GNU/Linux busca en Internet

    Puedes revisar esta guia para Windows

  • youtube-dl

    Instalación en Debian GNU/Linux o Ubuntu

    Ejecuta: sudo apt-get install youtube-dl

    Instalación en ArchLinux y Manjaro

    Ejecuta: sudo pacman -S youtuble-dl

    Instalación en otros sistemas o plataformas

    Ingresa al sitio oficial de youtube-dl para más información sobre instalaciones.

    Si realizas la instalación en Windows asegurarte de agregar el programa a la variable PATH, de este modo no se generaran problemas.

    Para no tener problemas de dependencias es recomendable instalar la dependencia python-pycryptodome

  • ffmpeg

    Instalación en Debian GNU/Linux o Ubuntu

    Ejecuta: sudo apt-get install ffmpeg

    Instalación en ArchLinux y Manjaro

    Ejecuta: sudo pacman -S ffmpeg



    Tip: Si algo falla al momento de la instalación prueba actualizar los repositorios de tu distro

Instalación de módulos python necesarios

Los pasos de instalación que se muestran son probados solo en sistemas GNU/Linux no es seguro que funcionen si tiene un sistema operativo diferente como Windows.

  • requests

    Ejecuta: pip3 install requests

  • lxml

    Ejecuta pip3 install lxml

  • colorama

    Ejecuta pip3 install colorama

Si al momento de la descarga te da un error prueba verifica si los módulos json y re están correctamente instalados.

Importante (WSL)

Debido a que el programa esta probado solo en distribuciones basadas en GNU/Linux, no se espera que funcione en Windows aunque se hagan las instalaciónes correctamente. Para usar el programa en Windows recomiendo usar WSL (Windows Subsystem For Linux).

Extra: Para una guia básica de la instalación en WSL puedes echar un vistaso aquí

Modo de empleo

Clic para abrir el video alt text

Notas:
El archivo cookies.txt debe guardarse en la carpeta donde se encuentra el scipt platzi-dtool.py para que el programa no genere errores.

Debido a que no tengo una suscripción en platzi no puede comprobar si el modo de descarga masiva de cursos funciona correctamente, si hay algún error estén atentos que tan pronto comienza el platzi day se corregirán lo antes posible.

Recomiendo que no descarguen los cursos en la carpeta donde se encuentra el programa y el resto de archivos, creen una nueva carpeta limpia para que no tengan problema alguno.

IMPORTANTE: Recomiendo que descarguen varios cursos a la vez, de ese modo puede aprovechar el maximo de la velocidad de descarga que brinde vuestra red.

Estructura de los directorios usados

Aquí una breve explicación de los directorios que se crearan y usaran para guardar los cursos descargados.

  • Descargando una ruta de aprendizaje o escuela

    Cuando se realizan este tipo de descargas se genera la siguiente estructura de directorios:

      Convensiones usadas:
          [CN] = Digitos que se usan para numerar los cursos para que queden ordenados
    
          [COURSE_NAME] = Nombre del curso.
    
          [SN] = Numero de seccion, digito que permite ordenar una seccion
    
          [SECTION_NAME] = Se refiere al nombre de la sección dentro del curso
    
          [LN] = Numero que identifica a una leccion dentro de una seccion
    
          [LESSON_NAME] = Nombre de la leccion
    

    Jerarquía de directorios

    El número uno en la jerarquía es la carpeta del curso, la cual se nombre de la siguiente manera:

      [CN] - [COURSE_NAME]
    

    Esto se hace para que se puedan ordenar y saber cual curso es él siguiente cuando se descargan rutas o escuelas de aprendizaje.

    Dentro de la carpeta del curso encontramos lo siguiente

      [CN] - [COURSE_NAME]
          [SN] - [SECTION_NAME]
    

    La estructura anterior hace referencia una sección dentro de un curso. Las secciones van enumeradas para que se pueda saber que sección es primero y cual es última.

    La siguiente estructura es:

      [CN] - [COURSE_NAME]
          [SN] - [SECTION_NAME]
              [LN] - [LESSON_NAME]
    

    La estructura anterior hace referencia a una lección que se encuentra contenida dentro de una sección la cual a su vez está contenida dentro de un curso.

    Las lecciones se enumeran para que se puedan ordenar y se pueda saber con cual continuar, el nombre de la lección en algunos casos no puede ser exacto, ya que algunos caracteres se reemplazan por otros o se eliminan para tener mayor compatibilidad un ejemplo es el caso del carácter :, que se reemplaza por la cadena - (espacio + -).

    La siguiente estructura se usa para almacenar la página de la lección, ya que en algunos casos esta contiene información como enlaces a otros recursos o resúmenes de la lección.

      [CN] - [COURSE_NAME]
          [SN] - [SECTION_NAME]
              [LN] - [LESSON_NAME]
              [LN] - extra_files
    

    Ya que algunas lecciones no son videos, se descargara la página web, la cual contiene el contenido de la lección tal como esta y se puede ver de forma offline, aunque se requiere conexión a Internet para cargar imagines.

    Cuando se descarga una lección de video, se descargara una página web, la cual es la página que se encuentra en la url de la clase, dicha página tiene el siguiente nombre.

      Estando en:
          [LN] - extra_files
              [LN] - webpage.html
    

    Otro archivo que se encontrará es un archivo llamado 000 - Preview.html, este archivo se encuentra en la carpeta del curso, y se trata de la página del curso, la puedes usar para saber cierta información del curs y también para saber como se estructura el curso aunque no haga falta.

  • Descargando un solo curso

    Cuando en el archivo que contiene la información de la descarga solo hay un curso la carpeta de este curso no contiene una numeración solamente el nombre.

      [COURSE_NAME]
          [SN] - [SECTION_NAME]
              [LN] - [LESSON_NAME]
              [LN] - extra_files
    

    De tal modo la estructura del curso será como la siguiente.

Con eso se concluye la explicación de los directorios usados por las descargas.

Recomendaciones de uso

  • Sistema operativo

    Este programa fue probado en ArchLinux, pero puedo sugerir que se ejecutara sin problemas en cualquier otra distribución de Linux siempre que se tengan los programas y los módulos de python correctamente instalados.

    Puedes probar en Windows aunque no estoy muy seguro de que funcione bien, debido a que usa un sistema de archivos diferente a los sistemas de archivos Unix.
    Si lo probaste y ocurrió algún error puedes abrir una discusión y poner la salida de la ejecución de ese modo podre arreglarlo rápidamente y dar soporte a usuarios de Windows

  • Descargando

    Si la descarga se pausa y no avanza más presiona CTL + C solo una vez, de este modo la descarga volverá a iniciarse y retomar desde el punto en el que encontraba.

    Puedes usar CTL + C tantas veces que quieras pero solo si se está descargando un video sabras que se está descargando cuando ves un texto que dice "Status: Downloading video" or algo similar.

    En carro de que la descarga se interrumpa, esta volverá a reiniciarse hasta que se haya descargado por completo, así que no tendrás problemas con esto.

Solución de problemas

Si te genera un problema al momento de correr el programa abre el archivo utils/text_utils.py y en la línea 6 deberás ver algo como esto: TERMINAL_COLUMNS = os.get_terminal_size().columns cambia su valor a 80 o un número cercano a este.

Si estas en Windows y experimentas problemas con la creación y guardado de archivos, puedes abrir una discusión y pones la salida del error, de ese modo me ayudaras a arreglar el error rápidamente.

Información extra

Las herramientas usadas en el programa no son de mi propiedad, son herramientas de código libre que llevan años funcionando aquí la lista de los programas que he usado:

Si te gusto el programa puedes darle una estrella.
Si tienes alguna idea de como mejorar el programa, puedes abrir una discusión y comentar, tal vez se pueda hacer algo.

Esta herramienta la cree debido a que mi conexión a Internet es realmente mala y solo está algo decente en horas de la noche, en las cuales ya no es posible aprovecharla debido al cansancio o al sueño.
Me gusta mucho aprender pero trasnochar todos los días no es bueno para el cuerpo y la mente, por eso me dije y si descargo las clases mientras duermo?, y así se creó este en 7 Dias xD

Ente proyectó no se hizo con intensiones de Piratería, ya que es solo una herramienta para las personas que no pueden cuentan con una conexión a Internet estable y de este modo pueden descargar las clases y verlas cuando quieran con más comodidad.

Comments
  • Error al descargar cursos Windows WSL Ubuntu 20.04 LTS

    Error al descargar cursos Windows WSL Ubuntu 20.04 LTS

    Al intentar realizar una descarga de cualquier curso/escuela aparece este error luego de descargar el html, uso windows 10 con WSL de ubuntu 20.04 LTS, tengo el mismo WSL en un computador de escritorio también con windows 10 y funciona perfecto. Están instalados los módulos solicitados en readme.md y todas las dependencias solicitadas. Probe cambiando el directorio del curso, limpiando el directorio, cambiando las cookies, clonando el proyecto en otro directorio y el error persiste.

    EDIT: el mensaje de error es de IndexError: list index out of range

    Codigo de error: Traceback (most recent call last): File "../platzi-dtool/platzi-dtool.py", line 78, in main() File "../platzi-dtool/platzi-dtool.py", line 66, in main scraper.init() File "/home/jjaraa/platzi-dtool/utils/extractor/scraper.py", line 54, in init scrape_course("", response[1], response[0]) File "/home/jjaraa/platzi-dtool/utils/extractor/scraper.py", line 220, in scrape_course l_url = lesson.xpath('a[@class="MaterialItem-anchor"]'

    opened by Jjaraa 5
  • sugerencias  a esta herramienta,

    sugerencias a esta herramienta,

    hola bro muy buena tu herramienta te agradezco que la compartas, mi energia electrica falla en las tardes y noches lo cual me deja sin internet por un rato la planta solo cubre el cuarto de mis padres, seria muy interesante añadirle ciertas características al comportamiento del script solo seria meterle mano a la clase download_video y modificar el comando para añadir estas características y como recibirlas como parámetros, sea en txt o algo asi

    • Ver el porcentaje de descarga por video y general de un curso
    • cuando exista un error de descarga que se guarde en un fichero txt como un log y asi poder saber que revisar para descargar manualmente
    • poder regular la frecuencia de descarga, añadir un tiempo de pausa para evitar baneos de cuenta
    • capacidad para descargar los subtitulos
    • descargar en maxima calidad o elegir la calidad de la descarga
    • seleccionar la velocidad maxima de la descarga
    opened by JeanCarlosDev17 4
  • ModuleNotFoundError: No module named 'utils.downloader'

    ModuleNotFoundError: No module named 'utils.downloader'

    parece en la último commit de la rama master no tiene algunos ficheros o están renombrados y me lanza este error al tratar ejecutar el programa:

    # ./dtool.py
    Traceback (most recent call last):
      File "./dtool.py", line 3, in <module>
        from utils.downloader.resources import ResourceDownloader
    ModuleNotFoundError: No module named 'utils.downloader'
    

    como lo podria solucionar? gracias de antemano

    opened by r3gor 3
  • Problemas para instalar los módulos de python

    Problemas para instalar los módulos de python

    Que tal, soy yo de nuevo :( , tuve que formatear el sistema anterior , entonces me propuse a actualizar todo de nuevo , instale todo lo referido a ubuntu , instale WSL 2 en UBuntu 18.04 y ejecuté sudo apt-get update && sudo apt-get upgrade. para actualizar todas lo que estuviera en una versión anterior, instale python y demas programas necesarios con el comando sudo apt-get install python3 youtube-dl ffmpeg , todo super bien hasta allí.

    El problema sucede es cuando intento instalar los módulos de python con pip dentro de la carpeta del programa image

    Es como si Pip no se ubiese instalado , entonces trato de ejecutar el otro comando sudo apt-get install wget

    sh -c "$(wget -O- https://raw.githubusercontent.com/Devil64-Dev/automated-dtool/master/extra/install.sh)"

    pero me sale el siguiente problema image

    *Por favor discúlpame si eh omitido algo para poder que me reconozcan los comandos :( , también quería preguntarte sobre , si cambio la interfaz y donde puedo encontrar el video demo mostrando el proceso de uso , mil disculpas por las molestias

    opened by estebanardila57 3
  • Error  de descarga

    Error de descarga

    image estaba descargando una escuela iba de maravilla hasta que llego este curso, posterior lo intente de forma individual mismo resultado, estoy pensando que esa comilla en el nombre afecta al algoritmo

    opened by JeanCarlosDev17 3
  • Pausa entre cursos

    Pausa entre cursos

    hola logre realizar los cambios despues de probarla por un dia me ayudaste mucho, en el modo multi curso tienes un detalle un input en el scraper en la linea 242 en el metodo scrape_course(), que hace que tengas que dar enter para seguir al siguiente curso de la lista, no estoy si afecta en el algo si lo hace por favor me lo mencionas, pero lo elimine, y ahora va fluido. creo que esa linea iria perfecto al final del metodo scrape_courses al finalizar la lista de todos los cursos realice la pausa

    def scrape_course(numeration, r_object, course_url):
        data = {}
        tools.clear_screen()
    
        target_page = html.fromstring(r_object.content)
    
        course_title = style.format_name_string(
            target_page.xpath('//h1[@class="CourseDetail-left-title"]/text()')[0]
        )
    
        if mode == 2:
            course_title = f"{numeration} - {course_title}"
    
        em = style.format_string(f"    Processing: {course_title}", 16)
        header("  downloading", em, "cyan", "left", 1, "-", "green", 0)
    
        print(style.string_color("  Course information: \n", "blue"))
        sleep(style.line_sleep)
        print(style.format_string(f"    Course: {course_title}", 12))
    
        # Download course page
        helper.download_page(course_url, course_title, "000 - Preview.html")
        course_url = course_url.replace("/clases/", "/cursos/")
        helper.download_page(course_url, course_title, "Course Details.html")
    
        sections = target_page.xpath('//div[@class="Material-concept"]')
        s_count = 1
        l_count = 1
        for s in sections:
    
            sn = "00"
            if s_count > 9:
                sn = "0"
    
            s_title = s.xpath(
                'div[@class="Material-concept-edit"]'
                '/h3[@class="Material-title"]/text()')[0]
    
            s_title = f"{sn}{s_count} - {style.format_name_string(s_title)}"
    
            # print()
            # p_print.line_char("-", "cyan", 2)
            # print(style.format_string(f"    Section: {s_title}\n", 13))
    
            
            for lesson in s.xpath('div[@class="MaterialItem-content"]'):
    
                ln = "00"
                if l_count > 9:
                    ln = "0"
    
                lock_element = 'div/div[@class="MaterialItem-copy"]' \
                               '/div[@class="MaterialItem-copy-actions"]/div[' \
                               '@class="MaterialItem-copy-actions-anchor"]/i/@class '
    
                if not len(lesson.xpath(lock_element)) > 0:
                    if len(lesson.xpath('div/div[@class="MaterialItem-video"]')) > 0:
                        # lesson_type = "[VIDEO_NAME]"
                        # course_data["type"] = "video"
                        l_type = "video"
                    else:
                        # lesson_type = "[MATERIAL_NAME]"
                        # course_data["type"] = "material"
                        l_type = "material"
    
                    l_title = lesson.xpath('div/div[@class="MaterialItem-copy"]'
                                           '/p[@class="MaterialItem-copy-title"]'
                                           '/text()')
    
                    l_title = f"{ln}{l_count} - {style.format_name_string(l_title[0])}"
                    # print(style.format_string(f"      Lesson: {l_title}", 14))
    
                    l_url = lesson.xpath('a[@class="MaterialItem-anchor"]'
                                         '/@href')[0]
    
                    l_url = url_tool.base_url + l_url
                    # print(style.format_string(f"        URL: {l_url}", 13))
    
                    # set data and start lesson download action
                    data["path"] = course_title + '/' + s_title
                    data["name"] = l_title
                    data["url"] = l_url
                    data["type"] = l_type
                    if l_type == "video":
                        data["extra_path"] = f"{course_title}/{s_title}/"
                        data["extra_path"] += f"{ln}{l_count} - extra_files"
                        data["webpage"] = f"{ln}{l_count} - webpage.html"
    
                    helper.download_lesson(data)
                    tools.clear_screen()
    
                l_count += 1
            s_count += 1
    
        input("\n\n    Press enter to continue")
    
    opened by JeanCarlosDev17 3
  • Recursos de clase y descargas simultáneas

    Recursos de clase y descargas simultáneas

    Estuve probando platzi-dtool con Ubuntu 18,04 LTS con WLS en Windows 10 y hasta el momento descarga muy bien los videos de los cursos, pero en el caso de los recursos de clase, que en su mayoría son PDF, no me los descarga, solo descarga archivos html como extra files.

    Por otro lado, solo instalé Ubuntu para utilizar platzi-dtool y estoy recién conociendo su funcionamiento, ¿cómo puedo hacer descargas simultáneas o descargar toda una ruta de aprendizaje?

    Gracias por el aporte! Un saludo!

    opened by mrverns 3
Owner
Devil64-Dev
Junior web developer, who wants to learn more about new technology every day.
Devil64-Dev
A python script to download twitter space, only works on running spaces (for now).

A python script to download twitter space, only works on running spaces (for now).

null 279 Jan 2, 2023
Python script to download WAX transactions

WAXtax Python script to download WAX transactions WAXtax uses the CoinGecko API and the WAX Blockchain History API to download csvs for each account y

SixPM Software 11 Oct 9, 2022
This is a repository for the Duke University Cloud Computing course project on Serveless Data Engineering Pipeline. For this project, I recreated the below pipeline.

AWS Data Engineering Pipeline This is a repository for the Duke University Cloud Computing course project on Serverless Data Engineering Pipeline. For

null 15 Jul 28, 2021
A course on getting started with the Twitter API v2 for academic research

Getting started with the Twitter API v2 for academic research Welcome to this '101 course' on getting started with academic research using the Twitter

@TwitterDev 426 Jan 4, 2023
You cant check for conflicts until course enrolment actually opens. I wanted to do it earlier.

AcornICS I noticed that Acorn it does not let you check if a timetable is valid based on the enrollment cart, it also does not let you visualize it ea

Isidor Kaplan 2 Sep 16, 2021
Code done for/during the course

Serverless Course Autumn 2021 - Code This repository contains a set of examples developed during, but not limited to the live coding sessions. Lesson

Alexandru Burlacu 4 Dec 21, 2021
This is Pdisk Upload Bot made using Python with Pyrogram Framework. Its capable of uploading direct download link with thumbnail or without thumbnail & with Title Support.

Pdisk-Upload-Bot Introduction This Is PDisk Upload Bot Used To Upload Direct Link To Pdisk With Thumb Support Deploy Heroku Deploy Local Deploy pip in

HEIMAN PICTURES 32 Oct 21, 2022
📈 A Discord bot for displaying the download stats of a repository made with Python, the Hikari API and PostgreSQL.

?? axyl-stats axyl-stats is a Discord bot made with Python (with the Hikari API wrapper) and PostgreSQL, used as a download counter for a GitHub repo.

Angelo-F 2 May 14, 2022
A Python package that can be used to download post and comment data from Reddit.

Reddit Data Collector Reddit Data Collector is a Python package that allows a user to collect post and comment data from Reddit. It is built on top of

Nico Van den Hooff 3 Jul 26, 2022
Download song lyrics and metadata from Genius.com 🎶🎤

LyricsGenius: a Python client for the Genius.com API lyricsgenius provides a simple interface to the song, artist, and lyrics data stored on Genius.co

John W. Miller 738 Jan 4, 2023
A simple telegram bot to download from Zee5 links

Zee5 Downloader If you find any bugs, report at @TroJanzSupport My Features: ?? Upload as file/video from any NON-DRM Zee5 link ?? Permanent thumbnail

TroJanzHEX 95 Dec 20, 2022
Command-line program to download videos from YouTube.com and other video sites

youtube-dl - download videos from youtube.com or other video platforms INSTALLATION DESCRIPTION OPTIONS CONFIGURATION OUTPUT TEMPLATE FORMAT SELECTION

youtube-dl 116.4k Jan 7, 2023
Command-line program to download image galleries and collections from several image hosting sites

gallery-dl gallery-dl is a command-line program to download image galleries and collections from several image hosting sites (see Supported Sites). It

Mike Fährmann 6.4k Jan 6, 2023
Download videos from Youtube and other platforms through a Telegram Bot

ytdl-bot Download videos from YouTube and other platforms through a Telegram Bot Usage: https://t.me/benny_ytdlbot Send link from YouTube directly to

Telegram Bot Collection 289 Jan 3, 2023
Tools to download and aggregate feeds of vaccination clinic location information in the United States.

vaccine-feed-ingest Pipeline for ingesting nationwide feeds of vaccine facilities. Contributing How to Configure your environment (instructions on the

Call the Shots 26 Aug 5, 2022
Telegram bot to download almost all from Instagram

Instagram Manager Bot The most advanced Instagram Downloader Bot. Please fork this repository don't import code Made with Python3 (C) @subinps Copyrig

SUBIN 300 Dec 30, 2022
Telegram PHub Bot using ARQ Api and Pyrogram. This Bot can Download and Send PHub HQ videos in Telegram using ARQ API.

Tg_PHub_Bot Telegram PHub Bot using ARQ Api and Pyrogram. This Bot can Download and Send PHub HQ videos in Telegram using ARQ API. OS Support All linu

TheProgrammerCat 13 Oct 21, 2022
A telegram bot that can upload telegram media files to anonfiles.com and give you direct download link

✯ AnonFilesBot ✯ Telegram Files to AnonFiles Upload Bot It will Also Give Direct Download Link Process : Fork This Repositry And Simply Cick On Heroku

Avishkar Patil 38 Dec 30, 2022
Simple Telegram Bot to Download and Upload Files From Mega.nz

Mega.nz-Bot Simple Telegram Bot to Download Files From Mega.nz and Upload It to Telegram Features All Mega.nz File Links supported No login required A

I'm Not A Bot #Left_TG 245 Jan 1, 2023