mirror of
https://cdm-project.com/Download-Tools/udemy-downloader.git
synced 2025-04-30 00:34:24 +02:00
add 'continuous numbering' option
This commit is contained in:
parent
935b2a41f3
commit
79ea132962
25
README.md
25
README.md
@ -84,9 +84,10 @@ You can now run the program, see the examples below. The course will download to
|
|||||||
# Advanced Usage
|
# Advanced Usage
|
||||||
|
|
||||||
```
|
```
|
||||||
usage: main.py [-h] -c COURSE_URL [-b BEARER_TOKEN] [-q QUALITY] [-l LANG] [-cd CONCURRENT_DOWNLOADS] [--disable-ipv6] [--skip-lectures] [--download-assets] [--download-captions] [--download-quizzes]
|
usage: main.py [-h] -c COURSE_URL [-b BEARER_TOKEN] [-q QUALITY] [-l LANG] [-cd CONCURRENT_DOWNLOADS] [--disable-ipv6] [--skip-lectures] [--download-assets]
|
||||||
[--keep-vtt] [--skip-hls] [--info] [--id-as-course-name] [-sc] [--save-to-file] [--load-from-file] [--log-level LOG_LEVEL] [--browser {chrome,firefox,opera,edge,brave,chromium,vivaldi,safari}]
|
[--download-captions] [--download-quizzes] [--keep-vtt] [--skip-hls] [--info] [--id-as-course-name] [-sc] [--save-to-file] [--load-from-file]
|
||||||
[--use-h265] [--h265-crf H265_CRF] [--h265-preset H265_PRESET] [--use-nvenc] [-v]
|
[--log-level LOG_LEVEL] [--browser {chrome,firefox,opera,edge,brave,chromium,vivaldi,safari}] [--use-h265] [--h265-crf H265_CRF] [--h265-preset H265_PRESET]
|
||||||
|
[--use-nvenc] [--out OUT] [--continue-lecture-numbers]
|
||||||
|
|
||||||
Udemy Downloader
|
Udemy Downloader
|
||||||
|
|
||||||
@ -97,7 +98,8 @@ options:
|
|||||||
-b BEARER_TOKEN, --bearer BEARER_TOKEN
|
-b BEARER_TOKEN, --bearer BEARER_TOKEN
|
||||||
The Bearer token to use
|
The Bearer token to use
|
||||||
-q QUALITY, --quality QUALITY
|
-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
|
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')
|
-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
|
-cd CONCURRENT_DOWNLOADS, --concurrent-downloads CONCURRENT_DOWNLOADS
|
||||||
The number of maximum concurrent downloads for segments (HLS and DASH, must be a number 1-30)
|
The number of maximum concurrent downloads for segments (HLS and DASH, must be a number 1-30)
|
||||||
@ -112,10 +114,10 @@ options:
|
|||||||
--id-as-course-name If specified, the course id will be used in place of the course name for the output directory. This is a 'hack' to reduce the path length
|
--id-as-course-name If specified, the course id will be used in place of the course name for the output directory. This is a 'hack' to reduce the path length
|
||||||
-sc, --subscription-course
|
-sc, --subscription-course
|
||||||
Mark the course as a subscription based course, use this if you are having problems with the program auto detecting it
|
Mark the course as a subscription based course, use this if you are having problems with the program auto detecting it
|
||||||
--save-to-file If specified, course content will be saved to a file that can be loaded later with --load-from-file, this can reduce processing time (Note that asset links expire after a certain
|
--save-to-file If specified, course content will be saved to a file that can be loaded later with --load-from-file, this can reduce processing time (Note that asset
|
||||||
amount of time)
|
links expire after a certain amount of time)
|
||||||
--load-from-file If specified, course content will be loaded from a previously saved file with --save-to-file, this can reduce processing time (Note that asset links expire after a certain amount of
|
--load-from-file If specified, course content will be loaded from a previously saved file with --save-to-file, this can reduce processing time (Note that asset links
|
||||||
time)
|
expire after a certain amount of time)
|
||||||
--log-level LOG_LEVEL
|
--log-level LOG_LEVEL
|
||||||
Logging level: one of DEBUG, INFO, ERROR, WARNING, CRITICAL (Default is INFO)
|
Logging level: one of DEBUG, INFO, ERROR, WARNING, CRITICAL (Default is INFO)
|
||||||
--browser {chrome,firefox,opera,edge,brave,chromium,vivaldi,safari}
|
--browser {chrome,firefox,opera,edge,brave,chromium,vivaldi,safari}
|
||||||
@ -125,7 +127,9 @@ options:
|
|||||||
--h265-preset H265_PRESET
|
--h265-preset H265_PRESET
|
||||||
Set a custom preset value for H.265 encoding. FFMPEG default is medium
|
Set a custom preset value for H.265 encoding. FFMPEG default is medium
|
||||||
--use-nvenc Whether to use the NVIDIA hardware transcoding for H.265. Only works if you have a supported NVIDIA GPU and ffmpeg with nvenc support
|
--use-nvenc Whether to use the NVIDIA hardware transcoding for H.265. Only works if you have a supported NVIDIA GPU and ffmpeg with nvenc support
|
||||||
-v, --version show program's version number and exit
|
--out OUT, -o OUT Set the path to the output directory
|
||||||
|
--continue-lecture-numbers, -n
|
||||||
|
Use continuous lecture numbering instead of per-chapter
|
||||||
```
|
```
|
||||||
|
|
||||||
- Passing a Bearer Token and Course ID as an argument
|
- Passing a Bearer Token and Course ID as an argument
|
||||||
@ -177,6 +181,9 @@ options:
|
|||||||
- `python main.py -c <Course URL> --use-h265 --h265-preset faster`
|
- `python main.py -c <Course URL> --use-h265 --h265-preset faster`
|
||||||
- Encode in H.265 using NVIDIA hardware transcoding:
|
- Encode in H.265 using NVIDIA hardware transcoding:
|
||||||
- `python main.py -c <Course URL> --use-h265 --use-nvenc`
|
- `python main.py -c <Course URL> --use-h265 --use-nvenc`
|
||||||
|
- Use continuous numbering (don't restart at 1 in every chapter):
|
||||||
|
- `python main.py -c <Course URL> --continue-lecture-numbers`
|
||||||
|
- `python main.py -c <Course URL> -n`
|
||||||
|
|
||||||
If you encounter errors while downloading such as
|
If you encounter errors while downloading such as
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
__version__ = "1.2.11"
|
|
17
main.py
17
main.py
@ -23,7 +23,6 @@ from pathvalidate import sanitize_filename
|
|||||||
from requests.exceptions import ConnectionError as conn_error
|
from requests.exceptions import ConnectionError as conn_error
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
from _version import __version__
|
|
||||||
from constants import *
|
from constants import *
|
||||||
from tls import SSLCiphers
|
from tls import SSLCiphers
|
||||||
from utils import extract_kid
|
from utils import extract_kid
|
||||||
@ -60,6 +59,7 @@ h265_preset = "medium"
|
|||||||
use_nvenc = False
|
use_nvenc = False
|
||||||
browser = None
|
browser = None
|
||||||
cj = None
|
cj = None
|
||||||
|
use_continuous_lecture_numbers = False
|
||||||
|
|
||||||
|
|
||||||
# from https://stackoverflow.com/a/21978778/9785713
|
# from https://stackoverflow.com/a/21978778/9785713
|
||||||
@ -72,7 +72,7 @@ def log_subprocess_output(prefix: str, pipe: IO[bytes]):
|
|||||||
|
|
||||||
# this is the first function that is called, we parse the arguments, setup the logger, and ensure that required directories exist
|
# this is the first function that is called, we parse the arguments, setup the logger, and ensure that required directories exist
|
||||||
def pre_run():
|
def pre_run():
|
||||||
global dl_assets, dl_captions, dl_quizzes, skip_lectures, caption_locale, quality, bearer_token, course_name, keep_vtt, skip_hls, concurrent_downloads, disable_ipv6, load_from_file, save_to_file, bearer_token, course_url, info, logger, keys, id_as_course_name, LOG_LEVEL, use_h265, h265_crf, h265_preset, use_nvenc, browser, is_subscription_course, DOWNLOAD_DIR
|
global dl_assets, dl_captions, dl_quizzes, skip_lectures, caption_locale, quality, bearer_token, course_name, keep_vtt, skip_hls, concurrent_downloads, disable_ipv6, load_from_file, save_to_file, bearer_token, course_url, info, logger, keys, id_as_course_name, LOG_LEVEL, use_h265, h265_crf, h265_preset, use_nvenc, browser, is_subscription_course, DOWNLOAD_DIR, use_continuous_lecture_numbers
|
||||||
|
|
||||||
# make sure the logs directory exists
|
# make sure the logs directory exists
|
||||||
if not os.path.exists(LOG_DIR_PATH):
|
if not os.path.exists(LOG_DIR_PATH):
|
||||||
@ -225,7 +225,13 @@ def pre_run():
|
|||||||
type=str,
|
type=str,
|
||||||
help="Set the path to the output directory",
|
help="Set the path to the output directory",
|
||||||
)
|
)
|
||||||
parser.add_argument("-v", "--version", action="version", version="You are running version {version}".format(version=__version__))
|
parser.add_argument(
|
||||||
|
"--continue-lecture-numbers", "-n",
|
||||||
|
dest="use_continuous_lecture_numbers",
|
||||||
|
action="store_true",
|
||||||
|
help="Use continuous lecture numbering instead of per-chapter",
|
||||||
|
)
|
||||||
|
# parser.add_argument("-v", "--version", action="version", version="You are running version {version}".format(version=__version__))
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if args.download_assets:
|
if args.download_assets:
|
||||||
@ -295,6 +301,8 @@ def pre_run():
|
|||||||
browser = args.browser
|
browser = args.browser
|
||||||
if args.out:
|
if args.out:
|
||||||
DOWNLOAD_DIR = os.path.abspath(args.out)
|
DOWNLOAD_DIR = os.path.abspath(args.out)
|
||||||
|
if args.use_continuous_lecture_numbers:
|
||||||
|
use_continuous_lecture_numbers = args.use_continuous_lecture_numbers
|
||||||
|
|
||||||
# setup a logger
|
# setup a logger
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -1980,7 +1988,8 @@ def main():
|
|||||||
|
|
||||||
if clazz == "chapter":
|
if clazz == "chapter":
|
||||||
# reset lecture tracking
|
# reset lecture tracking
|
||||||
lecture_counter = 0
|
if not use_continuous_lecture_numbers:
|
||||||
|
lecture_counter = 0
|
||||||
lectures = []
|
lectures = []
|
||||||
|
|
||||||
chapter_index = entry.get("object_index")
|
chapter_index = entry.get("object_index")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user