2 from __future__
import unicode_literals
4 from .common
import InfoExtractor
5 from ..compat
import compat_str
14 class TeleQuebecBaseIE(InfoExtractor
):
15 BRIGHTCOVE_URL_TEMPLATE
= 'http://players.brightcove.net/%s/%s_default/index.html?videoId=%s'
18 def _brightcove_result(brightcove_id
, player_id
, account_id
='6150020952001'):
20 '_type': 'url_transparent',
21 'url': smuggle_url(TeleQuebecBaseIE
.BRIGHTCOVE_URL_TEMPLATE
% (account_id
, player_id
, brightcove_id
), {'geo_countries': ['CA']}
),
22 'ie_key': 'BrightcoveNew',
26 class TeleQuebecIE(TeleQuebecBaseIE
):
30 zonevideo\.telequebec\.tv/media|
31 coucou\.telequebec\.tv/videos
35 # available till 01.01.2023
36 'url': 'http://zonevideo.telequebec.tv/media/37578/un-petit-choc-et-puis-repart/un-chef-a-la-cabane',
38 'id': '6155972771001',
40 'title': 'Un petit choc et puis repart!',
41 'description': 'md5:b04a7e6b3f74e32d7b294cffe8658374',
42 'timestamp': 1589262469,
43 'uploader_id': '6150020952001',
44 'upload_date': '20200512',
46 'add_ie': ['BrightcoveNew'],
48 'url': 'https://zonevideo.telequebec.tv/media/55267/le-soleil/passe-partout',
50 'id': '6167180337001',
53 'description': 'md5:64289c922a8de2abbe99c354daffde02',
54 'uploader_id': '6150020952001',
55 'upload_date': '20200625',
56 'timestamp': 1593090307,
58 'add_ie': ['BrightcoveNew'],
61 'url': 'http://zonevideo.telequebec.tv/media/30261',
62 'only_matching': True,
64 'url': 'https://coucou.telequebec.tv/videos/41788/idee-de-genie/l-heure-du-bain',
65 'only_matching': True,
68 def _real_extract(self
, url
):
69 media_id
= self
._match
_id
(url
)
70 media
= self
._download
_json
(
71 'https://mnmedias.api.telequebec.tv/api/v3/media/' + media_id
,
73 source_id
= next(source_info
['sourceId'] for source_info
in media
['streamInfos'] if source_info
.get('source') == 'Brightcove')
74 info
= self
._brightcove
_result
(source_id
, '22gPKdt7f')
75 product
= media
.get('product') or {}
76 season
= product
.get('season') or {}
78 'description': try_get(media
, lambda x
: x
['descriptions'][-1]['text'], compat_str
),
79 'series': try_get(season
, lambda x
: x
['serie']['titre']),
80 'season': season
.get('name'),
81 'season_number': int_or_none(season
.get('seasonNo')),
82 'episode': product
.get('titre'),
83 'episode_number': int_or_none(product
.get('episodeNo')),
88 class TeleQuebecSquatIE(InfoExtractor
):
89 _VALID_URL
= r
'https://squat\.telequebec\.tv/videos/(?P<id>\d+)'
91 'url': 'https://squat.telequebec.tv/videos/9314',
93 'id': 'd59ae78112d542e793d83cc9d3a5b530',
95 'title': 'Poupeflekta',
96 'description': 'md5:2f0718f8d2f8fece1646ee25fb7bce75',
98 'timestamp': 1569057600,
99 'upload_date': '20190921',
100 'series': 'Miraculous : Les Aventures de Ladybug et Chat Noir',
101 'season': 'Saison 3',
103 'episode_number': 57,
106 'skip_download': True,
110 def _real_extract(self
, url
):
111 video_id
= self
._match
_id
(url
)
113 video
= self
._download
_json
(
114 'https://squat.api.telequebec.tv/v1/videos/%s' % video_id
,
117 media_id
= video
['sourceId']
120 '_type': 'url_transparent',
121 'url': 'http://zonevideo.telequebec.tv/media/%s' % media_id
,
122 'ie_key': TeleQuebecIE
.ie_key(),
124 'title': video
.get('titre'),
125 'description': video
.get('description'),
126 'timestamp': unified_timestamp(video
.get('datePublication')),
127 'series': video
.get('container'),
128 'season': video
.get('saison'),
129 'season_number': int_or_none(video
.get('noSaison')),
130 'episode_number': int_or_none(video
.get('episode')),
134 class TeleQuebecEmissionIE(InfoExtractor
):
135 _VALID_URL
= r
'''(?x)
138 [^/]+\.telequebec\.tv/emissions/|
139 (?:www\.)?telequebec\.tv/
144 'url': 'http://lindicemcsween.telequebec.tv/emissions/100430013/des-soins-esthetiques-a-377-d-interets-annuels-ca-vous-tente',
146 'id': '6154476028001',
148 'title': 'Des soins esthétiques à 377 % d’intérêts annuels, ça vous tente?',
149 'description': 'md5:cb4d378e073fae6cce1f87c00f84ae9f',
150 'upload_date': '20200505',
151 'timestamp': 1588713424,
152 'uploader_id': '6150020952001',
155 'url': 'http://bancpublic.telequebec.tv/emissions/emission-49/31986/jeunes-meres-sous-pression',
156 'only_matching': True,
158 'url': 'http://www.telequebec.tv/masha-et-michka/epi059masha-et-michka-3-053-078',
159 'only_matching': True,
161 'url': 'http://www.telequebec.tv/documentaire/bebes-sur-mesure/',
162 'only_matching': True,
165 def _real_extract(self
, url
):
166 display_id
= self
._match
_id
(url
)
168 webpage
= self
._download
_webpage
(url
, display_id
)
170 media_id
= self
._search
_regex
(
171 r
'mediaId\s*:\s*(?P<id>\d+)', webpage
, 'media id')
173 return self
.url_result(
174 'http://zonevideo.telequebec.tv/media/' + media_id
,
175 TeleQuebecIE
.ie_key())
178 class TeleQuebecLiveIE(TeleQuebecBaseIE
):
179 _VALID_URL
= r
'https?://zonevideo\.telequebec\.tv/(?P<id>endirect)'
181 'url': 'http://zonevideo.telequebec.tv/endirect/',
183 'id': '6159095684001',
185 'title': 're:^Télé-Québec [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
187 'description': 'Canal principal de Télé-Québec',
188 'uploader_id': '6150020952001',
189 'timestamp': 1590439901,
190 'upload_date': '20200525',
193 'skip_download': True,
197 def _real_extract(self
, url
):
198 return self
._brightcove
_result
('6159095684001', 'skCsmi2Uw')
201 class TeleQuebecVideoIE(TeleQuebecBaseIE
):
202 _VALID_URL
= r
'https?://video\.telequebec\.tv/player(?:-live)?/(?P<id>\d+)'
204 'url': 'https://video.telequebec.tv/player/31110/stream',
206 'id': '6202570652001',
208 'title': 'Le coût du véhicule le plus vendu au Canada / Tous les frais liés à la procréation assistée',
209 'description': 'md5:685a7e4c450ba777c60adb6e71e41526',
210 'upload_date': '20201019',
211 'timestamp': 1603115930,
212 'uploader_id': '6101674910001',
215 'url': 'https://video.telequebec.tv/player-live/28527',
216 'only_matching': True,
219 def _call_api(self
, path
, video_id
):
220 return self
._download
_json
(
221 'http://beacon.playback.api.brightcove.com/telequebec/api/assets/' + path
,
222 video_id
, query
={'device_layout': 'web', 'device_type': 'web'}
)['data']
224 def _real_extract(self
, url
):
225 asset_id
= self
._match
_id
(url
)
226 asset
= self
._call
_api
(asset_id
, asset_id
)['asset']
227 stream
= self
._call
_api
(
228 asset_id
+ '/streams/' + asset
['streams'][0]['id'], asset_id
)['stream']
229 stream_url
= stream
['url']
230 account_id
= try_get(
231 stream
, lambda x
: x
['video_provider_details']['account_id']) or '6101674910001'
232 info
= self
._brightcove
_result
(stream_url
, 'default', account_id
)
234 'description': asset
.get('long_description') or asset
.get('short_description'),
235 'series': asset
.get('series_original_name'),
236 'season_number': int_or_none(asset
.get('season_number')),
237 'episode': asset
.get('original_name'),
238 'episode_number': int_or_none(asset
.get('episode_number')),