youtube-dl

Another place where youtube-dl lives on
git clone git://git.oshgnacknak.de/youtube-dl.git
Log | Files | Refs | README | LICENSE

philharmoniedeparis.py (3759B)


      1 # coding: utf-8
      2 from __future__ import unicode_literals
      3 
      4 from .common import InfoExtractor
      5 from ..compat import compat_str
      6 from ..utils import (
      7     try_get,
      8     urljoin,
      9 )
     10 
     11 
     12 class PhilharmonieDeParisIE(InfoExtractor):
     13     IE_DESC = 'Philharmonie de Paris'
     14     _VALID_URL = r'''(?x)
     15                     https?://
     16                         (?:
     17                             live\.philharmoniedeparis\.fr/(?:[Cc]oncert/|embed(?:app)?/|misc/Playlist\.ashx\?id=)|
     18                             pad\.philharmoniedeparis\.fr/doc/CIMU/
     19                         )
     20                         (?P<id>\d+)
     21                     '''
     22     _TESTS = [{
     23         'url': 'http://pad.philharmoniedeparis.fr/doc/CIMU/1086697/jazz-a-la-villette-knower',
     24         'md5': 'a0a4b195f544645073631cbec166a2c2',
     25         'info_dict': {
     26             'id': '1086697',
     27             'ext': 'mp4',
     28             'title': 'Jazz à la Villette : Knower',
     29         },
     30     }, {
     31         'url': 'http://live.philharmoniedeparis.fr/concert/1032066.html',
     32         'info_dict': {
     33             'id': '1032066',
     34             'title': 'md5:0a031b81807b3593cffa3c9a87a167a0',
     35         },
     36         'playlist_mincount': 2,
     37     }, {
     38         'url': 'http://live.philharmoniedeparis.fr/Concert/1030324.html',
     39         'only_matching': True,
     40     }, {
     41         'url': 'http://live.philharmoniedeparis.fr/misc/Playlist.ashx?id=1030324&track=&lang=fr',
     42         'only_matching': True,
     43     }, {
     44         'url': 'https://live.philharmoniedeparis.fr/embedapp/1098406/berlioz-fantastique-lelio-les-siecles-national-youth-choir-of.html?lang=fr-FR',
     45         'only_matching': True,
     46     }, {
     47         'url': 'https://live.philharmoniedeparis.fr/embed/1098406/berlioz-fantastique-lelio-les-siecles-national-youth-choir-of.html?lang=fr-FR',
     48         'only_matching': True,
     49     }]
     50     _LIVE_URL = 'https://live.philharmoniedeparis.fr'
     51 
     52     def _real_extract(self, url):
     53         video_id = self._match_id(url)
     54 
     55         config = self._download_json(
     56             '%s/otoPlayer/config.ashx' % self._LIVE_URL, video_id, query={
     57                 'id': video_id,
     58                 'lang': 'fr-FR',
     59             })
     60 
     61         def extract_entry(source):
     62             if not isinstance(source, dict):
     63                 return
     64             title = source.get('title')
     65             if not title:
     66                 return
     67             files = source.get('files')
     68             if not isinstance(files, dict):
     69                 return
     70             format_urls = set()
     71             formats = []
     72             for format_id in ('mobile', 'desktop'):
     73                 format_url = try_get(
     74                     files, lambda x: x[format_id]['file'], compat_str)
     75                 if not format_url or format_url in format_urls:
     76                     continue
     77                 format_urls.add(format_url)
     78                 m3u8_url = urljoin(self._LIVE_URL, format_url)
     79                 formats.extend(self._extract_m3u8_formats(
     80                     m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',
     81                     m3u8_id='hls', fatal=False))
     82             if not formats:
     83                 return
     84             self._sort_formats(formats)
     85             return {
     86                 'title': title,
     87                 'formats': formats,
     88             }
     89 
     90         thumbnail = urljoin(self._LIVE_URL, config.get('image'))
     91 
     92         info = extract_entry(config)
     93         if info:
     94             info.update({
     95                 'id': video_id,
     96                 'thumbnail': thumbnail,
     97             })
     98             return info
     99 
    100         entries = []
    101         for num, chapter in enumerate(config['chapters'], start=1):
    102             entry = extract_entry(chapter)
    103             entry['id'] = '%s-%d' % (video_id, num)
    104             entries.append(entry)
    105 
    106         return self.playlist_result(entries, video_id, config.get('title'))