X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=youtube_dl%2Fextractor%2Fteamcoco.py;h=95d58ddd0429e84abeef9f6dc3dea74f011318f9;hb=34e7dc81a94d39d48c5b4aac8cddcca46edba94d;hp=41677503c7a3f5d1530d4a4d8b8e2fc8631e28a2;hpb=5bb6328cb944f67f7981eddc40d92998a153f00d;p=youtube-dl diff --git a/youtube_dl/extractor/teamcoco.py b/youtube_dl/extractor/teamcoco.py index 41677503c..95d58ddd0 100644 --- a/youtube_dl/extractor/teamcoco.py +++ b/youtube_dl/extractor/teamcoco.py @@ -1,6 +1,8 @@ +# -*- coding: utf-8 -*- from __future__ import unicode_literals import base64 +import binascii import re from .common import InfoExtractor @@ -8,6 +10,7 @@ from ..utils import ( ExtractorError, qualities, ) +from ..compat import compat_ord class TeamcocoIE(InfoExtractor): @@ -21,6 +24,7 @@ class TeamcocoIE(InfoExtractor): 'ext': 'mp4', 'title': 'Conan Becomes A Mary Kay Beauty Consultant', 'description': 'Mary Kay is perhaps the most trusted name in female beauty, so of course Conan is a natural choice to sell their products.', + 'duration': 504, 'age_limit': 0, } }, { @@ -31,8 +35,20 @@ class TeamcocoIE(InfoExtractor): 'ext': 'mp4', 'description': 'Louis C.K. got starstruck by George W. Bush, so what? Part one.', 'title': 'Louis C.K. Interview Pt. 1 11/3/11', + 'duration': 288, 'age_limit': 0, } + }, { + 'url': 'http://teamcoco.com/video/timothy-olyphant-drinking-whiskey', + 'info_dict': { + 'id': '88748', + 'ext': 'mp4', + 'title': 'Timothy Olyphant Raises A Toast To “Justified”', + 'description': 'md5:15501f23f020e793aeca761205e42c24', + }, + 'params': { + 'skip_download': True, # m3u8 downloads + } } ] _VIDEO_ID_REGEXES = ( @@ -52,12 +68,41 @@ class TeamcocoIE(InfoExtractor): video_id = self._html_search_regex( self._VIDEO_ID_REGEXES, webpage, 'video id') + data = preload = None preloads = re.findall(r'"preload":\s*"([^"]+)"', webpage) - if not preloads: - raise ExtractorError('Preload information could not be extracted') - preload = max([(len(p), p) for p in preloads])[1] - data = self._parse_json( - base64.b64decode(preload.encode('ascii')).decode('utf-8'), video_id) + if preloads: + preload = max([(len(p), p) for p in preloads])[1] + + if not preload: + preload = ''.join(re.findall(r'this\.push\("([^"]+)"\);', webpage)) + + if not preload: + preload = self._html_search_regex([ + r'player,\[?"([^"]+)"\]?', r'player.init\(\[?"([^"]+)"\]?\)' + ], webpage.replace('","', ''), 'preload data', default=None) + + if not preload: + preload_codes = self._html_search_regex( + r'(function.+)setTimeout\(function\(\)\{playlist', + webpage, 'preload codes') + base64_fragments = re.findall(r'"([a-zA-z0-9+/=]+)"', preload_codes) + base64_fragments.remove('init') + for i in range(len(base64_fragments)): + cur_sequence = (''.join(base64_fragments[i:] + base64_fragments[:i])).encode('ascii') + try: + raw_data = base64.b64decode(cur_sequence) + except (TypeError, binascii.Error): + continue + if compat_ord(raw_data[0]) == compat_ord('{'): + data = self._parse_json(raw_data.decode('utf-8'), video_id, fatal=False) + + if not preload and not data: + raise ExtractorError( + 'Preload information could not be extracted', expected=True) + + if not data: + data = self._parse_json( + base64.b64decode(preload.encode('ascii')).decode('utf-8'), video_id) formats = [] get_quality = qualities(['500k', '480p', '1000k', '720p', '1080p']) @@ -93,5 +138,6 @@ class TeamcocoIE(InfoExtractor): 'title': data['title'], 'thumbnail': data.get('thumb', {}).get('href'), 'description': data.get('teaser'), + 'duration': data.get('duration'), 'age_limit': self._family_friendly_search(webpage), }