mirror of
https://cdm-project.com/Download-Tools/udemy-downloader.git
synced 2025-05-08 06:54:25 +02:00
added mkv functionality (WIP, don't use this)
This commit is contained in:
parent
169e2aeca5
commit
1e83f29d53
@ -1 +1 @@
|
|||||||
__version__ = "1.1.1"
|
__version__ = "1.1.1-mkv"
|
||||||
|
52
main.py
52
main.py
@ -37,6 +37,8 @@ course_name = None
|
|||||||
keep_vtt = False
|
keep_vtt = False
|
||||||
skip_hls = False
|
skip_hls = False
|
||||||
use_mkv = False
|
use_mkv = False
|
||||||
|
mkv_mux_args = []
|
||||||
|
mkv_subtitles = []
|
||||||
concurrent_connections = 10
|
concurrent_connections = 10
|
||||||
access_token = None
|
access_token = None
|
||||||
|
|
||||||
@ -847,6 +849,12 @@ def mux_process(video_title, video_filepath, audio_filepath, output_path):
|
|||||||
os.system(command)
|
os.system(command)
|
||||||
|
|
||||||
|
|
||||||
|
def make_mkv_mux(video_title, output_path):
|
||||||
|
args = ["mkvmerge", "-q", "-o",
|
||||||
|
output_path.replace("mp4", "mkv"), "--title", video_title, output_path]
|
||||||
|
return args
|
||||||
|
|
||||||
|
|
||||||
def decrypt(kid, in_filepath, out_filepath):
|
def decrypt(kid, in_filepath, out_filepath):
|
||||||
"""
|
"""
|
||||||
@author Jayapraveen
|
@author Jayapraveen
|
||||||
@ -866,7 +874,7 @@ def decrypt(kid, in_filepath, out_filepath):
|
|||||||
|
|
||||||
|
|
||||||
def handle_segments(url, format_id, video_title,
|
def handle_segments(url, format_id, video_title,
|
||||||
output_path, lecture_file_name, concurrent_connections, chapter_dir):
|
output_path, lecture_file_name, chapter_dir):
|
||||||
os.chdir(os.path.join(chapter_dir))
|
os.chdir(os.path.join(chapter_dir))
|
||||||
file_name = lecture_file_name.replace("%", "").replace(".mp4", "")
|
file_name = lecture_file_name.replace("%", "").replace(".mp4", "")
|
||||||
video_filepath_enc = file_name + ".encrypted.mp4"
|
video_filepath_enc = file_name + ".encrypted.mp4"
|
||||||
@ -995,10 +1003,12 @@ def download_aria(url, file_dir, filename):
|
|||||||
|
|
||||||
|
|
||||||
def process_caption(caption, lecture_title, lecture_dir, tries=0):
|
def process_caption(caption, lecture_title, lecture_dir, tries=0):
|
||||||
filename = f"%s_%s.%s" % (sanitize(lecture_title), caption.get("language"),
|
caption_language = caption.get("language")
|
||||||
caption.get("extension"))
|
caption_ext = caption.get("extension")
|
||||||
|
filename = f"%s_%s.%s" % (sanitize(lecture_title), caption_language,
|
||||||
|
caption_ext)
|
||||||
filename_no_ext = f"%s_%s" % (sanitize(lecture_title),
|
filename_no_ext = f"%s_%s" % (sanitize(lecture_title),
|
||||||
caption.get("language"))
|
caption_language)
|
||||||
filepath = os.path.join(lecture_dir, filename)
|
filepath = os.path.join(lecture_dir, filename)
|
||||||
|
|
||||||
if os.path.isfile(filepath):
|
if os.path.isfile(filepath):
|
||||||
@ -1007,27 +1017,33 @@ def process_caption(caption, lecture_title, lecture_dir, tries=0):
|
|||||||
print(f" > Downloading caption: '%s'" % filename)
|
print(f" > Downloading caption: '%s'" % filename)
|
||||||
try:
|
try:
|
||||||
download_aria(caption.get("download_url"), lecture_dir, filename)
|
download_aria(caption.get("download_url"), lecture_dir, filename)
|
||||||
|
return True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if tries >= 3:
|
if tries >= 3:
|
||||||
print(
|
print(
|
||||||
f" > Error downloading caption: {e}. Exceeded retries, skipping."
|
f" > Error downloading caption: {e}. Exceeded retries, skipping."
|
||||||
)
|
)
|
||||||
return
|
return False
|
||||||
else:
|
else:
|
||||||
print(
|
print(
|
||||||
f" > Error downloading caption: {e}. Will retry {3-tries} more times."
|
f" > Error downloading caption: {e}. Will retry {3-tries} more times."
|
||||||
)
|
)
|
||||||
process_caption(caption, lecture_title, lecture_dir, keep_vtt,
|
process_caption(caption, lecture_title, lecture_dir, keep_vtt,
|
||||||
tries + 1)
|
tries + 1)
|
||||||
|
|
||||||
if caption.get("extension") == "vtt":
|
if caption.get("extension") == "vtt":
|
||||||
try:
|
try:
|
||||||
print(" > Converting caption to SRT format...")
|
print(" > Converting caption to SRT format...")
|
||||||
convert(lecture_dir, filename_no_ext)
|
convert(lecture_dir, filename_no_ext)
|
||||||
print(" > Caption conversion complete.")
|
print(" > Caption conversion complete.")
|
||||||
|
|
||||||
if not keep_vtt:
|
if not keep_vtt:
|
||||||
os.remove(filepath)
|
os.remove(filepath)
|
||||||
|
|
||||||
|
return True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f" > Error converting caption: {e}")
|
print(f" > Error converting caption: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def process_lecture(lecture, lecture_path, lecture_file_name, chapter_dir):
|
def process_lecture(lecture, lecture_path, lecture_file_name, chapter_dir):
|
||||||
@ -1081,7 +1097,6 @@ def process_lecture(lecture, lecture_path, lecture_file_name, chapter_dir):
|
|||||||
"aria2c", "-o", f"{temp_filepath}", f"{url}"
|
"aria2c", "-o", f"{temp_filepath}", f"{url}"
|
||||||
]).wait()
|
]).wait()
|
||||||
if ret_code == 0:
|
if ret_code == 0:
|
||||||
# os.rename(temp_filepath, lecture_path)
|
|
||||||
print(" > HLS Download success")
|
print(" > HLS Download success")
|
||||||
else:
|
else:
|
||||||
download_aria(url, chapter_dir, lecture_title + ".mp4")
|
download_aria(url, chapter_dir, lecture_title + ".mp4")
|
||||||
@ -1224,7 +1239,28 @@ def parse_new(_udemy):
|
|||||||
for subtitle in subtitles:
|
for subtitle in subtitles:
|
||||||
lang = subtitle.get("language")
|
lang = subtitle.get("language")
|
||||||
if lang == caption_locale or caption_locale == "all":
|
if lang == caption_locale or caption_locale == "all":
|
||||||
process_caption(subtitle, lecture_title, chapter_dir)
|
# ret_val should be True or False indicating download success
|
||||||
|
ret_val = process_caption(subtitle, lecture_title, chapter_dir)
|
||||||
|
|
||||||
|
if use_mkv:
|
||||||
|
print("> Muxing MKV and {} subtitles...".format(
|
||||||
|
len(mkv_subtitles)))
|
||||||
|
mkv_mux_args = ["mkvmerge", "-q", "-o", lecture_path.replace(
|
||||||
|
".mp4", ".mkv"), "--title", lecture_title, lecture_path]
|
||||||
|
|
||||||
|
for i in range(2, len(mkv_subtitles)):
|
||||||
|
caption = mkv_subtitles[i]
|
||||||
|
lang = caption.get("language")
|
||||||
|
mkv_mux_args.append("--language")
|
||||||
|
mkv_mux_args.append(i + ":" + lang)
|
||||||
|
mkv_mux_args.append(i.get("path"))
|
||||||
|
|
||||||
|
ret_code = subprocess.Popen(mkv_mux_args).wait()
|
||||||
|
if ret_code == 0:
|
||||||
|
os.remove(lecture_path)
|
||||||
|
|
||||||
|
for subtitle in mkv_subtitles:
|
||||||
|
os.remove(subtitle)
|
||||||
|
|
||||||
|
|
||||||
def _print_course_info(course_data):
|
def _print_course_info(course_data):
|
||||||
@ -1373,7 +1409,7 @@ if __name__ == "__main__":
|
|||||||
help="If specified, HLS streams will be skipped (faster fetching, HLS streams usually contain 1080p quality for non-DRM lectures)",
|
help="If specified, HLS streams will be skipped (faster fetching, HLS streams usually contain 1080p quality for non-DRM lectures)",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--use_mkv",
|
"--use-mkv",
|
||||||
dest="use_mkv",
|
dest="use_mkv",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
help="If specified, MKV container will be used instead of MP4, subtitles will be muxed (if subtitles are requested)",
|
help="If specified, MKV container will be used instead of MP4, subtitles will be muxed (if subtitles are requested)",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user