Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
XianxinMao
Yt Dlp
提交
d534c452
Y
Yt Dlp
项目概览
XianxinMao
/
Yt Dlp
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
未验证
提交
d534c452
编写于
6月 24, 2021
作者:
S
siikamiika
提交者:
GitHub
6月 24, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[youtube_live_chat] Fix download with cookies (#437)
Closes #417 Authored by: siikamiika
上级
2b18a8c5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
34 addition
and
13 deletion
+34
-13
yt_dlp/downloader/youtube_live_chat.py
yt_dlp/downloader/youtube_live_chat.py
+34
-13
未找到文件。
yt_dlp/downloader/youtube_live_chat.py
浏览文件 @
d534c452
...
...
@@ -59,6 +59,17 @@ def parse_actions_replay(live_chat_continuation):
self
.
_append_fragment
(
ctx
,
processed_fragment
)
return
continuation_id
,
offset
def
try_refresh_replay_beginning
(
live_chat_continuation
):
# choose the second option that contains the unfiltered live chat replay
refresh_continuation_id
=
try_get
(
live_chat_continuation
,
lambda
x
:
x
[
'header'
][
'liveChatHeaderRenderer'
][
'viewSelector'
][
'sortFilterSubMenuRenderer'
][
'subMenuItems'
][
1
][
'continuation'
][
'reloadContinuationData'
][
'continuation'
],
str
)
if
refresh_continuation_id
:
# no data yet but required to call _append_fragment
self
.
_append_fragment
(
ctx
,
b
''
)
return
refresh_continuation_id
,
0
return
parse_actions_replay
(
live_chat_continuation
)
live_offset
=
0
def
parse_actions_live
(
live_chat_continuation
):
...
...
@@ -90,23 +101,29 @@ def parse_actions_live(live_chat_continuation):
self
.
_append_fragment
(
ctx
,
processed_fragment
)
return
continuation_id
,
live_offset
if
info_dict
[
'protocol'
]
==
'youtube_live_chat_replay'
:
parse_actions
=
parse_actions_replay
elif
info_dict
[
'protocol'
]
==
'youtube_live_chat'
:
parse_actions
=
parse_actions_live
def
download_and_parse_fragment
(
url
,
frag_index
,
request_data
,
headers
):
def
download_and_parse_fragment
(
url
,
frag_index
,
request_data
=
None
,
headers
=
None
):
count
=
0
while
count
<=
fragment_retries
:
try
:
success
,
raw_fragment
=
dl_fragment
(
url
,
request_data
,
headers
)
if
not
success
:
return
False
,
None
,
None
data
=
json
.
loads
(
raw_fragment
)
try
:
data
=
ie
.
_extract_yt_initial_data
(
video_id
,
raw_fragment
.
decode
(
'utf-8'
,
'replace'
))
except
RegexNotFoundError
:
data
=
None
if
not
data
:
data
=
json
.
loads
(
raw_fragment
)
live_chat_continuation
=
try_get
(
data
,
lambda
x
:
x
[
'continuationContents'
][
'liveChatContinuation'
],
dict
)
or
{}
continuation_id
,
offset
=
parse_actions
(
live_chat_continuation
)
if
info_dict
[
'protocol'
]
==
'youtube_live_chat_replay'
:
if
frag_index
==
1
:
continuation_id
,
offset
=
try_refresh_replay_beginning
(
live_chat_continuation
)
else
:
continuation_id
,
offset
=
parse_actions_replay
(
live_chat_continuation
)
elif
info_dict
[
'protocol'
]
==
'youtube_live_chat'
:
continuation_id
,
offset
=
parse_actions_live
(
live_chat_continuation
)
return
True
,
continuation_id
,
offset
except
compat_urllib_error
.
HTTPError
as
err
:
count
+=
1
...
...
@@ -142,8 +159,10 @@ def download_and_parse_fragment(url, frag_index, request_data, headers):
visitor_data
=
try_get
(
innertube_context
,
lambda
x
:
x
[
'client'
][
'visitorData'
],
str
)
if
info_dict
[
'protocol'
]
==
'youtube_live_chat_replay'
:
url
=
'https://www.youtube.com/youtubei/v1/live_chat/get_live_chat_replay?key='
+
api_key
chat_page_url
=
'https://www.youtube.com/live_chat_replay?continuation='
+
continuation_id
elif
info_dict
[
'protocol'
]
==
'youtube_live_chat'
:
url
=
'https://www.youtube.com/youtubei/v1/live_chat/get_live_chat?key='
+
api_key
chat_page_url
=
'https://www.youtube.com/live_chat?continuation='
+
continuation_id
frag_index
=
offset
=
0
while
continuation_id
is
not
None
:
...
...
@@ -154,11 +173,13 @@ def download_and_parse_fragment(url, frag_index, request_data, headers):
}
if
frag_index
>
1
:
request_data
[
'currentPlayerState'
]
=
{
'playerOffsetMs'
:
str
(
max
(
offset
-
5000
,
0
))}
headers
=
ie
.
_generate_api_headers
(
ytcfg
,
visitor_data
=
visitor_data
)
headers
.
update
({
'content-type'
:
'application/json'
})
fragment_request_data
=
json
.
dumps
(
request_data
,
ensure_ascii
=
False
).
encode
(
'utf-8'
)
+
b
'
\n
'
success
,
continuation_id
,
offset
=
download_and_parse_fragment
(
url
,
frag_index
,
fragment_request_data
,
headers
)
headers
=
ie
.
_generate_api_headers
(
ytcfg
,
visitor_data
=
visitor_data
)
headers
.
update
({
'content-type'
:
'application/json'
})
fragment_request_data
=
json
.
dumps
(
request_data
,
ensure_ascii
=
False
).
encode
(
'utf-8'
)
+
b
'
\n
'
success
,
continuation_id
,
offset
=
download_and_parse_fragment
(
url
,
frag_index
,
fragment_request_data
,
headers
)
else
:
success
,
continuation_id
,
offset
=
download_and_parse_fragment
(
chat_page_url
,
frag_index
)
if
not
success
:
return
False
if
test
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录