youtube-dl

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

tfo.py (2038B)


      1 # coding: utf-8
      2 from __future__ import unicode_literals
      3 
      4 import json
      5 
      6 from .common import InfoExtractor
      7 from ..utils import (
      8     HEADRequest,
      9     ExtractorError,
     10     int_or_none,
     11     clean_html,
     12 )
     13 
     14 
     15 class TFOIE(InfoExtractor):
     16     _GEO_COUNTRIES = ['CA']
     17     _VALID_URL = r'https?://(?:www\.)?tfo\.org/(?:en|fr)/(?:[^/]+/){2}(?P<id>\d+)'
     18     _TEST = {
     19         'url': 'http://www.tfo.org/en/universe/tfo-247/100463871/video-game-hackathon',
     20         'md5': 'cafbe4f47a8dae0ca0159937878100d6',
     21         'info_dict': {
     22             'id': '7da3d50e495c406b8fc0b997659cc075',
     23             'ext': 'mp4',
     24             'title': 'Video Game Hackathon',
     25             'description': 'md5:558afeba217c6c8d96c60e5421795c07',
     26         }
     27     }
     28 
     29     def _real_extract(self, url):
     30         video_id = self._match_id(url)
     31         self._request_webpage(HEADRequest('http://www.tfo.org/'), video_id)
     32         infos = self._download_json(
     33             'http://www.tfo.org/api/web/video/get_infos', video_id, data=json.dumps({
     34                 'product_id': video_id,
     35             }).encode(), headers={
     36                 'X-tfo-session': self._get_cookies('http://www.tfo.org/')['tfo-session'].value,
     37             })
     38         if infos.get('success') == 0:
     39             if infos.get('code') == 'ErrGeoBlocked':
     40                 self.raise_geo_restricted(countries=self._GEO_COUNTRIES)
     41             raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(infos['msg'])), expected=True)
     42         video_data = infos['data']
     43 
     44         return {
     45             '_type': 'url_transparent',
     46             'id': video_id,
     47             'url': 'limelight:media:' + video_data['llid'],
     48             'title': video_data['title'],
     49             'description': video_data.get('description'),
     50             'series': video_data.get('collection'),
     51             'season_number': int_or_none(video_data.get('season')),
     52             'episode_number': int_or_none(video_data.get('episode')),
     53             'duration': int_or_none(video_data.get('duration')),
     54             'ie_key': 'LimelightMedia',
     55         }