projects
/
youtube-dl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[discovery] extract subtitle
[youtube-dl]
/
youtube_dl
/
extractor
/
viki.py
diff --git
a/youtube_dl/extractor/viki.py
b/youtube_dl/extractor/viki.py
index ddbd395c89ee183dee719f549cbe534c64835769..e04b814c8cf27755bfe0a86af3d5bf43262bd0da 100644
(file)
--- a/
youtube_dl/extractor/viki.py
+++ b/
youtube_dl/extractor/viki.py
@@
-7,14
+7,14
@@
import hmac
import hashlib
import itertools
import hashlib
import itertools
+from .common import InfoExtractor
from ..utils import (
ExtractorError,
int_or_none,
parse_age_limit,
parse_iso8601,
from ..utils import (
ExtractorError,
int_or_none,
parse_age_limit,
parse_iso8601,
+ sanitized_Request,
)
)
-from ..compat import compat_urllib_request
-from .common import InfoExtractor
class VikiBaseIE(InfoExtractor):
class VikiBaseIE(InfoExtractor):
@@
-30,6
+30,12
@@
class VikiBaseIE(InfoExtractor):
_token = None
_token = None
+ _ERRORS = {
+ 'geo': 'Sorry, this content is not available in your region.',
+ 'upcoming': 'Sorry, this content is not yet available.',
+ # 'paywall': 'paywall',
+ }
+
def _prepare_call(self, path, timestamp=None, post_data=None):
path += '?' if '?' not in path else '&'
if not timestamp:
def _prepare_call(self, path, timestamp=None, post_data=None):
path += '?' if '?' not in path else '&'
if not timestamp:
@@
-43,7
+49,7
@@
class VikiBaseIE(InfoExtractor):
hashlib.sha1
).hexdigest()
url = self._API_URL_TEMPLATE % (query, sig)
hashlib.sha1
).hexdigest()
url = self._API_URL_TEMPLATE % (query, sig)
- return
compat_urllib_request.
Request(
+ return
sanitized_
Request(
url, json.dumps(post_data).encode('utf-8')) if post_data else url
def _call_api(self, path, video_id, note, timestamp=None, post_data=None):
url, json.dumps(post_data).encode('utf-8')) if post_data else url
def _call_api(self, path, video_id, note, timestamp=None, post_data=None):
@@
-67,6
+73,12
@@
class VikiBaseIE(InfoExtractor):
'%s returned error: %s' % (self.IE_NAME, error),
expected=True)
'%s returned error: %s' % (self.IE_NAME, error),
expected=True)
+ def _check_errors(self, data):
+ for reason, status in data.get('blocking', {}).items():
+ if status and reason in self._ERRORS:
+ raise ExtractorError('%s said: %s' % (
+ self.IE_NAME, self._ERRORS[reason]), expected=True)
+
def _real_initialize(self):
self._login()
def _real_initialize(self):
self._login()
@@
-164,13
+176,13
@@
class VikiIE(VikiBaseIE):
}, {
# youtube external
'url': 'http://www.viki.com/videos/50562v-poor-nastya-complete-episode-1',
}, {
# youtube external
'url': 'http://www.viki.com/videos/50562v-poor-nastya-complete-episode-1',
- 'md5': '
216d1afdc0c64d1febc1e9f2bd4b864b
',
+ 'md5': '
63f8600c1da6f01b7640eee7eca4f1da
',
'info_dict': {
'id': '50562v',
'info_dict': {
'id': '50562v',
- 'ext': '
mp4
',
+ 'ext': '
webm
',
'title': 'Poor Nastya [COMPLETE] - Episode 1',
'description': '',
'title': 'Poor Nastya [COMPLETE] - Episode 1',
'description': '',
- 'duration': 60
7
,
+ 'duration': 60
6
,
'timestamp': 1274949505,
'upload_date': '20101213',
'uploader': 'ad14065n',
'timestamp': 1274949505,
'upload_date': '20101213',
'uploader': 'ad14065n',
@@
-193,6
+205,7
@@
class VikiIE(VikiBaseIE):
'timestamp': 1321985454,
'description': 'md5:44b1e46619df3a072294645c770cef36',
'title': 'Love In Magic',
'timestamp': 1321985454,
'description': 'md5:44b1e46619df3a072294645c770cef36',
'title': 'Love In Magic',
+ 'age_limit': 13,
},
}]
},
}]
@@
-202,6
+215,8
@@
class VikiIE(VikiBaseIE):
video = self._call_api(
'videos/%s.json' % video_id, video_id, 'Downloading video JSON')
video = self._call_api(
'videos/%s.json' % video_id, video_id, 'Downloading video JSON')
+ self._check_errors(video)
+
title = self.dict_selection(video.get('titles', {}), 'en')
if not title:
title = 'Episode %d' % video.get('number') if video.get('type') == 'episode' else video.get('id') or video_id
title = self.dict_selection(video.get('titles', {}), 'en')
if not title:
title = 'Episode %d' % video.get('number') if video.get('type') == 'episode' else video.get('id') or video_id
@@
-262,8
+277,9
@@
class VikiIE(VikiBaseIE):
r'^(\d+)[pP]$', format_id, 'height', default=None))
for protocol, format_dict in stream_dict.items():
if format_id == 'm3u8':
r'^(\d+)[pP]$', format_id, 'height', default=None))
for protocol, format_dict in stream_dict.items():
if format_id == 'm3u8':
- formats = self._extract_m3u8_formats(
- format_dict['url'], video_id, 'mp4', m3u8_id='m3u8-%s' % protocol)
+ formats.extend(self._extract_m3u8_formats(
+ format_dict['url'], video_id, 'mp4', 'm3u8_native',
+ m3u8_id='m3u8-%s' % protocol, fatal=False))
else:
formats.append({
'url': format_dict['url'],
else:
formats.append({
'url': format_dict['url'],
@@
-315,6
+331,8
@@
class VikiChannelIE(VikiBaseIE):
'containers/%s.json' % channel_id, channel_id,
'Downloading channel JSON')
'containers/%s.json' % channel_id, channel_id,
'Downloading channel JSON')
+ self._check_errors(channel)
+
title = self.dict_selection(channel['titles'], 'en')
description = self.dict_selection(channel['descriptions'], 'en')
title = self.dict_selection(channel['titles'], 'en')
description = self.dict_selection(channel['descriptions'], 'en')