]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/noco.py
7d2ff7b9a149d0284da1d52a26f4c0a85bf0f6ce
   2 from __future__ 
import unicode_literals
 
   8 from .common 
import InfoExtractor
 
  10     compat_urllib_request
, 
  19 class NocoIE(InfoExtractor
): 
  20     _VALID_URL 
= r
'http://(?:(?:www\.)?noco\.tv/emission/|player\.noco\.tv/\?idvideo=)(?P<id>\d+)' 
  21     _LOGIN_URL 
= 'http://noco.tv/do.php' 
  22     _API_URL_TEMPLATE 
= 'https://api.noco.tv/1.1/%s?ts=%s&tk=%s' 
  23     _SUB_LANG_TEMPLATE 
= '&sub_lang=%s' 
  24     _NETRC_MACHINE 
= 'noco' 
  27         'url': 'http://noco.tv/emission/11538/nolife/ami-ami-idol-hello-france/', 
  28         'md5': '0a993f0058ddbcd902630b2047ef710e', 
  32             'title': 'Ami Ami Idol - Hello! France', 
  33             'description': 'md5:4eaab46ab68fa4197a317a88a53d3b86', 
  34             'upload_date': '20140412', 
  39         'skip': 'Requires noco account', 
  42     def _real_initialize(self
): 
  46         (username
, password
) = self
._get
_login
_info
() 
  56         request 
= compat_urllib_request
.Request(self
._LOGIN
_URL
, compat_urllib_parse
.urlencode(login_form
)) 
  57         request
.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8') 
  59         login 
= self
._download
_json
(request
, None, 'Logging in as %s' % username
) 
  62             raise ExtractorError('Unable to login: %s' % clean_html(login
['erreur']), expected
=True) 
  64     def _call_api(self
, path
, video_id
, note
, sub_lang
=None): 
  65         ts 
= compat_str(int(time
.time() * 1000)) 
  66         tk 
= hashlib
.md5((hashlib
.md5(ts
.encode('ascii')).hexdigest() + '#8S?uCraTedap6a').encode('ascii')).hexdigest() 
  67         url 
= self
._API
_URL
_TEMPLATE 
% (path
, ts
, tk
) 
  69             url 
+= self
._SUB
_LANG
_TEMPLATE 
% sub_lang
 
  71         resp 
= self
._download
_json
(url
, video_id
, note
) 
  73         if isinstance(resp
, dict) and resp
.get('error'): 
  74             self
._raise
_error
(resp
['error'], resp
['description']) 
  78     def _raise_error(self
, error
, description
): 
  80             '%s returned error: %s - %s' % (self
.IE_NAME
, error
, description
), 
  83     def _real_extract(self
, url
): 
  84         mobj 
= re
.match(self
._VALID
_URL
, url
) 
  85         video_id 
= mobj
.group('id') 
  87         medias 
= self
._call
_api
( 
  88             'shows/%s/medias' % video_id
, 
  89             video_id
, 'Downloading video JSON') 
  91         qualities 
= self
._call
_api
( 
  93             video_id
, 'Downloading qualities JSON') 
  97         for lang
, lang_dict 
in medias
['fr']['video_list'].items(): 
  98             for format_id
, fmt 
in lang_dict
['quality_list'].items(): 
  99                 format_id_extended 
= '%s-%s' % (lang
, format_id
) if lang 
!= 'none' else format_id
 
 101                 video 
= self
._call
_api
( 
 102                     'shows/%s/video/%s/fr' % (video_id
, format_id
.lower()), 
 103                     video_id
, 'Downloading %s video JSON' % format_id_extended
, 
 104                     lang 
if lang 
!= 'none' else None) 
 106                 file_url 
= video
['file'] 
 110                 if file_url 
in ['forbidden', 'not found']: 
 111                     popmessage 
= video
['popmessage'] 
 112                     self
._raise
_error
(popmessage
['title'], popmessage
['message']) 
 116                     'format_id': format_id_extended
, 
 117                     'width': fmt
['res_width'], 
 118                     'height': fmt
['res_lines'], 
 119                     'abr': fmt
['audiobitrate'], 
 120                     'vbr': fmt
['videobitrate'], 
 121                     'filesize': fmt
['filesize'], 
 122                     'format_note': qualities
[format_id
]['quality_name'], 
 123                     'preference': qualities
[format_id
]['priority'], 
 126         self
._sort
_formats
(formats
) 
 128         show 
= self
._call
_api
( 
 129             'shows/by_id/%s' % video_id
, 
 130             video_id
, 'Downloading show JSON')[0] 
 132         upload_date 
= unified_strdate(show
['online_date_start_utc']) 
 133         uploader 
= show
['partner_name'] 
 134         uploader_id 
= show
['partner_key'] 
 135         duration 
= show
['duration_ms'] / 1000.0 
 138         for thumbnail_key
, thumbnail_url 
in show
.items(): 
 139             m 
= re
.search(r
'^screenshot_(?P<width>\d+)x(?P<height>\d+)$', thumbnail_key
) 
 143                 'url': thumbnail_url
, 
 144                 'width': int(m
.group('width')), 
 145                 'height': int(m
.group('height')), 
 148         episode 
= show
.get('show_TT') or show
.get('show_OT') 
 149         family 
= show
.get('family_TT') or show
.get('family_OT') 
 150         episode_number 
= show
.get('episode_number') 
 156             title 
+= ' #' + compat_str(episode_number
) 
 158             title 
+= ' - ' + episode
 
 160         description 
= show
.get('show_resume') or show
.get('family_resume') 
 165             'description': description
, 
 166             'thumbnails': thumbnails
, 
 167             'upload_date': upload_date
, 
 168             'uploader': uploader
, 
 169             'uploader_id': uploader_id
, 
 170             'duration': duration
,