diff options
Diffstat (limited to 'youtube_dl/extractor/screenwavemedia.py')
| -rw-r--r-- | youtube_dl/extractor/screenwavemedia.py | 113 | 
1 files changed, 63 insertions, 50 deletions
diff --git a/youtube_dl/extractor/screenwavemedia.py b/youtube_dl/extractor/screenwavemedia.py index d1ab66b32..05f93904c 100644 --- a/youtube_dl/extractor/screenwavemedia.py +++ b/youtube_dl/extractor/screenwavemedia.py @@ -7,12 +7,13 @@ from .common import InfoExtractor  from ..utils import (      int_or_none,      unified_strdate, +    js_to_json,  )  class ScreenwaveMediaIE(InfoExtractor): -    _VALID_URL = r'http://player\d?\.screenwavemedia\.com/(?:play/)?[a-zA-Z]+\.php\?[^"]*\bid=(?P<id>.+)' - +    _VALID_URL = r'https?://player\d?\.screenwavemedia\.com/(?:play/)?[a-zA-Z]+\.php\?.*\bid=(?P<id>[A-Za-z0-9-]+)' +    EMBED_PATTERN = r'src=(["\'])(?P<url>(?:https?:)?//player\d?\.screenwavemedia\.com/(?:play/)?[a-zA-Z]+\.php\?.*\bid=.+?)\1'      _TESTS = [{          'url': 'http://player.screenwavemedia.com/play/play.php?playerdiv=videoarea&companiondiv=squareAd&id=Cinemassacre-19911',          'only_matching': True, @@ -22,59 +23,71 @@ class ScreenwaveMediaIE(InfoExtractor):          video_id = self._match_id(url)          playerdata = self._download_webpage( -            'http://player.screenwavemedia.com/play/player.php?id=%s' % video_id, +            'http://player.screenwavemedia.com/player.php?id=%s' % video_id,              video_id, 'Downloading player webpage')          vidtitle = self._search_regex(              r'\'vidtitle\'\s*:\s*"([^"]+)"', playerdata, 'vidtitle').replace('\\/', '/') -        vidurl = self._search_regex( -            r'\'vidurl\'\s*:\s*"([^"]+)"', playerdata, 'vidurl').replace('\\/', '/') - -        videolist_url = None - -        mobj = re.search(r"'videoserver'\s*:\s*'(?P<videoserver>[^']+)'", playerdata) -        if mobj: -            videoserver = mobj.group('videoserver') -            mobj = re.search(r'\'vidid\'\s*:\s*"(?P<vidid>[^\']+)"', playerdata) -            vidid = mobj.group('vidid') if mobj else video_id -            videolist_url = 'http://%s/vod/smil:%s.smil/jwplayer.smil' % (videoserver, vidid) -        else: -            mobj = re.search(r"file\s*:\s*'(?P<smil>http.+?/jwplayer\.smil)'", playerdata) -            if mobj: -                videolist_url = mobj.group('smil') - -        if videolist_url: -            videolist = self._download_xml(videolist_url, video_id, 'Downloading videolist XML') -            formats = [] -            baseurl = vidurl[:vidurl.rfind('/') + 1] -            for video in videolist.findall('.//video'): -                src = video.get('src') -                if not src: + +        playerconfig = self._download_webpage( +            'http://player.screenwavemedia.com/player.js', +            video_id, 'Downloading playerconfig webpage') + +        videoserver = self._search_regex(r'SWMServer\s*=\s*"([\d\.]+)"', playerdata, 'videoserver') + +        sources = self._parse_json( +            js_to_json( +                re.sub( +                    r'(?s)/\*.*?\*/', '', +                    self._search_regex( +                        r"sources\s*:\s*(\[[^\]]+?\])", playerconfig, +                        'sources', +                    ).replace( +                        "' + thisObj.options.videoserver + '", +                        videoserver +                    ).replace( +                        "' + playerVidId + '", +                        video_id +                    ) +                ) +            ), +            video_id, fatal=False +        ) + +        # Fallback to hardcoded sources if JS changes again +        if not sources: +            self.report_warning('Falling back to a hardcoded list of streams') +            sources = [{ +                'file': 'http://%s/vod/%s_%s.mp4' % (videoserver, video_id, format_id), +                'type': 'mp4', +                'label': format_label, +            } for format_id, format_label in ( +                ('low', '144p Low'), ('med', '160p Med'), ('high', '360p High'), ('hd1', '720p HD1'))] +            sources.append({ +                'file': 'http://%s/vod/smil:%s.smil/playlist.m3u8' % (videoserver, video_id), +                'type': 'hls', +            }) + +        formats = [] +        for source in sources: +            if source['type'] == 'hls': +                formats.extend(self._extract_m3u8_formats(source['file'], video_id)) +            else: +                file_ = source.get('file') +                if not file_:                      continue -                file_ = src.partition(':')[-1] -                width = int_or_none(video.get('width')) -                height = int_or_none(video.get('height')) -                bitrate = int_or_none(video.get('system-bitrate'), scale=1000) -                format = { -                    'url': baseurl + file_, -                    'format_id': src.rpartition('.')[0].rpartition('_')[-1], -                } -                if width or height: -                    format.update({ -                        'tbr': bitrate, -                        'width': width, -                        'height': height, -                    }) -                else: -                    format.update({ -                        'abr': bitrate, -                        'vcodec': 'none', -                    }) -                formats.append(format) -        else: -            formats = [{ -                'url': vidurl, -            }] +                format_label = source.get('label') +                format_id = self._search_regex( +                    r'_(.+?)\.[^.]+$', file_, 'format id', default=None) +                height = int_or_none(self._search_regex( +                    r'^(\d+)[pP]', format_label, 'height', default=None)) +                formats.append({ +                    'url': source['file'], +                    'format_id': format_id, +                    'format': format_label, +                    'ext': source.get('type'), +                    'height': height, +                })          self._sort_formats(formats)          return {  | 
