Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
无聊人士张
you-get
提交
ff7b57a0
Y
you-get
项目概览
无聊人士张
/
you-get
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
you-get
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ff7b57a0
编写于
8月 07, 2014
作者:
M
Mort Yao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Youku: fix #383, using the new ep generation algorithm
上级
e75be00b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
51 addition
and
2 deletion
+51
-2
src/you_get/extractors/youku.py
src/you_get/extractors/youku.py
+51
-2
未找到文件。
src/you_get/extractors/youku.py
浏览文件 @
ff7b57a0
...
...
@@ -4,6 +4,9 @@
from
..common
import
*
from
..extractor
import
VideoExtractor
import
base64
import
time
class
Youku
(
VideoExtractor
):
name
=
"优酷 (Youku)"
...
...
@@ -17,6 +20,36 @@ class Youku(VideoExtractor):
{
'id'
:
'3gphd'
,
'container'
:
'3gp'
,
'video_profile'
:
'高清(3GP)'
},
]
def
generate_ep
(
vid
,
ep
):
f_code_1
=
'becaf9be'
f_code_2
=
'bf7e5f01'
def
trans_e
(
a
,
c
):
f
=
h
=
0
b
=
list
(
range
(
256
))
result
=
''
while
h
<
256
:
f
=
(
f
+
b
[
h
]
+
ord
(
a
[
h
%
len
(
a
)]))
%
256
b
[
h
],
b
[
f
]
=
b
[
f
],
b
[
h
]
h
+=
1
q
=
f
=
h
=
0
while
q
<
len
(
c
):
h
=
(
h
+
1
)
%
256
f
=
(
f
+
b
[
h
])
%
256
b
[
h
],
b
[
f
]
=
b
[
f
],
b
[
h
]
if
isinstance
(
c
[
q
],
int
):
result
+=
chr
(
c
[
q
]
^
b
[(
b
[
h
]
+
b
[
f
])
%
256
])
else
:
result
+=
chr
(
ord
(
c
[
q
])
^
b
[(
b
[
h
]
+
b
[
f
])
%
256
])
q
+=
1
return
result
e_code
=
trans_e
(
f_code_1
,
base64
.
b64decode
(
ep
))
sid
,
token
=
e_code
.
split
(
'_'
)
new_ep
=
trans_e
(
f_code_2
,
'%s_%s_%s'
%
(
sid
,
vid
,
token
))
return
base64
.
b64encode
(
bytes
(
new_ep
,
'latin'
)),
sid
,
token
def
parse_m3u8
(
m3u8
):
return
re
.
findall
(
r
'(http://[^?]+)\?ts_start=0'
,
m3u8
)
...
...
@@ -57,7 +90,7 @@ class Youku(VideoExtractor):
self
.
download_playlist_by_url
(
self
.
url
,
**
kwargs
)
exit
(
0
)
meta
=
json
.
loads
(
get_html
(
'http://v.youku.com/player/getPlayList/VideoIDS/%s'
%
self
.
vid
))
meta
=
json
.
loads
(
get_html
(
'http://v.youku.com/player/getPlayList/VideoIDS/%s
/Pf/4/ctype/12/ev/1
'
%
self
.
vid
))
if
not
meta
[
'data'
]:
log
.
wtf
(
'[Failed] Video not found.'
)
metadata0
=
meta
[
'data'
][
0
]
...
...
@@ -72,6 +105,9 @@ class Youku(VideoExtractor):
self
.
title
=
metadata0
[
'title'
]
self
.
ep
=
metadata0
[
'ep'
]
self
.
ip
=
metadata0
[
'ip'
]
if
'dvd'
in
metadata0
and
'audiolang'
in
metadata0
[
'dvd'
]:
self
.
audiolang
=
metadata0
[
'dvd'
][
'audiolang'
]
for
i
in
self
.
audiolang
:
...
...
@@ -102,7 +138,20 @@ class Youku(VideoExtractor):
# Extract stream with the best quality
stream_id
=
self
.
streams_sorted
[
0
][
'id'
]
m3u8_url
=
"http://v.youku.com/player/getM3U8/vid/{vid}/type/{stream_id}/video.m3u8"
.
format
(
vid
=
self
.
vid
,
stream_id
=
stream_id
)
new_ep
,
sid
,
token
=
__class__
.
generate_ep
(
self
.
vid
,
self
.
ep
)
m3u8_query
=
parse
.
urlencode
(
dict
(
ctype
=
12
,
ep
=
new_ep
,
ev
=
1
,
keyframe
=
1
,
oip
=
self
.
ip
,
sid
=
sid
,
token
=
token
,
ts
=
int
(
time
.
time
()),
type
=
stream_id
,
vid
=
self
.
vid
,
))
m3u8_url
=
'http://pl.youku.com/playlist/m3u8?'
+
m3u8_query
if
not
kwargs
[
'info_only'
]:
if
self
.
password_protected
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录