diff options
| -rw-r--r-- | youtube_dl/extractor/laola1tv.py | 92 | 
1 files changed, 67 insertions, 25 deletions
| diff --git a/youtube_dl/extractor/laola1tv.py b/youtube_dl/extractor/laola1tv.py index 3190b187c..e8853fb77 100644 --- a/youtube_dl/extractor/laola1tv.py +++ b/youtube_dl/extractor/laola1tv.py @@ -1,6 +1,8 @@  # coding: utf-8  from __future__ import unicode_literals +import json +  from .common import InfoExtractor  from ..utils import (      ExtractorError, @@ -10,6 +12,7 @@ from ..utils import (      xpath_text,      urljoin,      update_url_query, +    js_to_json,  ) @@ -28,6 +31,29 @@ class Laola1TvEmbedIE(InfoExtractor):          },      } +    def _extract_token_url(self, stream_access_url, video_id, data): +        return self._download_json( +            stream_access_url, video_id, headers={ +                'Content-Type': 'application/json', +            }, data=json.dumps(data).encode())['data']['stream-access'][0] + +    def _extract_formats(self, token_url, video_id): +        token_doc = self._download_xml( +            token_url, video_id, 'Downloading token', +            headers=self.geo_verification_headers()) + +        token_attrib = xpath_element(token_doc, './/token').attrib + +        if token_attrib['status'] != '0': +            raise ExtractorError( +                'Token error: %s' % token_attrib['comment'], expected=True) + +        formats = self._extract_akamai_formats( +            '%s?hdnea=%s' % (token_attrib['url'], token_attrib['auth']), +            video_id) +        self._sort_formats(formats) +        return formats +      def _real_extract(self, url):          video_id = self._match_id(url)          webpage = self._download_webpage(url, video_id) @@ -68,29 +94,16 @@ class Laola1TvEmbedIE(InfoExtractor):          else:              data_abo = urlencode_postdata(                  dict((i, v) for i, v in enumerate(_v('req_liga_abos').split(',')))) -            token_url = self._download_json( -                'https://club.laola1.tv/sp/laola1/api/v3/user/session/premium/player/stream-access', -                video_id, query={ +            stream_access_url = update_url_query( +                'https://club.laola1.tv/sp/laola1/api/v3/user/session/premium/player/stream-access', {                      'videoId': _v('id'),                      'target': self._search_regex(r'vs_target = (\d+);', webpage, 'vs target'),                      'label': _v('label'),                      'area': _v('area'), -                }, data=data_abo)['data']['stream-access'][0] - -        token_doc = self._download_xml( -            token_url, video_id, 'Downloading token', -            headers=self.geo_verification_headers()) - -        token_attrib = xpath_element(token_doc, './/token').attrib - -        if token_attrib['status'] != '0': -            raise ExtractorError( -                'Token error: %s' % token_attrib['comment'], expected=True) +                }) +            token_url = self._extract_token_url(stream_access_url, video_id, data_abo) -        formats = self._extract_akamai_formats( -            '%s?hdnea=%s' % (token_attrib['url'], token_attrib['auth']), -            video_id) -        self._sort_formats(formats) +        formats = self._extract_formats(token_url, video_id)          categories_str = _v('meta_sports')          categories = categories_str.split(',') if categories_str else [] @@ -107,7 +120,7 @@ class Laola1TvEmbedIE(InfoExtractor):          } -class Laola1TvIE(InfoExtractor): +class Laola1TvIE(Laola1TvEmbedIE):      IE_NAME = 'laola1tv'      _VALID_URL = r'https?://(?:www\.)?laola1\.tv/[a-z]+-[a-z]+/[^/]+/(?P<id>[^/?#&]+)'      _TESTS = [{ @@ -164,13 +177,42 @@ class Laola1TvIE(InfoExtractor):          if 'Dieser Livestream ist bereits beendet.' in webpage:              raise ExtractorError('This live stream has already finished.', expected=True) -        iframe_url = urljoin(url, self._search_regex( -            r'<iframe[^>]*?id="videoplayer"[^>]*?src="([^"]+)"', -            webpage, 'iframe url')) +        conf = self._parse_json(self._search_regex( +            r'(?s)conf\s*=\s*({.+?});', webpage, 'conf'), +            display_id, js_to_json) + +        video_id = conf['videoid'] + +        config = self._download_json(conf['configUrl'], video_id, query={ +            'videoid': video_id, +            'partnerid': conf['partnerid'], +            'language': conf.get('language', ''), +            'portal': conf.get('portalid', ''), +        }) +        error = config.get('error') +        if error: +            raise ExtractorError('%s said: %s' % (self.IE_NAME, error), expected=True) + +        video_data = config['video'] +        title = video_data['title'] +        is_live = video_data.get('isLivestream') and video_data.get('isLive') +        meta = video_data.get('metaInformation') +        sports = meta.get('sports') +        categories = sports.split(',') if sports else [] + +        token_url = self._extract_token_url( +            video_data['streamAccess'], video_id, +            video_data['abo']['required']) + +        formats = self._extract_formats(token_url, video_id)          return { -            '_type': 'url', +            'id': video_id,              'display_id': display_id, -            'url': iframe_url, -            'ie_key': 'Laola1TvEmbed', +            'title': self._live_title(title) if is_live else title, +            'description': video_data.get('description'), +            'thumbnail': video_data.get('image'), +            'categories': categories, +            'formats': formats, +            'is_live': is_live,          } | 
