]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/noco.py
2 from __future__
import unicode_literals
8 from .common
import InfoExtractor
12 compat_urllib_request
,
21 class NocoIE(InfoExtractor
):
22 _VALID_URL
= r
'http://(?:(?:www\.)?noco\.tv/emission/|player\.noco\.tv/\?idvideo=)(?P<id>\d+)'
23 _LOGIN_URL
= 'http://noco.tv/do.php'
24 _API_URL_TEMPLATE
= 'https://api.noco.tv/1.1/%s?ts=%s&tk=%s'
25 _SUB_LANG_TEMPLATE
= '&sub_lang=%s'
26 _NETRC_MACHINE
= 'noco'
29 'url': 'http://noco.tv/emission/11538/nolife/ami-ami-idol-hello-france/',
30 'md5': '0a993f0058ddbcd902630b2047ef710e',
34 'title': 'Ami Ami Idol - Hello! France',
35 'description': 'md5:4eaab46ab68fa4197a317a88a53d3b86',
36 'upload_date': '20140412',
41 'skip': 'Requires noco account',
44 def _real_initialize(self
):
48 (username
, password
) = self
._get
_login
_info
()
58 request
= compat_urllib_request
.Request(self
._LOGIN
_URL
, compat_urllib_parse
.urlencode(login_form
))
59 request
.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
61 login
= self
._download
_json
(request
, None, 'Logging in as %s' % username
)
64 raise ExtractorError('Unable to login: %s' % clean_html(login
['erreur']), expected
=True)
66 def _call_api(self
, path
, video_id
, note
, sub_lang
=None):
67 ts
= compat_str(int(time
.time() * 1000))
68 tk
= hashlib
.md5((hashlib
.md5(ts
.encode('ascii')).hexdigest() + '#8S?uCraTedap6a').encode('ascii')).hexdigest()
69 url
= self
._API
_URL
_TEMPLATE
% (path
, ts
, tk
)
71 url
+= self
._SUB
_LANG
_TEMPLATE
% sub_lang
73 resp
= self
._download
_json
(url
, video_id
, note
)
75 if isinstance(resp
, dict) and resp
.get('error'):
76 self
._raise
_error
(resp
['error'], resp
['description'])
80 def _raise_error(self
, error
, description
):
82 '%s returned error: %s - %s' % (self
.IE_NAME
, error
, description
),
85 def _real_extract(self
, url
):
86 mobj
= re
.match(self
._VALID
_URL
, url
)
87 video_id
= mobj
.group('id')
89 medias
= self
._call
_api
(
90 'shows/%s/medias' % video_id
,
91 video_id
, 'Downloading video JSON')
93 qualities
= self
._call
_api
(
95 video_id
, 'Downloading qualities JSON')
99 for lang
, lang_dict
in medias
['fr']['video_list'].items():
100 for format_id
, fmt
in lang_dict
['quality_list'].items():
101 format_id_extended
= '%s-%s' % (lang
, format_id
) if lang
!= 'none' else format_id
103 video
= self
._call
_api
(
104 'shows/%s/video/%s/fr' % (video_id
, format_id
.lower()),
105 video_id
, 'Downloading %s video JSON' % format_id_extended
,
106 lang
if lang
!= 'none' else None)
108 file_url
= video
['file']
112 if file_url
in ['forbidden', 'not found']:
113 popmessage
= video
['popmessage']
114 self
._raise
_error
(popmessage
['title'], popmessage
['message'])
118 'format_id': format_id_extended
,
119 'width': fmt
['res_width'],
120 'height': fmt
['res_lines'],
121 'abr': fmt
['audiobitrate'],
122 'vbr': fmt
['videobitrate'],
123 'filesize': fmt
['filesize'],
124 'format_note': qualities
[format_id
]['quality_name'],
125 'preference': qualities
[format_id
]['priority'],
128 self
._sort
_formats
(formats
)
130 show
= self
._call
_api
(
131 'shows/by_id/%s' % video_id
,
132 video_id
, 'Downloading show JSON')[0]
134 upload_date
= unified_strdate(show
['online_date_start_utc'])
135 uploader
= show
['partner_name']
136 uploader_id
= show
['partner_key']
137 duration
= show
['duration_ms'] / 1000.0
140 for thumbnail_key
, thumbnail_url
in show
.items():
141 m
= re
.search(r
'^screenshot_(?P<width>\d+)x(?P<height>\d+)$', thumbnail_key
)
145 'url': thumbnail_url
,
146 'width': int(m
.group('width')),
147 'height': int(m
.group('height')),
150 episode
= show
.get('show_TT') or show
.get('show_OT')
151 family
= show
.get('family_TT') or show
.get('family_OT')
152 episode_number
= show
.get('episode_number')
158 title
+= ' #' + compat_str(episode_number
)
160 title
+= ' - ' + episode
162 description
= show
.get('show_resume') or show
.get('family_resume')
167 'description': description
,
168 'thumbnails': thumbnails
,
169 'upload_date': upload_date
,
170 'uploader': uploader
,
171 'uploader_id': uploader_id
,
172 'duration': duration
,