diff options
Diffstat (limited to 'youtube_dl/extractor/arte.py')
| -rw-r--r-- | youtube_dl/extractor/arte.py | 145 | 
1 files changed, 45 insertions, 100 deletions
| diff --git a/youtube_dl/extractor/arte.py b/youtube_dl/extractor/arte.py index 979481b21..646377e4b 100644 --- a/youtube_dl/extractor/arte.py +++ b/youtube_dl/extractor/arte.py @@ -2,7 +2,6 @@  from __future__ import unicode_literals  import re -import json  from .common import InfoExtractor  from ..utils import ( @@ -19,114 +18,41 @@ from ..utils import (  # is different for each one. The videos usually expire in 7 days, so we can't  # add tests. -class ArteTvIE(InfoExtractor): -    _VIDEOS_URL = r'(?:http://)?videos\.arte\.tv/(?P<lang>fr|de)/.*-(?P<id>.*?)\.html' -    _LIVEWEB_URL = r'(?:http://)?liveweb\.arte\.tv/(?P<lang>fr|de)/(?P<subpage>.+?)/(?P<name>.+)' -    _LIVE_URL = r'index-[0-9]+\.html$' +class ArteTvIE(InfoExtractor): +    _VALID_URL = r'http://videos\.arte\.tv/(?P<lang>fr|de)/.*-(?P<id>.*?)\.html'      IE_NAME = 'arte.tv' -    @classmethod -    def suitable(cls, url): -        return any(re.match(regex, url) for regex in (cls._VIDEOS_URL, cls._LIVEWEB_URL)) - -    # TODO implement Live Stream -    # from ..utils import compat_urllib_parse -    # def extractLiveStream(self, url): -    #     video_lang = url.split('/')[-4] -    #     info = self.grep_webpage( -    #         url, -    #         r'src="(.*?/videothek_js.*?\.js)', -    #         0, -    #         [ -    #             (1, 'url', 'Invalid URL: %s' % url) -    #         ] -    #     ) -    #     http_host = url.split('/')[2] -    #     next_url = 'http://%s%s' % (http_host, compat_urllib_parse.unquote(info.get('url'))) -    #     info = self.grep_webpage( -    #         next_url, -    #         r'(s_artestras_scst_geoFRDE_' + video_lang + '.*?)\'.*?' + -    #             '(http://.*?\.swf).*?' + -    #             '(rtmp://.*?)\'', -    #         re.DOTALL, -    #         [ -    #             (1, 'path',   'could not extract video path: %s' % url), -    #             (2, 'player', 'could not extract video player: %s' % url), -    #             (3, 'url',    'could not extract video url: %s' % url) -    #         ] -    #     ) -    #     video_url = '%s/%s' % (info.get('url'), info.get('path')) -      def _real_extract(self, url): -        mobj = re.match(self._VIDEOS_URL, url) -        if mobj is not None: -            id = mobj.group('id') -            lang = mobj.group('lang') -            return self._extract_video(url, id, lang) - -        mobj = re.match(self._LIVEWEB_URL, url) -        if mobj is not None: -            name = mobj.group('name') -            lang = mobj.group('lang') -            return self._extract_liveweb(url, name, lang) - -        if re.search(self._LIVE_URL, url) is not None: -            raise ExtractorError('Arte live streams are not yet supported, sorry') -            # self.extractLiveStream(url) -            # return - -        raise ExtractorError('No video found') - -    def _extract_video(self, url, video_id, lang): -        """Extract from videos.arte.tv""" +        mobj = re.match(self._VALID_URL, url) +        lang = mobj.group('lang') +        video_id = mobj.group('id') +          ref_xml_url = url.replace('/videos/', '/do_delegate/videos/')          ref_xml_url = ref_xml_url.replace('.html', ',view,asPlayerXml.xml')          ref_xml_doc = self._download_xml(              ref_xml_url, video_id, note='Downloading metadata')          config_node = find_xpath_attr(ref_xml_doc, './/video', 'lang', lang)          config_xml_url = config_node.attrib['ref'] -        config_xml = self._download_webpage( +        config = self._download_xml(              config_xml_url, video_id, note='Downloading configuration') -        video_urls = list(re.finditer(r'<url quality="(?P<quality>.*?)">(?P<url>.*?)</url>', config_xml)) -        def _key(m): -            quality = m.group('quality') -            if quality == 'hd': -                return 2 -            else: -                return 1 -        # We pick the best quality -        video_urls = sorted(video_urls, key=_key) -        video_url = list(video_urls)[-1].group('url') -         -        title = self._html_search_regex(r'<name>(.*?)</name>', config_xml, 'title') -        thumbnail = self._html_search_regex(r'<firstThumbnailUrl>(.*?)</firstThumbnailUrl>', -                                            config_xml, 'thumbnail') -        return {'id': video_id, -                'title': title, -                'thumbnail': thumbnail, -                'url': video_url, -                'ext': 'flv', -                } - -    def _extract_liveweb(self, url, name, lang): -        """Extract form http://liveweb.arte.tv/""" -        webpage = self._download_webpage(url, name) -        video_id = self._search_regex(r'eventId=(\d+?)("|&)', webpage, 'event id') -        config_doc = self._download_xml('http://download.liveweb.arte.tv/o21/liveweb/events/event-%s.xml' % video_id, -                                            video_id, 'Downloading information') -        event_doc = config_doc.find('event') -        url_node = event_doc.find('video').find('urlHd') -        if url_node is None: -            url_node = event_doc.find('urlSd') - -        return {'id': video_id, -                'title': event_doc.find('name%s' % lang.capitalize()).text, -                'url': url_node.text.replace('MP4', 'mp4'), -                'ext': 'flv', -                'thumbnail': self._og_search_thumbnail(webpage), -                } +        formats = [{ +            'forma_id': q.attrib['quality'], +            'url': q.text, +            'ext': 'flv', +            'quality': 2 if q.attrib['quality'] == 'hd' else 1, +        } for q in config.findall('./urls/url')] +        self._sort_formats(formats) + +        title = config.find('.//name').text +        thumbnail = config.find('.//firstThumbnailUrl').text +        return { +            'id': video_id, +            'title': title, +            'thumbnail': thumbnail, +            'formats': formats, +        }  class ArteTVPlus7IE(InfoExtractor): @@ -152,9 +78,7 @@ class ArteTVPlus7IE(InfoExtractor):          return self._extract_from_json_url(json_url, video_id, lang)      def _extract_from_json_url(self, json_url, video_id, lang): -        json_info = self._download_webpage(json_url, video_id, 'Downloading info json') -        self.report_extraction(video_id) -        info = json.loads(json_info) +        info = self._download_json(json_url, video_id)          player_info = info['videoJsonPlayer']          info_dict = { @@ -176,6 +100,8 @@ class ArteTVPlus7IE(InfoExtractor):                  l = 'F'              elif lang == 'de':                  l = 'A' +            else: +                l = lang              regexes = [r'VO?%s' % l, r'VO?.-ST%s' % l]              return any(re.match(r, f['versionCode']) for r in regexes)          # Some formats may not be in the same language as the url @@ -305,3 +231,22 @@ class ArteTVConcertIE(ArteTVPlus7IE):              'description': 'md5:486eb08f991552ade77439fe6d82c305',          },      } + + +class ArteTVEmbedIE(ArteTVPlus7IE): +    IE_NAME = 'arte.tv:embed' +    _VALID_URL = r'''(?x) +        http://www\.arte\.tv +        /playerv2/embed\.php\?json_url= +        (?P<json_url> +            http://arte\.tv/papi/tvguide/videos/stream/player/ +            (?P<lang>[^/]+)/(?P<id>[^/]+)[^&]* +        ) +    ''' + +    def _real_extract(self, url): +        mobj = re.match(self._VALID_URL, url) +        video_id = mobj.group('id') +        lang = mobj.group('lang') +        json_url = mobj.group('json_url') +        return self._extract_from_json_url(json_url, video_id, lang) | 
