diff --git a/helpers/Muxer.py b/helpers/Muxer.py index 9c288c5..a7c3d09 100644 --- a/helpers/Muxer.py +++ b/helpers/Muxer.py @@ -318,10 +318,15 @@ class Muxer(object): def LanguageList(self): LanguageList = [ - ["Hindi", "hin", "hin", "Hindi"], - ["Tamil", "tam", "tam", "Tamil"], - ["Telugu", "tel", "tel", "Telugu"], + ["Simplified Chinese", "zhoS", "chi", "Simplified Chinese"], + ["Traditional Chinese", "zhoT", "chi", "Traditional Chinese"], + ["Mandarin (Putonghua)", "zho", "zh-cmn", "Mandarin"], + ["Mandarin (Guoyu)", "zho", "chi", "Chinese"], + ["Cantonese", "zho", "zh-yue", "Cantonese"], + ["Taiwanese", "zho", "zh-nan", "Minnan"], + ["Chinese", "zho", "chi", "Chinese"], ["English", "eng", "eng", "English"], + ["British English", "enGB", "eng", "British English"], ["Afrikaans", "af", "afr", "Afrikaans"], ["Arabic", "ara", "ara", "Arabic"], ["Arabic (Syria)", "araSy", "ara", "Arabic Syria"], @@ -348,16 +353,15 @@ class Muxer(object): ["Assamese", "asm", "asm", "Assamese"], ["Bengali", "ben", "ben", "Bengali"], ["Basque", "eus", "baq", "Basque"], - ["British English", "enGB", "eng", "British English"], ["Bulgarian", "bul", "bul", "Bulgarian"], - ["Cantonese", "None", "chi", "Cantonese"], ["Catalan", "cat", "cat", "Catalan"], - ["Simplified Chinese", "zhoS", "chi", "Chinese Simplified"], - ["Traditional Chinese", "zhoT", "chi", "Chinese Traditional"], ["Croatian", "hrv", "hrv", "Croatian"], ["Czech", "ces", "cze", "Czech"], ["Danish", "dan", "dan", "Danish"], ["Dutch", "nld", "dut", "Dutch"], + ["Hindi", "hin", "hin", "Hindi"], + ["Tamil", "tam", "tam", "Tamil"], + ["Telugu", "tel", "tel", "Telugu"], ["Estonian", "est", "est", "Estonian"], ["Filipino", "fil", "fil", "Filipino"], ["Finnish", "fin", "fin", "Finnish"], @@ -496,8 +500,6 @@ class Muxer(object): self.mkvmerge, "--output", outputVideo, - "--title", - 'RAB', "(", inputVideo, ")", @@ -585,7 +587,7 @@ class Muxer(object): "--language", f"0:{language_id}", "--track-name", - f"0:Forced", + f"0:{language_name} Forced", "--forced-track", "0:yes", "--default-track", @@ -604,7 +606,7 @@ class Muxer(object): "--language", f"0:{language_id}", "--track-name", - f"0:SDH", + f"0:{language_name} SDH", "--forced-track", "0:no", "--default-track", diff --git a/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc b/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc index 30ab199..1712300 100644 Binary files a/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc and b/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc b/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc index b586ef1..40c5c61 100644 Binary files a/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc and b/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc b/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc index 126cc6c..c8112de 100644 Binary files a/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc and b/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc differ diff --git a/helpers/Parsers/Netflix/get_keys.py b/helpers/Parsers/Netflix/get_keys.py index 838854e..9952a66 100644 --- a/helpers/Parsers/Netflix/get_keys.py +++ b/helpers/Parsers/Netflix/get_keys.py @@ -60,15 +60,15 @@ def __profiles(profile, addHEVCDO=False): "hevc-main-L30-dash-cenc", "hevc-main10-L30-dash-cenc", "hevc-main10-L30-dash-cenc-prk", - "hevc-main-L31-dash-cenc" + "hevc-main-L31-dash-cenc", "hevc-main10-L31-dash-cenc", "hevc-main10-L31-dash-cenc-prk", - "hevc-main-L40-dash-cenc", + "hevc-main-L40-dash-cenc", "hevc-main10-L40-dash-cenc", - "hevc-main10-L40-dash-cenc-prk", - "hevc-main-L41-dash-cenc", + "hevc-main10-L40-dash-cenc-prk", + "hevc-main-L41-dash-cenc", "hevc-main10-L41-dash-cenc", - "hevc-main10-L41-dash-cenc-prk" + "hevc-main10-L41-dash-cenc-prk", ] if addHEVCDO: profiles += [ @@ -80,18 +80,16 @@ def __profiles(profile, addHEVCDO=False): elif profile == 'HDR-10 KEYS': profiles += [ - "hevc-hdr-main10-L30-dash-cenc", - "hevc-hdr-main10-L30-dash-cenc-prk", - "hevc-hdr-main10-L31-dash-cenc", - "hevc-hdr-main10-L31-dash-cenc-prk", - "hevc-hdr-main10-L40-dash-cenc", - "hevc-hdr-main10-L41-dash-cenc", - "hevc-hdr-main10-L40-dash-cenc-prk", - "hevc-hdr-main10-L41-dash-cenc-prk" + 'hevc-hdr-main10-L30-dash-cenc', + 'hevc-hdr-main10-L30-dash-cenc-prk', + 'hevc-hdr-main10-L31-dash-cenc', + 'hevc-hdr-main10-L31-dash-cenc-prk', + 'hevc-hdr-main10-L40-dash-cenc', + 'hevc-hdr-main10-L40-dash-cenc-prk', ] else: profiles += [ - "playready-h264mpl30-dash", + "playready-h264mpl30-dash", ] return profiles diff --git a/helpers/Parsers/Netflix/get_manifest.py b/helpers/Parsers/Netflix/get_manifest.py index 8f1e14b..464f7d2 100644 --- a/helpers/Parsers/Netflix/get_manifest.py +++ b/helpers/Parsers/Netflix/get_manifest.py @@ -19,14 +19,12 @@ def MSLprofiles(): "playready-h264mpl31-dash", ], "FHD": [ - "playready-h264bpl30-dash", "playready-h264mpl22-dash", "playready-h264mpl30-dash", "playready-h264mpl31-dash", "playready-h264mpl40-dash", ], "ALL": [ - "playready-h264bpl30-dash", "playready-h264mpl22-dash", "playready-h264mpl30-dash", "playready-h264mpl31-dash", @@ -366,6 +364,7 @@ class get_manifest: return VideoList def ParseVideo(self, resp, getHigh): + manifest = resp["result"] VideoList = [] checkerinfo = "" @@ -410,21 +409,30 @@ class get_manifest: if getHigh: HighVideoList = self.HighVideoMSL() if not HighVideoList == []: - checkerinfo = "\nNetflix Profile Checker v1.0\nMAIN: {}kbps | {}\nHIGH: {}kbps | {}\n\n{}\n" + # 判断high或main,要求main比high的vamf更大的情况下选择main + # main和high的vamf相同时选择high + if int(dict(VideoList[-1])["vmaf"]) >= int(dict(HighVideoList[-1])["vmaf"]) and int(dict(VideoList[-1])["Bitrate"]) >= int(dict(HighVideoList[-1])["Bitrate"]): + check_high_or_main = "MAIN" + else: check_high_or_main = "HIGH" + + checkerinfo = "\nNetflix Profile Checker v1.1\n2021-10-19 Jared_mod\n\nMain Rate: {}kbps | Vamf: {} | Profile: {}\nHigh Rate: {}kbps | Vamf: {} | Profile: {}\n\nResult: {} is Better!\n" checkerinfo = checkerinfo.format( str(dict(VideoList[-1])["Bitrate"]), + str(dict(VideoList[-1])["vmaf"]), str(dict(VideoList[-1])["Profile"]), str(dict(HighVideoList[-1])["Bitrate"]), + str(dict(HighVideoList[-1])["vmaf"]), str(dict(HighVideoList[-1])["Profile"]), - "result: MAIN is Better" - if int(dict(VideoList[-1])["Bitrate"]) - >= int(dict(HighVideoList[-1])["Bitrate"]) - else "result: HIGH is Better", + check_high_or_main, ) - - VideoList += HighVideoList self.logger.debug("HighVideoList: {}".format(HighVideoList)) + if check_high_or_main == "MAIN": + # 合并main和high解析列表 + VideoList += HighVideoList + elif check_high_or_main == "HIGH": + VideoList = HighVideoList + VideoList = sorted(VideoList, key=lambda k: int(k["Bitrate"])) return VideoList, checkerinfo diff --git a/helpers/aria2.py b/helpers/aria2.py index 1e3d012..02e36a0 100644 --- a/helpers/aria2.py +++ b/helpers/aria2.py @@ -163,15 +163,11 @@ class aria2: def aria2Options( self, allow_overwrite=True, - file_allocation=None, auto_file_renaming=False, async_dns=False, retry_wait=5, - summary_interval=0, - enable_color=False, - connection=16, - concurrent_downloads=16, - split=16, + enable_color=True, + concurrent_downloads=5, header="skip", user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36", uri_selector="inorder", @@ -179,51 +175,106 @@ class aria2: download_result="hide", quiet="false", extra_commands=[], + + # 单服务器最大连接线程数 + connection=64, + # 单任务最大连接线程数 + split=64, + # 代理地址,根据需要修改 + http_proxy_aria2c="http://127.0.0.1:7890", + https_proxy_aria2c="http://127.0.0.1:7890", + # 保存会话进度,用于断点续传 + save_session_interval=1, + auto_save_interval=30, + force_save="false", + # 文件最小分段大小 + min_split_size="4M", + # 磁盘缓存 + max_tries="0", + # HTTP/FTP下载分片大小 + piece_length="1M", + # 下载进度摘要输出间隔时间 + summary_interval=0, + # 断点续传 + continue_aria2c="true", + # 文件预分配方式 可选:none, prealloc, trunc, falloc + # 机械硬盘:falloc + # 固态硬盘:none + # prealloc 分配速度慢, trunc 无实际作用,不推荐使用。 + file_allocation="none", + # 磁盘缓存 + disk_cache="64M", ): options = [] + extra_commands allow_overwrite = self.convert_args(allow_overwrite) quiet = self.convert_args(quiet) - file_allocation = self.convert_args(file_allocation) auto_file_renaming = self.convert_args(auto_file_renaming) async_dns = self.convert_args(async_dns) retry_wait = self.convert_args(retry_wait) enable_color = self.convert_args(enable_color) - connection = self.convert_args(connection) concurrent_downloads = self.convert_args(concurrent_downloads) - split = self.convert_args(split) header = self.convert_args(header) + user_agent = self.convert_args(user_agent) uri_selector = self.convert_args(uri_selector) console_log_level = self.convert_args(console_log_level) download_result = self.convert_args(download_result) + connection = self.convert_args(connection) + split = self.convert_args(split) + http_proxy_aria2c = self.convert_args(http_proxy_aria2c) + https_proxy_aria2c = self.convert_args(https_proxy_aria2c) + save_session_interval = self.convert_args(save_session_interval) + auto_save_interval = self.convert_args(auto_save_interval) + force_save = self.convert_args(force_save) + min_split_size = self.convert_args(min_split_size) + max_tries = self.convert_args(max_tries) + piece_length = self.convert_args(piece_length) + summary_interval = self.convert_args(summary_interval) + continue_aria2c = self.convert_args(continue_aria2c) + file_allocation = self.convert_args(file_allocation) + disk_cache = self.convert_args(disk_cache) + ############################################################################## options += self.append_commands(options, "--allow-overwrite=", allow_overwrite) options += self.append_commands(options, "--quiet=", quiet) - options += self.append_commands(options, "--file-allocation=", file_allocation) + options += self.append_commands( options, "--auto-file-renaming=", auto_file_renaming ) options += self.append_commands(options, "--async-dns=", async_dns) options += self.append_commands(options, "--retry-wait=", retry_wait) options += self.append_commands(options, "--enable-color=", enable_color) - - options += self.append_commands( - options, "--max-connection-per-server=", connection - ) - options += self.append_commands( options, "--max-concurrent-downloads=", concurrent_downloads ) - options += self.append_commands(options, "--split=", split) + options += self.append_commands(options, "--header=", header) + options += self.append_commands(options, "--user-agent=", user_agent) options += self.append_commands(options, "--uri-selector=", uri_selector) options += self.append_commands( options, "--console-log-level=", console_log_level ) options += self.append_commands(options, "--download-result=", download_result) + options += self.append_commands( + options, "--max-connection-per-server=", connection + ) + options += self.append_commands(options, "--split=", split) + options += self.append_commands(options, "--http-proxy=", http_proxy_aria2c) + options += self.append_commands(options, "--https-proxy=", https_proxy_aria2c) + options += self.append_commands(options, "--save-session-interval=", save_session_interval) + options += self.append_commands(options, "--auto-save-interval=", auto_save_interval) + options += self.append_commands(options, "--force-save=", force_save) + options += self.append_commands(options, "--min-split-size=", min_split_size) + options += self.append_commands(options, "--max-tries=", max_tries) + options += self.append_commands(options, "--piece-length=", piece_length) + options += self.append_commands(options, "--summary-interval=", summary_interval) + options += self.append_commands(options, "--continue=", continue_aria2c) + options += self.append_commands(options, "--file-allocation=", file_allocation) + options += self.append_commands(options, "--disk-cache=", disk_cache) + return options def aria2DisableProxies(self): diff --git a/helpers/ripprocess.py b/helpers/ripprocess.py index 8439c0f..be4b090 100644 --- a/helpers/ripprocess.py +++ b/helpers/ripprocess.py @@ -386,6 +386,10 @@ class ripprocess(object): return "Mandarin Chinese (Simplified)", "zh-Hans" elif code == "cmn-Hant": return "Mandarin Chinese (Traditional)", "zh-Hant" + elif code == "zh-TW": + return "Chinese", "zho" + elif code == "zh-CN": + return "Chinese", "zho" elif code == "es-419": return "Spanish", "spa" elif code == "es-ES": @@ -674,16 +678,18 @@ class ripprocess(object): outputName = inputName.replace(replace_str, ext) self.logger.info(("{} -> {}").format(inputName, outputName)) - ff = ffmpy.FFmpeg( - executable=self.bin["ffmpeg"], - inputs={inputName: None}, - outputs={outputName: "-c:a copy"}, - global_options="-vn -sn -y -hide_banner -loglevel panic", - ) - ff.run() - time.sleep(0.05) - if os.path.isfile(outputName) and os.path.getsize(outputName) > 1024 * 1024: - os.remove(inputName) + #直接重命名到目标格式,移除ffmpeg混流过程 + os.rename(inputName, outputName) + #ff = ffmpy.FFmpeg( + # executable=self.bin["ffmpeg"], + # inputs={inputName: None}, + # outputs={outputName: "-c:a copy"}, + # global_options="-vn -sn -y -hide_banner -loglevel panic", + #) + #ff.run() + #time.sleep(0.05) + #if os.path.isfile(outputName) and os.path.getsize(outputName) > 1024 * 1024: + # os.remove(inputName) self.logger.info("Done!") return diff --git a/services/__pycache__/netflix.cpython-39.pyc b/services/__pycache__/netflix.cpython-39.pyc index b703372..37295b7 100644 Binary files a/services/__pycache__/netflix.cpython-39.pyc and b/services/__pycache__/netflix.cpython-39.pyc differ diff --git a/services/netflix.py b/services/netflix.py index 96d0a37..d535139 100644 --- a/services/netflix.py +++ b/services/netflix.py @@ -299,7 +299,10 @@ class netflix: def downloadFile2(self, url, file_name): with open(file_name, "wb") as f: - response = requests.get(url, stream=True) + #避免ssl错误卡死,关闭requests模块ssl证书验证:verify=False + #关闭后,控制台持续输出警告,建议开启证书验证,取消注释下行代码可以屏蔽 + #requests.packages.urllib3.diable_warnings() + response = requests.get(url, stream=True, verify=False) #response.encoding = 'UTF-8' f.write(response.content) @@ -320,10 +323,7 @@ class netflix: async_dns="skip", retry_wait=5, summary_interval=0, - enable_color=True, - connection=16, - concurrent_downloads=16, - split=16, + concurrent_downloads=5, uri_selector="inorder", console_log_level="warn", download_result="hide", @@ -389,17 +389,19 @@ class netflix: return "DDP5.1" def RemuxVideo(self, outputVideoTemp, outputVideo, Name): - self.logger.info("\nRemuxing video...") - ff = ffmpy.FFmpeg( - executable=self.bin["ffmpeg"], - inputs={outputVideoTemp: None}, - outputs={outputVideo: "-c copy"}, - global_options="-y -hide_banner -loglevel warning", - ) - - ff.run() - time.sleep(50.0 / 1000.0) - os.remove(outputVideoTemp) + #self.logger.info("\nRemuxing video...") + #ff = ffmpy.FFmpeg( + # executable=self.bin["ffmpeg"], + # inputs={outputVideoTemp: None}, + # outputs={outputVideo: "-c copy"}, + # global_options="-y -hide_banner -loglevel warning", + #) + #ff.run() + #time.sleep(50.0 / 1000.0) + #os.remove(outputVideoTemp) + + #解密视频文件直接重命名,移除ffmpeg混流过程 + os.rename(outputVideoTemp, outputVideo) self.logger.info("Done!") return True @@ -461,6 +463,7 @@ class netflix: if not only1key == []: KEYS = only1key + # 未解密视频传递ripprocess模块解密 self.ripprocess.mp4_decrypt( encrypted=inputVideo, decrypted=outputVideoTemp, @@ -470,18 +473,21 @@ class netflix: silent=silent, ) - if not "NETFLIX".lower() in list( - map(lambda x: x.lower(), self.video_settings["skip_video_demux"]) - ): - self.ripprocess.DemuxVideo( - outputVideoTemp=outputVideoTemp, - outputVideo=outputVideo, - ffmpeg=True, - mp4box=False, - ) - else: - os.rename(outputVideoTemp, outputVideo) - + #不理解这个模块的判断逻辑,操作是把解密的视频,传入ffmpeg重新封装 + #if not "NETFLIX".lower() in list( + # map(lambda x: x.lower(), self.video_settings["skip_video_demux"]) + #): + # self.ripprocess.DemuxVideo( + # outputVideoTemp=outputVideoTemp, + # outputVideo=outputVideo, + # ffmpeg=True, + # mp4box=False, + # ) + #else: + # os.rename(outputVideoTemp, outputVideo) + + #移除判断,解密后视频文件直接重命名 + os.rename(outputVideoTemp, outputVideo) return True def SubtitleThreader(self, subtitlesList, name):