- This tool will not work without decryption keys, and there currently no public way to get those keys. Do not bother installing unless you already have keys!
- This program is WIP, the code is provided as-is and I am not held resposible for any legal issues resulting from the use of this program.
if you want help using the program, join my discord server or use github issues
All code is licensed under the MIT license
Utility script to download Udemy courses, has support for DRM videos but requires the user to aquire the decryption key (for legal reasons).
Windows is the primary development OS, but I've made an effort to support Linux also.
- You will need to download
ffmpeg
,aria2c
,mp4decrypt
(from Bento4 SDK) andyt-dlp
(pip install yt-dlp
). Ensure they are in the system path (typing their name in cmd should invoke them).
quick and dirty how-to
You will need to get a few things before you can use this program:
- Decryption Key ID
- Decryption Key
- Udemy Course URL
- Udemy Bearer Token (aka acccess token for udemy-dl users)
- rename
.env.sample
to.env
(you only need to do this if you plan to use the .env file to store your bearer token) - rename
keyfile.example.json
tokeyfile.json
- Firefox: Udemy-DL Guide
- Chrome: Udemy-DL Guide
- If you want to use the .env file to store your Bearer Token, edit the .env and add your token.
It is up to you to aquire the key and key ID. Please DO NOT ask me for help acquiring these, decrypting DRM protected content can be considered piracy.
You can now run the program, see the examples below. The course will download to out_dir
.
To download a course included in a subscription plan that you did not purchase individually, you will need to follow a few more steps to get setup.
- Go to the page of the course you want to download
- press
control
+shift
+i
(this may be different depending on your OS, just google how to open developer tools) - click the
Console
tab - copy and paste
document.cookie
and press enter - copy the text between the quotes
- Create a file called
cookies.txt
in the same folder asmain.py
- Paste the cookie into the file
- save and close the file
usage: main.py [-h] -c COURSE_URL [-b BEARER_TOKEN] [-q QUALITY] [-l LANG] [-cd CONCURRENT_DOWNLOADS] [--skip-lectures] [--download-assets]
[--download-captions] [--keep-vtt] [--skip-hls] [--info]
Udemy Downloader
optional arguments:
-h, --help show this help message and exit
-c COURSE_URL, --course-url COURSE_URL
The URL of the course to download
-b BEARER_TOKEN, --bearer BEARER_TOKEN
The Bearer token to use
-q QUALITY, --quality QUALITY
Download specific video quality. If the requested quality isn't available, the closest quality will be used. If not
specified, the best quality will be downloaded for each lecture
-l LANG, --lang LANG The language to download for captions, specify 'all' to download all captions (Default is 'en')
-cd CONCURRENT_DOWNLOADS, --concurrent-downloads CONCURRENT_DOWNLOADS
The number of maximum concurrent downloads for segments (HLS and DASH, must be a number 1-50)
--skip-lectures If specified, lectures won't be downloaded
--download-assets If specified, lecture assets will be downloaded
--download-captions If specified, captions will be downloaded
--keep-vtt If specified, .vtt files won't be removed
--skip-hls If specified, hls streams will be skipped (faster fetching) (hls streams usually contain 1080p quality for non-drm
lectures)
--info If specified, only course information will be printed, nothing will be downloaded
- Passing a Bearer Token and Course ID as an argument
python main.py -c <Course URL> -b <Bearer Token>
python main.py -c https://www.udemy.com/courses/myawesomecourse -b <Bearer Token>
- Download a specific quality
python main.py -c <Course URL> -q 720
- Download assets along with lectures
python main.py -c <Course URL> --download-assets
- Download assets and specify a quality
python main.py -c <Course URL> -q 360 --download-assets
- Download captions (Defaults to English)
python main.py -c <Course URL> --download-captions
- Download captions with specific language
python main.py -c <Course URL> --download-captions -l en
- English subtitlespython main.py -c <Course URL> --download-captions -l es
- Spanish subtitlespython main.py -c <Course URL> --download-captions -l it
- Italian subtitlespython main.py -c <Course URL> --download-captions -l pl
- Polish Subtitlespython main.py -c <Course URL> --download-captions -l all
- Downloads all subtitles- etc
- Skip downloading lecture videos
python main.py -c <Course URL> --skip-lectures --download-captions
- Downloads only captionspython main.py -c <Course URL> --skip-lectures --download-assets
- Downloads only assets
- Keep .VTT caption files:
python main.py -c <Course URL> --download-captions --keep-vtt
- Skip parsing HLS Streams (HLS streams usually contain 1080p quality for Non-DRM lectures):
python main.py -c <Course URL> --skip-hls
- Print course information only:
python main.py -c <Course URL> --info
- Specify max number of concurrent downloads:
python main.py -c <Course URL> --concurrent-downloads 20
python main.py -c <Course URL> -cd 20
- https://github.com/Jayapraveen/Drm-Dash-stream-downloader - For the original code which this is based on
- https://github.com/alastairmccormack/pywvpssh - For code related to PSSH extraction
- https://github.com/alastairmccormack/pymp4parse - For code related to mp4 box parsing (used by pywvpssh)
- https://github.com/lbrayner/vtt-to-srt - For code related to converting subtitles from vtt to srt format
- https://github.com/r0oth3x49/udemy-dl - For some of the informaton related to using the udemy api