]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/curiositystream.py
   2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
  15 class CuriosityStreamBaseIE(InfoExtractor
): 
  16     _NETRC_MACHINE 
= 'curiositystream' 
  18     _API_BASE_URL 
= 'https://api.curiositystream.com/v1/' 
  20     def _handle_errors(self
, result
): 
  21         error 
= result
.get('error', {}).get('message') 
  23             if isinstance(error
, dict): 
  24                 error 
= ', '.join(error
.values()) 
  26                 '%s said: %s' % (self
.IE_NAME
, error
), expected
=True) 
  28     def _call_api(self
, path
, video_id
): 
  31             headers
['X-Auth-Token'] = self
._auth
_token
 
  32         result 
= self
._download
_json
( 
  33             self
._API
_BASE
_URL 
+ path
, video_id
, headers
=headers
) 
  34         self
._handle
_errors
(result
) 
  37     def _real_initialize(self
): 
  38         email
, password 
= self
._get
_login
_info
() 
  41         result 
= self
._download
_json
( 
  42             self
._API
_BASE
_URL 
+ 'login', None, data
=urlencode_postdata({ 
  46         self
._handle
_errors
(result
) 
  47         self
._auth
_token 
= result
['message']['auth_token'] 
  50 class CuriosityStreamIE(CuriosityStreamBaseIE
): 
  51     IE_NAME 
= 'curiositystream' 
  52     _VALID_URL 
= r
'https?://(?:app\.)?curiositystream\.com/video/(?P<id>\d+)' 
  54         'url': 'https://app.curiositystream.com/video/2', 
  55         'md5': '262bb2f257ff301115f1973540de8983', 
  59             'title': 'How Did You Develop The Internet?', 
  60             'description': 'Vint Cerf, Google\'s Chief Internet Evangelist, describes how he and Bob Kahn created the internet.', 
  64     def _real_extract(self
, url
): 
  65         video_id 
= self
._match
_id
(url
) 
  66         media 
= self
._call
_api
('media/' + video_id
, video_id
) 
  67         title 
= media
['title'] 
  70         for encoding 
in media
.get('encodings', []): 
  71             m3u8_url 
= encoding
.get('master_playlist_url') 
  73                 formats
.extend(self
._extract
_m
3u8_formats
( 
  74                     m3u8_url
, video_id
, 'mp4', 'm3u8_native', 
  75                     m3u8_id
='hls', fatal
=False)) 
  76             encoding_url 
= encoding
.get('url') 
  77             file_url 
= encoding
.get('file_url') 
  78             if not encoding_url 
and not file_url
: 
  81                 'width': int_or_none(encoding
.get('width')), 
  82                 'height': int_or_none(encoding
.get('height')), 
  83                 'vbr': int_or_none(encoding
.get('video_bitrate')), 
  84                 'abr': int_or_none(encoding
.get('audio_bitrate')), 
  85                 'filesize': int_or_none(encoding
.get('size_in_bytes')), 
  86                 'vcodec': encoding
.get('video_codec'), 
  87                 'acodec': encoding
.get('audio_codec'), 
  88                 'container': encoding
.get('container_type'), 
  90             for f_url 
in (encoding_url
, file_url
): 
  94                 rtmp 
= re
.search(r
'^(?P<url>rtmpe?://(?P<host>[^/]+)/(?P<app>.+))/(?P<playpath>mp[34]:.+)$', f_url
) 
  97                         'url': rtmp
.group('url'), 
  98                         'play_path': rtmp
.group('playpath'), 
  99                         'app': rtmp
.group('app'), 
 109         self
._sort
_formats
(formats
) 
 112         for closed_caption 
in media
.get('closed_captions', []): 
 113             sub_url 
= closed_caption
.get('file') 
 116             lang 
= closed_caption
.get('code') or closed_caption
.get('language') or 'en' 
 117             subtitles
.setdefault(lang
, []).append({ 
 125             'description': media
.get('description'), 
 126             'thumbnail': media
.get('image_large') or media
.get('image_medium') or media
.get('image_small'), 
 127             'duration': int_or_none(media
.get('duration')), 
 128             'tags': media
.get('tags'), 
 129             'subtitles': subtitles
, 
 133 class CuriosityStreamCollectionIE(CuriosityStreamBaseIE
): 
 134     IE_NAME 
= 'curiositystream:collection' 
 135     _VALID_URL 
= r
'https?://(?:app\.)?curiositystream\.com/(?:collection|series)/(?P<id>\d+)' 
 137         'url': 'https://app.curiositystream.com/collection/2', 
 140             'title': 'Curious Minds: The Internet', 
 141             'description': 'How is the internet shaping our lives in the 21st Century?', 
 143         'playlist_mincount': 17, 
 145         'url': 'https://curiositystream.com/series/2', 
 146         'only_matching': True, 
 149     def _real_extract(self
, url
): 
 150         collection_id 
= self
._match
_id
(url
) 
 151         collection 
= self
._call
_api
( 
 152             'collections/' + collection_id
, collection_id
) 
 154         for media 
in collection
.get('media', []): 
 155             media_id 
= compat_str(media
.get('id')) 
 156             entries
.append(self
.url_result( 
 157                 'https://curiositystream.com/video/' + media_id
, 
 158                 CuriosityStreamIE
.ie_key(), media_id
)) 
 159         return self
.playlist_result( 
 160             entries
, collection_id
, 
 161             collection
.get('title'), collection
.get('description'))