aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--youtube_dl/extractor/__init__.py1
-rw-r--r--youtube_dl/extractor/common.py9
-rw-r--r--youtube_dl/extractor/kankan.py6
-rw-r--r--youtube_dl/extractor/sohu.py90
4 files changed, 102 insertions, 4 deletions
diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py
index 21e9e5d37..6b5037c8c 100644
--- a/youtube_dl/extractor/__init__.py
+++ b/youtube_dl/extractor/__init__.py
@@ -70,6 +70,7 @@ from .roxwel import RoxwelIE
from .rtlnow import RTLnowIE
from .sina import SinaIE
from .slashdot import SlashdotIE
+from .sohu import SohuIE
from .soundcloud import SoundcloudIE, SoundcloudSetIE
from .spiegel import SpiegelIE
from .stanfordoc import StanfordOpenClassroomIE
diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py
index 77a13aea5..a2986cebe 100644
--- a/youtube_dl/extractor/common.py
+++ b/youtube_dl/extractor/common.py
@@ -145,12 +145,17 @@ class InfoExtractor(object):
urlh = self._request_webpage(url_or_request, video_id, note, errnote)
content_type = urlh.headers.get('Content-Type', '')
+ webpage_bytes = urlh.read()
m = re.match(r'[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+\s*;\s*charset=(.+)', content_type)
if m:
encoding = m.group(1)
else:
- encoding = 'utf-8'
- webpage_bytes = urlh.read()
+ m = re.search(br'<meta[^>]+charset="?([^"]+)[ /">]',
+ webpage_bytes[:1024])
+ if m:
+ encoding = m.group(1).decode('ascii')
+ else:
+ encoding = 'utf-8'
if self._downloader.params.get('dump_intermediate_pages', False):
try:
url = url_or_request.get_full_url()
diff --git a/youtube_dl/extractor/kankan.py b/youtube_dl/extractor/kankan.py
index 8537ba584..445d46501 100644
--- a/youtube_dl/extractor/kankan.py
+++ b/youtube_dl/extractor/kankan.py
@@ -21,8 +21,10 @@ class KankanIE(InfoExtractor):
video_id = mobj.group('id')
webpage = self._download_webpage(url, video_id)
- title = self._search_regex(r'G_TITLE=[\'"](.+?)[\'"]', webpage, u'video title')
- gcid = self._search_regex(r'lurl:[\'"]http://.+?/.+?/(.+?)/', webpage, u'gcid')
+ title = self._search_regex(r'(?:G_TITLE=|G_MOVIE_TITLE = )[\'"](.+?)[\'"]', webpage, u'video title')
+ surls = re.search(r'surls:\[\'.+?\'\]|lurl:\'.+?\.flv\'', webpage).group(0)
+ gcids = re.findall(r"http://.+?/.+?/(.+?)/", surls)
+ gcid = gcids[-1]
video_info_page = self._download_webpage('http://p2s.cl.kankan.com/getCdnresource_flv?gcid=%s' % gcid,
video_id, u'Downloading video url info')
diff --git a/youtube_dl/extractor/sohu.py b/youtube_dl/extractor/sohu.py
new file mode 100644
index 000000000..77bb0a8dc
--- /dev/null
+++ b/youtube_dl/extractor/sohu.py
@@ -0,0 +1,90 @@
+# encoding: utf-8
+
+import json
+import re
+
+from .common import InfoExtractor
+from ..utils import ExtractorError
+
+
+class SohuIE(InfoExtractor):
+ _VALID_URL = r'https?://tv\.sohu\.com/\d+?/n(?P<id>\d+)\.shtml.*?'
+
+ _TEST = {
+ u'url': u'http://tv.sohu.com/20130724/n382479172.shtml#super',
+ u'file': u'382479172.mp4',
+ u'md5': u'bde8d9a6ffd82c63a1eefaef4eeefec7',
+ u'info_dict': {
+ u'title': u'MV:Far East Movement《The Illest》',
+ },
+ }
+
+ def _real_extract(self, url):
+
+ def _fetch_data(vid_id):
+ base_data_url = u'http://hot.vrs.sohu.com/vrs_flash.action?vid='
+ data_url = base_data_url + str(vid_id)
+ data_json = self._download_webpage(
+ data_url, video_id,
+ note=u'Downloading JSON data for ' + str(vid_id))
+ return json.loads(data_json)
+
+ mobj = re.match(self._VALID_URL, url)
+ video_id = mobj.group('id')
+
+ webpage = self._download_webpage(url, video_id)
+ raw_title = self._html_search_regex(r'(?s)<title>(.+?)</title>',
+ webpage, u'video title')
+ title = raw_title.partition('-')[0].strip()
+
+ vid = self._html_search_regex(r'var vid="(\d+)"', webpage,
+ u'video path')
+ data = _fetch_data(vid)
+
+ QUALITIES = ('ori', 'super', 'high', 'nor')
+ vid_ids = [data['data'][q + 'Vid']
+ for q in QUALITIES
+ if data['data'][q + 'Vid'] != 0]
+ if not vid_ids:
+ raise ExtractorError(u'No formats available for this video')
+
+ # For now, we just pick the highest available quality
+ vid_id = vid_ids[-1]
+
+ format_data = data if vid == vid_id else _fetch_data(vid_id)
+ part_count = format_data['data']['totalBlocks']
+ allot = format_data['allot']
+ prot = format_data['prot']
+ clipsURL = format_data['data']['clipsURL']
+ su = format_data['data']['su']
+
+ playlist = []
+ for i in range(part_count):
+ part_url = ('http://%s/?prot=%s&file=%s&new=%s' %
+ (allot, prot, clipsURL[i], su[i]))
+ part_str = self._download_webpage(
+ part_url, video_id,
+ note=u'Downloading part %d of %d' % (i+1, part_count))
+
+ part_info = part_str.split('|')
+ video_url = '%s%s?key=%s' % (part_info[0], su[i], part_info[3])
+
+ video_info = {
+ 'id': '%s_part%02d' % (video_id, i + 1),
+ 'title': title,
+ 'url': video_url,
+ 'ext': 'mp4',
+ }
+ playlist.append(video_info)
+
+ if len(playlist) == 1:
+ info = playlist[0]
+ info['id'] = video_id
+ else:
+ info = {
+ '_type': 'playlist',
+ 'entries': playlist,
+ 'id': video_id,
+ }
+
+ return info