projects
/
youtube-dl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
git pushMerge branch 'master' of github.com:rg3/youtube-dl
[youtube-dl]
/
youtube_dl
/
extractor
/
iqiyi.py
diff --git
a/youtube_dl/extractor/iqiyi.py
b/youtube_dl/extractor/iqiyi.py
index e7c0cb3f66ab542e79f86238d2db991047d6d453..ddcb3c916e6a0610484dc5ceddbd84b507e761fd 100644
(file)
--- a/
youtube_dl/extractor/iqiyi.py
+++ b/
youtube_dl/extractor/iqiyi.py
@@
-14,7
+14,7
@@
from .common import InfoExtractor
from ..compat import (
compat_parse_qs,
compat_str,
from ..compat import (
compat_parse_qs,
compat_str,
- compat_urllib_parse,
+ compat_urllib_parse
_urlencode
,
compat_urllib_parse_urlparse,
)
from ..utils import (
compat_urllib_parse_urlparse,
)
from ..utils import (
@@
-165,7
+165,7
@@
class IqiyiIE(InfoExtractor):
IE_NAME = 'iqiyi'
IE_DESC = '爱奇艺'
IE_NAME = 'iqiyi'
IE_DESC = '爱奇艺'
- _VALID_URL = r'http
://(?:[^.]+\.)?iqiyi\.com
/.+\.html'
+ _VALID_URL = r'http
s?://(?:(?:[^.]+\.)?iqiyi\.com|www\.pps\.tv)
/.+\.html'
_NETRC_MACHINE = 'iqiyi'
_NETRC_MACHINE = 'iqiyi'
@@
-273,6
+273,9
@@
class IqiyiIE(InfoExtractor):
'title': '灌篮高手 国语版',
},
'playlist_count': 101,
'title': '灌篮高手 国语版',
},
'playlist_count': 101,
+ }, {
+ 'url': 'http://www.pps.tv/w_19rrbav0ph.html',
+ 'only_matching': True,
}]
_FORMATS_MAP = [
}]
_FORMATS_MAP = [
@@
-284,6
+287,13
@@
class IqiyiIE(InfoExtractor):
('10', 'h1'),
]
('10', 'h1'),
]
+ AUTH_API_ERRORS = {
+ # No preview available (不允许试看鉴权失败)
+ 'Q00505': 'This video requires a VIP account',
+ # End of preview time (试看结束鉴权失败)
+ 'Q00506': 'Needs a VIP account for full video',
+ }
+
def _real_initialize(self):
self._login()
def _real_initialize(self):
self._login()
@@
-322,7
+332,7
@@
class IqiyiIE(InfoExtractor):
'bird_t': timestamp,
}
validation_result = self._download_json(
'bird_t': timestamp,
}
validation_result = self._download_json(
- 'http://kylin.iqiyi.com/validate?' + compat_urllib_parse
.
urlencode(validation_params), None,
+ 'http://kylin.iqiyi.com/validate?' + compat_urllib_parse
_
urlencode(validation_params), None,
note='Validate credentials', errnote='Unable to validate credentials')
MSG_MAP = {
note='Validate credentials', errnote='Unable to validate credentials')
MSG_MAP = {
@@
-368,12
+378,19
@@
class IqiyiIE(InfoExtractor):
auth_req, video_id,
note='Downloading video authentication JSON',
errnote='Unable to download video authentication JSON')
auth_req, video_id,
note='Downloading video authentication JSON',
errnote='Unable to download video authentication JSON')
- if auth_result['code'] == 'Q00506': # requires a VIP account
+
+ code = auth_result.get('code')
+ msg = self.AUTH_API_ERRORS.get(code) or auth_result.get('msg') or code
+ if code == 'Q00506':
if do_report_warning:
if do_report_warning:
- self.report_warning(
'Needs a VIP account for full video'
)
+ self.report_warning(
msg
)
return False
return False
+ if 'data' not in auth_result:
+ if msg is not None:
+ raise ExtractorError('%s said: %s' % (self.IE_NAME, msg), expected=True)
+ raise ExtractorError('Unexpected error from Iqiyi auth API')
- return auth_result
+ return auth_result
['data']
def construct_video_urls(self, data, video_id, _uuid, tvid):
def do_xor(x, y):
def construct_video_urls(self, data, video_id, _uuid, tvid):
def do_xor(x, y):
@@
-449,14
+466,14
@@
class IqiyiIE(InfoExtractor):
need_vip_warning_report = False
break
param.update({
need_vip_warning_report = False
break
param.update({
- 't': auth_result['
data']['
t'],
+ 't': auth_result['t'],
# cid is hard-coded in com/qiyi/player/core/player/RuntimeData.as
'cid': 'afbe8fd3d73448c9',
'vid': video_id,
# cid is hard-coded in com/qiyi/player/core/player/RuntimeData.as
'cid': 'afbe8fd3d73448c9',
'vid': video_id,
- 'QY00001': auth_result['
data']['
u'],
+ 'QY00001': auth_result['u'],
})
api_video_url += '?' if '?' not in api_video_url else '&'
})
api_video_url += '?' if '?' not in api_video_url else '&'
- api_video_url += compat_urllib_parse
.
urlencode(param)
+ api_video_url += compat_urllib_parse
_
urlencode(param)
js = self._download_json(
api_video_url, video_id,
note='Download video info of segment %d for format %s' % (segment_index + 1, format_id))
js = self._download_json(
api_video_url, video_id,
note='Download video info of segment %d for format %s' % (segment_index + 1, format_id))
@@
-488,20
+505,23
@@
class IqiyiIE(InfoExtractor):
'enc': md5_text(enc_key + tail),
'qyid': _uuid,
'tn': random.random(),
'enc': md5_text(enc_key + tail),
'qyid': _uuid,
'tn': random.random(),
- 'um': 0,
+ # In iQiyi's flash player, um is set to 1 if there's a logged user
+ # Some 1080P formats are only available with a logged user.
+ # Here force um=1 to trick the iQiyi server
+ 'um': 1,
'authkey': md5_text(md5_text('') + tail),
'k_tag': 1,
}
api_url = 'http://cache.video.qiyi.com/vms' + '?' + \
'authkey': md5_text(md5_text('') + tail),
'k_tag': 1,
}
api_url = 'http://cache.video.qiyi.com/vms' + '?' + \
- compat_urllib_parse
.
urlencode(param)
+ compat_urllib_parse
_
urlencode(param)
raw_data = self._download_json(api_url, video_id)
return raw_data
def get_enc_key(self, video_id):
# TODO: automatic key extraction
# last update at 2016-01-22 for Zombie::bite
raw_data = self._download_json(api_url, video_id)
return raw_data
def get_enc_key(self, video_id):
# TODO: automatic key extraction
# last update at 2016-01-22 for Zombie::bite
- enc_key = '
8ed797d224d043e7ac23d95b70227d32
'
+ enc_key = '
4a1caba4b4465345366f28da7c117d20
'
return enc_key
def _extract_playlist(self, webpage):
return enc_key
def _extract_playlist(self, webpage):