Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
XianxinMao
Yt Dlp
提交
9fea350f
Y
Yt Dlp
项目概览
XianxinMao
/
Yt Dlp
12 个月 前同步成功
通知
27
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
Yt Dlp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
9fea350f
编写于
6月 17, 2021
作者:
P
pukkandan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix id sanitization in filenames
Closes #415
上级
e858a9d6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
17 addition
and
6 deletion
+17
-6
test/test_YoutubeDL.py
test/test_YoutubeDL.py
+12
-3
yt_dlp/YoutubeDL.py
yt_dlp/YoutubeDL.py
+3
-3
yt_dlp/utils.py
yt_dlp/utils.py
+2
-0
未找到文件。
test/test_YoutubeDL.py
浏览文件 @
9fea350f
...
...
@@ -664,15 +664,15 @@ def test_add_extra_info(self):
}
def
test_prepare_outtmpl_and_filename
(
self
):
def
test
(
tmpl
,
expected
,
**
params
):
def
test
(
tmpl
,
expected
,
*
,
info
=
None
,
*
*
params
):
params
[
'outtmpl'
]
=
tmpl
ydl
=
YoutubeDL
(
params
)
ydl
.
_num_downloads
=
1
self
.
assertEqual
(
ydl
.
validate_outtmpl
(
tmpl
),
None
)
outtmpl
,
tmpl_dict
=
ydl
.
prepare_outtmpl
(
tmpl
,
self
.
outtmpl_info
)
outtmpl
,
tmpl_dict
=
ydl
.
prepare_outtmpl
(
tmpl
,
info
or
self
.
outtmpl_info
)
out
=
outtmpl
%
tmpl_dict
fname
=
ydl
.
prepare_filename
(
self
.
outtmpl_info
)
fname
=
ydl
.
prepare_filename
(
info
or
self
.
outtmpl_info
)
if
callable
(
expected
):
self
.
assertTrue
(
expected
(
out
))
...
...
@@ -700,6 +700,15 @@ def test(tmpl, expected, **params):
test
(
'%(width)06d.%%(ext)s'
,
'NA.%(ext)s'
)
test
(
'%%(width)06d.%(ext)s'
,
'%(width)06d.mp4'
)
# ID sanitization
test
(
'%(id)s'
,
'_abcd'
,
info
=
{
'id'
:
'_abcd'
})
test
(
'%(some_id)s'
,
'_abcd'
,
info
=
{
'some_id'
:
'_abcd'
})
test
(
'%(formats.0.id)s'
,
'_abcd'
,
info
=
{
'formats'
:
[{
'id'
:
'_abcd'
}]})
test
(
'%(id)s'
,
'-abcd'
,
info
=
{
'id'
:
'-abcd'
})
test
(
'%(id)s'
,
'.abcd'
,
info
=
{
'id'
:
'.abcd'
})
test
(
'%(id)s'
,
'ab__cd'
,
info
=
{
'id'
:
'ab__cd'
})
test
(
'%(id)s'
,
(
'ab:cd'
,
'ab -cd'
),
info
=
{
'id'
:
'ab:cd'
})
# Invalid templates
self
.
assertTrue
(
isinstance
(
YoutubeDL
.
validate_outtmpl
(
'%'
),
ValueError
))
self
.
assertTrue
(
isinstance
(
YoutubeDL
.
validate_outtmpl
(
'%(title)'
),
ValueError
))
...
...
yt_dlp/YoutubeDL.py
浏览文件 @
9fea350f
...
...
@@ -934,7 +934,7 @@ def create_key(outer_mobj):
fmt
=
outer_mobj
.
group
(
'format'
)
mobj
=
re
.
match
(
INTERNAL_FORMAT_RE
,
key
)
if
mobj
is
None
:
value
,
default
=
None
,
na
value
,
default
,
mobj
=
None
,
na
,
{
'fields'
:
''
}
else
:
mobj
=
mobj
.
groupdict
()
default
=
mobj
[
'default'
]
if
mobj
[
'default'
]
is
not
None
else
na
...
...
@@ -944,7 +944,6 @@ def create_key(outer_mobj):
fmt
=
'0{:d}d'
.
format
(
field_size_compat_map
[
key
])
value
=
default
if
value
is
None
else
value
key
+=
'
\0
%s'
%
fmt
if
fmt
==
'c'
:
value
=
compat_str
(
value
)
...
...
@@ -962,7 +961,8 @@ def create_key(outer_mobj):
# So we convert it to repr first
value
,
fmt
=
repr
(
value
),
'%ss'
%
fmt
[:
-
1
]
if
fmt
[
-
1
]
in
'csr'
:
value
=
sanitize
(
key
,
value
)
value
=
sanitize
(
mobj
[
'fields'
].
split
(
'.'
)[
-
1
],
value
)
key
+=
'
\0
%s'
%
fmt
TMPL_DICT
[
key
]
=
value
return
'%({key}){fmt}'
.
format
(
key
=
key
,
fmt
=
fmt
)
...
...
yt_dlp/utils.py
浏览文件 @
9fea350f
...
...
@@ -6241,6 +6241,8 @@ def traverse_obj(obj, keys, *, casesense=True, is_user_input=False, traverse_str
if
is_user_input
:
key
=
(
int_or_none
(
key
)
if
':'
not
in
key
else
slice
(
*
map
(
int_or_none
,
key
.
split
(
':'
))))
if
key
is
None
:
return
None
if
not
isinstance
(
obj
,
(
list
,
tuple
)):
if
traverse_string
:
obj
=
compat_str
(
obj
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录