diff options
Diffstat (limited to 'youtube_dl/extractor/francetv.py')
| -rw-r--r-- | youtube_dl/extractor/francetv.py | 125 | 
1 files changed, 88 insertions, 37 deletions
diff --git a/youtube_dl/extractor/francetv.py b/youtube_dl/extractor/francetv.py index b2c984bf2..8e60cf60f 100644 --- a/youtube_dl/extractor/francetv.py +++ b/youtube_dl/extractor/francetv.py @@ -6,15 +6,11 @@ import re  import json  from .common import InfoExtractor -from ..compat import ( -    compat_urllib_parse_urlparse, -    compat_urlparse, -) +from ..compat import compat_urlparse  from ..utils import (      clean_html,      ExtractorError,      int_or_none, -    float_or_none,      parse_duration,      determine_ext,  ) @@ -59,12 +55,12 @@ class FranceTVBaseInfoExtractor(InfoExtractor):                      # See https://github.com/rg3/youtube-dl/issues/3963                      # m3u8 urls work fine                      continue -                video_url_parsed = compat_urllib_parse_urlparse(video_url)                  f4m_url = self._download_webpage( -                    'http://hdfauth.francetv.fr/esi/TA?url=%s' % video_url_parsed.path, +                    'http://hdfauth.francetv.fr/esi/TA?url=%s' % video_url,                      video_id, 'Downloading f4m manifest token', fatal=False)                  if f4m_url: -                    formats.extend(self._extract_f4m_formats(f4m_url, video_id, 1, format_id)) +                    formats.extend(self._extract_f4m_formats( +                        f4m_url + '&hdcore=3.7.0&plugin=aasp-3.7.0.39.44', video_id, 1, format_id))              elif ext == 'm3u8':                  formats.extend(self._extract_m3u8_formats(video_url, video_id, 'mp4', m3u8_id=format_id))              elif video_url.startswith('rtmp'): @@ -82,28 +78,48 @@ class FranceTVBaseInfoExtractor(InfoExtractor):                  })          self._sort_formats(formats) +        title = info['titre'] +        subtitle = info.get('sous_titre') +        if subtitle: +            title += ' - %s' % subtitle + +        subtitles = {} +        subtitles_list = [{ +            'url': subformat['url'], +            'ext': subformat.get('format'), +        } for subformat in info.get('subtitles', []) if subformat.get('url')] +        if subtitles_list: +            subtitles['fr'] = subtitles_list +          return {              'id': video_id, -            'title': info['titre'], +            'title': title,              'description': clean_html(info['synopsis']),              'thumbnail': compat_urlparse.urljoin('http://pluzz.francetv.fr', info['image']), -            'duration': float_or_none(info.get('real_duration'), 1000) or parse_duration(info['duree']), +            'duration': int_or_none(info.get('real_duration')) or parse_duration(info['duree']),              'timestamp': int_or_none(info['diffusion']['timestamp']),              'formats': formats, +            'subtitles': subtitles,          }  class PluzzIE(FranceTVBaseInfoExtractor):      IE_NAME = 'pluzz.francetv.fr' -    _VALID_URL = r'https?://pluzz\.francetv\.fr/videos/(.*?)\.html' +    _VALID_URL = r'https?://(?:m\.)?pluzz\.francetv\.fr/videos/(?P<id>.+?)\.html'      # Can't use tests, videos expire in 7 days      def _real_extract(self, url): -        title = re.match(self._VALID_URL, url).group(1) -        webpage = self._download_webpage(url, title) -        video_id = self._search_regex( -            r'data-diffusion="(\d+)"', webpage, 'ID') +        display_id = self._match_id(url) + +        webpage = self._download_webpage(url, display_id) + +        video_id = self._html_search_meta( +            'id_video', webpage, 'video id', default=None) +        if not video_id: +            video_id = self._search_regex( +                r'data-diffusion=["\'](\d+)', webpage, 'video id') +          return self._extract_video(video_id, 'Pluzz') @@ -119,6 +135,9 @@ class FranceTvInfoIE(FranceTVBaseInfoExtractor):              'title': 'Soir 3',              'upload_date': '20130826',              'timestamp': 1377548400, +            'subtitles': { +                'fr': 'mincount:2', +            },          },      }, {          'url': 'http://www.francetvinfo.fr/elections/europeennes/direct-europeennes-regardez-le-debat-entre-les-candidats-a-la-presidence-de-la-commission_600639.html', @@ -160,11 +179,21 @@ class FranceTvInfoIE(FranceTVBaseInfoExtractor):  class FranceTVIE(FranceTVBaseInfoExtractor):      IE_NAME = 'francetv'      IE_DESC = 'France 2, 3, 4, 5 and Ô' -    _VALID_URL = r'''(?x)https?://www\.france[2345o]\.fr/ -        (?: -            emissions/.*?/(videos|emissions)/(?P<id>[^/?]+) -        |   (emissions?|jt)/(?P<key>[^/?]+) -        )''' +    _VALID_URL = r'''(?x) +                    https?:// +                        (?: +                            (?:www\.)?france[2345o]\.fr/ +                                (?: +                                    emissions/[^/]+/(?:videos|diffusions)| +                                    emission/[^/]+| +                                    videos| +                                    jt +                                ) +                            /| +                            embed\.francetv\.fr/\?ue= +                        ) +                        (?P<id>[^/?]+) +                    '''      _TESTS = [          # france2 @@ -208,37 +237,59 @@ class FranceTVIE(FranceTVBaseInfoExtractor):          },          # france5          { -            'url': 'http://www.france5.fr/emissions/c-a-dire/videos/92837968', -            'md5': '78f0f4064f9074438e660785bbf2c5d9', +            'url': 'http://www.france5.fr/emissions/c-a-dire/videos/quels_sont_les_enjeux_de_cette_rentree_politique__31-08-2015_908948?onglet=tous&page=1', +            'md5': 'f6c577df3806e26471b3d21631241fd0',              'info_dict': { -                'id': '108961659', +                'id': '123327454',                  'ext': 'flv', -                'title': 'C à dire ?!', -                'description': 'md5:1a4aeab476eb657bf57c4ff122129f81', -                'upload_date': '20140915', -                'timestamp': 1410795000, +                'title': 'C à dire ?! - Quels sont les enjeux de cette rentrée politique ?', +                'description': 'md5:4a0d5cb5dce89d353522a84462bae5a4', +                'upload_date': '20150831', +                'timestamp': 1441035120,              },          },          # franceo          { -            'url': 'http://www.franceo.fr/jt/info-afrique/04-12-2013', -            'md5': '52f0bfe202848b15915a2f39aaa8981b', +            'url': 'http://www.franceo.fr/jt/info-soir/18-07-2015', +            'md5': '47d5816d3b24351cdce512ad7ab31da8', +            'info_dict': { +                'id': '125377621', +                'ext': 'flv', +                'title': 'Infô soir', +                'description': 'md5:01b8c6915a3d93d8bbbd692651714309', +                'upload_date': '20150718', +                'timestamp': 1437241200, +                'duration': 414, +            }, +        }, +        { +            # francetv embed +            'url': 'http://embed.francetv.fr/?ue=8d7d3da1e3047c42ade5a5d7dfd3fc87',              'info_dict': { -                'id': '108634970', +                'id': 'EV_30231',                  'ext': 'flv', -                'title': 'Infô Afrique', -                'description': 'md5:ebf346da789428841bee0fd2a935ea55', -                'upload_date': '20140915', -                'timestamp': 1410822000, +                'title': 'Alcaline, le concert avec Calogero', +                'description': 'md5:61f08036dcc8f47e9cfc33aed08ffaff', +                'upload_date': '20150226', +                'timestamp': 1424989860, +                'duration': 5400,              },          }, +        { +            'url': 'http://www.france4.fr/emission/highlander/diffusion-du-17-07-2015-04h05', +            'only_matching': True, +        }, +        { +            'url': 'http://www.franceo.fr/videos/125377617', +            'only_matching': True, +        }      ]      def _real_extract(self, url): -        mobj = re.match(self._VALID_URL, url) -        webpage = self._download_webpage(url, mobj.group('key') or mobj.group('id')) +        video_id = self._match_id(url) +        webpage = self._download_webpage(url, video_id)          video_id, catalogue = self._html_search_regex( -            r'href="http://videos\.francetv\.fr/video/([^@]+@[^"]+)"', +            r'href="http://videos?\.francetv\.fr/video/([^@]+@[^"]+)"',              webpage, 'video ID').split('@')          return self._extract_video(video_id, catalogue)  | 
