Compare commits

...

17 Commits

Author SHA1 Message Date
Jared-02 4df1390714 Specifics Adjustment 2021-11-17 11:38:08 +08:00
Jared-02 8291497843 Improve the check main or high module 2021-11-07 21:31:27 +08:00
Jared-02 a6debd0c8d fix spelling mistakes 2021-11-07 20:06:28 +08:00
Jared-02 19ea1f4299 fix spelling mistakes 2021-11-03 03:52:13 +08:00
Jared-02 557d6554f0 Improve the logic of choosing main or high 2021-10-25 02:48:50 +08:00
Jared-02 ac5049ad81 Improve Readme.md to Help V2 2021-10-20 02:23:59 +08:00
Jared-02 fa11f0f41e
Improve Readme.md to Help 2021-10-20 02:07:07 +08:00
Jared-02 cac68bafff Refactored Aria2c Settings 2021-10-19 21:04:52 +08:00
Jared-02 8c4bef86df
Performance improvements 2021-10-19 13:25:05 +08:00
Jared-02 aff3544b9e
Update Tools 20211019 2021-10-19 13:17:48 +08:00
tainapedroso 817abba403
Update config.py 2021-09-14 23:53:45 -03:00
tainapedroso 0607cdd3fd
Add files via upload 2021-09-14 23:50:04 -03:00
tainapedroso e7712a2c89
Update get_keys.py 2021-09-14 23:48:48 -03:00
tainapedroso d5ff7ee149
Update get_keys.py 2021-09-14 23:45:35 -03:00
tainapedroso 76b40fa2a8
Install method 2021-09-14 21:01:30 -03:00
tainapedroso 8c03a461ca
requirements 2021-09-14 21:00:34 -03:00
tainapedroso c6f180d599
Update get_keys.py 2021-09-14 20:56:12 -03:00
20 changed files with 307 additions and 109 deletions

View File

@ -1 +1,57 @@
# Netflix-videos-downloader
## 快速开始
```
pip install -r requirements.txt
```
## 参数
```
基础参数:
-h--help 显示完整参数设置帮助文档并退出
-q <数字> 视频分辨率默认选择最高1080可选4807201080等
-o <目录路径>
下载临时文件夹
-f <目录路径>
mkv混流输出文件夹不指定默认输出到下载临时文件夹
-s <数字> 季数Season不指定默认下载所有季
-e <数字> 集数Episode不指定默认下载全集
"-e 1" 下载第1集;
"-e 1-7" 下载第1-7集;
"-e 2,5" 下载第2集、第5集
-p--prompt
下载前交互式提示输入yes/no
--AD 语言代码,--alang 语言代码
指定音轨语言默认下载原始语言Original最高码率音轨
语言代码位置:"/helpers/Muxer.py"
--slang 语言代码
指定字幕语言,默认下载所有语言字幕,
例如"--slang zhoS zhoT" 即指定简体中文、繁体中文字幕
--flang 语言代码
指定“场景字幕”语言Force Subtitle
--all-audios
下载所有语言音轨
--all-forced
下载所有语言“场景字幕”
--audio-bitrate <数字>
指定音频码率默认下载最高码率音轨可选128256448等
--aformat-2c--audio-format-2ch
指定下载2.0声道音轨
--aformat-51ch--audio-format-51ch
指定下载5.1声道音轨
--keep 混流mkv后保留原始素材文件默认删除
-keys--license
仅输出widevine key到控制台并退出
--no-aria2c 不调用aria2c下载器使用Python下载器默认使用aria2c
不推荐使用此参数
--nv 不下载视频Video
--na 不下载音频Audio
--ns 不下载字幕Subtitle
额外配置文件参数Manifest
--main 指定 H.264 Main
--high 指定 H.264 High
--hevc 指定 H.265
--hdr 指定 H.265 HDR
--check 比较H.264 Main/H.264 High二者质量优劣
```

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -34,11 +34,11 @@ MUXER = {
"DEFAULT": False, # to use the normal renaming. EX: Stranger Things S01E01 [1080p].mkv
"AUDIO": "hin", # default audio language.
"SUB": "None", # default subtitle language. EX: "eng" or "spa"
"GROUP": "Tandav", # to change the group name!. it's also possible to use this "--gr LOL", on the ripping commands.
"noTitle": False, # this will remove titles from the episodes EX: (The Witcher S01E01). insstead of (The Witcher S01E01 The End's Beginning).
"GROUP": "TJUPT", # to change the group name!. it's also possible to use this "--gr LOL", on the ripping commands.
"noTitle": True, # this will remove titles from the episodes EX: (The Witcher S01E01). insstead of (The Witcher S01E01 The End's Beginning).
"scheme": "p2p", # add/change any needed scheme naming. it's also possible to use this "--muxscheme repack", on the ripping commands.
"schemeslist": {
"p2p": "{t}.{r}.{s}.WEB-DL.{ac}.{vc}-{gr}",
"p2p": "{t}.{r}.{s}.WEB-DL.{vc}.{ac}-{gr}",
"test": "{t}.{r}.{s}.WEB-DL-{gr}",
},
"EXTRAS": [], # extra mkvmerge.exe commands.
@ -48,7 +48,7 @@ MUXER = {
#####################################(PATHS)#####################################
PATHS = {
"DL_FOLDER": "E:/#rips", #
"DL_FOLDER": f"{dirPath}", #
"DIR_PATH": f"{dirPath}",
"BINARY_PATH": f"{dirPath}/bin",
"COOKIES_PATH": f"{dirPath}/configs/Cookies",
@ -60,6 +60,19 @@ PATHS = {
ARIA2C = {
"enable_logging": False, # True
"enable_pass_config_to_aria2c": True, #传递aria2c参数
"file_allocation": "none", # 文件预分配方式:机械硬盘 falloc固态硬盘 none
"http_proxy_aria2c": "http://127.0.0.1:7890", # 代理地址,根据需要修改
"https_proxy_aria2c": "http://127.0.0.1:7890",
"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",
"connection": "64", # 单服务器最大连接线程数
"split": "64", # 单任务最大连接线程数
"summary_interval": "0", # 下载进度摘要输出间隔时间
"continue_aria2c": "true", # 断点续传
"max_tries": "0", # 最大尝试次数0 表示无限
"piece_length": "1M", # HTTP/FTP下载分片大小
"min_split_size": "4M", # 文件最小分段大小,理论上值越小下载速度越快
"disk_cache": "64M", # 磁盘缓存,提升读写性能,有足够内存情况下增加
}
SETTINGS = {
@ -67,7 +80,7 @@ SETTINGS = {
}
#####################################(VPN)#####################################
# 不要修改这部分
VPN = {
"proxies": None, # "http://151.253.165.70:8080",
"nordvpn": {
@ -78,7 +91,7 @@ VPN = {
},
"private": {
"port": "8080",
"email": "abdalhmohmd8@gmail.com",
"email": "xxx",
"passwd": "123456",
"http": "http://{email}:{passwd}@{ip}:{port}",
},
@ -105,8 +118,8 @@ Config["NETFLIX"] = {
"cookies_txt": f"{dirPath}/configs/Cookies/cookies.txt",
"keys_file": f"{dirPath}/configs/KEYS/netflix.keys",
"token_file": f"{dirPath}/configs/Tokens/netflix_token.json",
"email": "Cfklop@max07.club",
"password": "1111",
"email": "xxxxxx@gmail.com",
"password": "123123",
"manifest_language": "en-US",
"metada_language": "en",
"manifestEsn": "NFCDIE-03-{}".format(utils().random_hex(30)),

View File

@ -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",

View File

@ -52,7 +52,7 @@ def __profiles(profile, addHEVCDO=False):
elif profile == "Main KEYS":
profiles += [
"playready-h264mpl30-dash",
"playready-h264bpl30-dash",
]
elif profile == "HEVC KEYS":
@ -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
@ -156,4 +154,4 @@ def GettingKEYS_Netflixv2(nfID, profile): #
Correct, keyswvdecrypt = wvdecrypt.start_process()
KEYS = keyswvdecrypt
return KEYS
return KEYS

View File

@ -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",
@ -334,7 +332,7 @@ class get_manifest:
else f"{size_in_bytes/1073741824:0.2f} GiB"
)
vid_url = downloadable["urls"][0]["url"]
L3 = 'L3' if 'SEGMENT_MAP_2KEY' in str(downloadable['tags']) else '' #
L3 = 'L3' if 'SEGMENT_MAP_2KEY' in str(downloadable['tags']) else ''
VideoList.append(
{
@ -348,7 +346,7 @@ class get_manifest:
"Url": vid_url,
"Bitrate": str(downloadable["bitrate"]),
"Profile": downloadable["content_profile"],
"L3": L3 #
"L3": L3
}
)
@ -366,6 +364,7 @@ class get_manifest:
return VideoList
def ParseVideo(self, resp, getHigh):
manifest = resp["result"]
VideoList = []
checkerinfo = ""
@ -409,24 +408,46 @@ class get_manifest:
if getHigh:
HighVideoList = self.HighVideoMSL()
# 变量赋值
if not HighVideoList == []:
checkerinfo = "\nNetflix Profile Checker v1.0\nMAIN: {}kbps | {}\nHIGH: {}kbps | {}\n\n{}\n"
checkerinfo = checkerinfo.format(
str(dict(VideoList[-1])["Bitrate"]),
str(dict(VideoList[-1])["Profile"]),
str(dict(HighVideoList[-1])["Bitrate"]),
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",
main_max = dict(VideoList[-1])
high_max = dict(HighVideoList[-1])
else:
self.logger.info("Error: Getting Manifest")
exit(-1)
# 判断 main 或 high要求
# main 和 high 的 vmaf 不同时选择 vmaf 更高者
# main 和 high 的 vmaf 相同时选择 bitrate 更高者
if main_max["vmaf"]:
if int(main_max["vmaf"]) >= int(high_max["vmaf"]) and int(main_max["Bitrate"]) >= int(high_max["Bitrate"]):
check_high_or_main = "MAIN"
else:
check_high_or_main = "HIGH"
# vmaf = None 时,通过码率判断
elif main_max["Bitrate"]:
if int(main_max["Bitrate"]) >= int(high_max["Bitrate"]):
check_high_or_main = "MAIN"
else:
check_high_or_main = "HIGH"
else:
self.logger.info("Error: Getting Manifest")
exit(-1)
checkerinfo = "\nNetflix Profile Checker v1.1\n2021-11-07 Jared_mod\n\nMain Profile Rate: {}kbps | VMAF: {} | {}\nHigh Profile Rate: {}kbps | VMAF: {} | {}\nResult: {} is Better!\n".format(
str(main_max["Bitrate"]),
str(main_max["vmaf"]),
str(main_max["Profile"]),
str(high_max["Bitrate"]),
str(high_max["vmaf"]),
str(high_max["Profile"]),
check_high_or_main,
)
self.logger.debug("HighVideoList: {}".format(HighVideoList))
VideoList += HighVideoList
self.logger.debug("HighVideoList: {}".format(HighVideoList))
if check_high_or_main == "HIGH":
VideoList = HighVideoList
VideoList = sorted(VideoList, key=lambda k: int(k["Bitrate"]))
return VideoList, checkerinfo
def ParseAudioSubs(self, resp):

View File

@ -163,67 +163,120 @@ 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",
user_agent="",
uri_selector="inorder",
console_log_level="skip",
download_result="hide",
quiet="false",
extra_commands=[],
# Jared_mod settings
connection=64,
split=64,
http_proxy_aria2c="",
https_proxy_aria2c="",
save_session_interval=1,
auto_save_interval=30,
force_save="false",
min_split_size="4M",
max_tries="0",
piece_length="1M",
summary_interval=0,
continue_aria2c="true",
file_allocation="none",
disk_cache="64M",
):
if self.config["enable_pass_config_to_aria2c"]:
file_allocation = self.config["file_allocation"]
http_proxy_aria2c = self.config["http_proxy_aria2c"]
https_proxy_aria2c = self.config["https_proxy_aria2c"]
user_agent = self.config["user_agent"]
connection = self.config["connection"]
split = self.config["split"]
summary_interval = self.config["summary_interval"]
continue_aria2c = self.config["continue_aria2c"]
max_tries = self.config["max_tries"]
piece_length = self.config["piece_length"]
min_split_size = self.config["min_split_size"]
disk_cache = self.config["disk_cache"]
else: pass
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):

View File

@ -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

View File

@ -0,0 +1,20 @@
{
"token": "token.bin",
"client_info":
{
"company_name": "Google",
"model_name": "Spacecastgfsc100",
"architecture_name": "armeabi-v7a",
"device_name": "Spacecastgfsc100",
"product_name": "Spacecastgfsc100",
"build_info": "boundary/nitrogen6x/nitrogen6x:6.0.1/1.0.0-ga/20160530:eng/release-keys",
"device_id": "R29vZ2xlU3BhY2VjYXN0Z2ZzYzEwMDAwMDAwMDAxAAA=",
"os_version": "8.0.12"
},
"capabilities":
{
"session_token": 1,
"max_hdcp_version": "HDCP_V1",
"oem_crypto_api_version": 9
}
}

25
requirements.txt 100644
View File

@ -0,0 +1,25 @@
bs4
colorama
wcwidth
requests
ffmpy
inquirer
pycountry
tqdm
future
cssutils
pycaption
pymediainfo
isodate
untangle
tldextract
unidecode
yarl
natsort
titlecase
prettytable
termcolor
pproxy
pysrt
protobuf
pycryptodomex

View File

@ -299,8 +299,11 @@ class netflix:
def downloadFile2(self, url, file_name):
with open(file_name, "wb") as f:
response = requests.get(url, stream=True)
#response.encoding = 'UTF-8'
# 避免ssl错误卡死关闭requests模块ssl证书验证verify=False
# 关闭后,控制台持续输出警告,建议开启证书验证,取消注释下行代码可以屏蔽
# requests.packages.urllib3.disable_warnings()
response = requests.get(url, stream=True, verify=False)
# response.encoding = 'UTF-8'
f.write(response.content)
return
@ -319,11 +322,6 @@ class netflix:
auto_file_renaming=False,
async_dns="skip",
retry_wait=5,
summary_interval=0,
enable_color=True,
connection=16,
concurrent_downloads=16,
split=16,
uri_selector="inorder",
console_log_level="warn",
download_result="hide",
@ -389,17 +387,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 +461,7 @@ class netflix:
if not only1key == []:
KEYS = only1key
# 未解密视频传递ripprocess模块解密
self.ripprocess.mp4_decrypt(
encrypted=inputVideo,
decrypted=outputVideoTemp,
@ -470,18 +471,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):