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',
47 'format': 'bestvideo',
49 'add_ie': ['BrightcoveNew'],
51 'url': 'https://zonevideo.telequebec.tv/media/55267/le-soleil/passe-partout',
53 'id': '6167180337001',
56 'description': 'md5:64289c922a8de2abbe99c354daffde02',
57 'uploader_id': '6150020952001',
58 'upload_date': '20200625',
59 'timestamp': 1593090307,
62 'format': 'bestvideo',
64 'add_ie': ['BrightcoveNew'],
67 'url': 'http://zonevideo.telequebec.tv/media/30261',
68 'only_matching': True,
70 'url': 'https://coucou.telequebec.tv/videos/41788/idee-de-genie/l-heure-du-bain',
71 'only_matching': True,
74 def _real_extract(self
, url
):
75 media_id
= self
._match
_id
(url
)
76 media
= self
._download
_json
(
77 'https://mnmedias.api.telequebec.tv/api/v3/media/' + media_id
,
79 source_id
= next(source_info
['sourceId'] for source_info
in media
['streamInfos'] if source_info
.get('source') == 'Brightcove')
80 info
= self
._brightcove
_result
(source_id
, '22gPKdt7f')
81 product
= media
.get('product') or {}
82 season
= product
.get('season') or {}
84 'description': try_get(media
, lambda x
: x
['descriptions'][-1]['text'], compat_str
),
85 'series': try_get(season
, lambda x
: x
['serie']['titre']),
86 'season': season
.get('name'),
87 'season_number': int_or_none(season
.get('seasonNo')),
88 'episode': product
.get('titre'),
89 'episode_number': int_or_none(product
.get('episodeNo')),
94 class TeleQuebecSquatIE(InfoExtractor
):
95 _VALID_URL
= r
'https://squat\.telequebec\.tv/videos/(?P<id>\d+)'
97 'url': 'https://squat.telequebec.tv/videos/9314',
99 'id': 'd59ae78112d542e793d83cc9d3a5b530',
101 'title': 'Poupeflekta',
102 'description': 'md5:2f0718f8d2f8fece1646ee25fb7bce75',
104 'timestamp': 1569057600,
105 'upload_date': '20190921',
106 'series': 'Miraculous : Les Aventures de Ladybug et Chat Noir',
107 'season': 'Saison 3',
109 'episode_number': 57,
112 'skip_download': True,
116 def _real_extract(self
, url
):
117 video_id
= self
._match
_id
(url
)
119 video
= self
._download
_json
(
120 'https://squat.api.telequebec.tv/v1/videos/%s' % video_id
,
123 media_id
= video
['sourceId']
126 '_type': 'url_transparent',
127 'url': 'http://zonevideo.telequebec.tv/media/%s' % media_id
,
128 'ie_key': TeleQuebecIE
.ie_key(),
130 'title': video
.get('titre'),
131 'description': video
.get('description'),
132 'timestamp': unified_timestamp(video
.get('datePublication')),
133 'series': video
.get('container'),
134 'season': video
.get('saison'),
135 'season_number': int_or_none(video
.get('noSaison')),
136 'episode_number': int_or_none(video
.get('episode')),
140 class TeleQuebecEmissionIE(InfoExtractor
):
141 _VALID_URL
= r
'''(?x)
144 [^/]+\.telequebec\.tv/emissions/|
145 (?:www\.)?telequebec\.tv/
150 'url': 'http://lindicemcsween.telequebec.tv/emissions/100430013/des-soins-esthetiques-a-377-d-interets-annuels-ca-vous-tente',
152 'id': '6154476028001',
154 'title': 'Des soins esthétiques à 377 % d’intérêts annuels, ça vous tente?',
155 'description': 'md5:cb4d378e073fae6cce1f87c00f84ae9f',
156 'upload_date': '20200505',
157 'timestamp': 1588713424,
158 'uploader_id': '6150020952001',
161 'format': 'bestvideo',
164 'url': 'http://bancpublic.telequebec.tv/emissions/emission-49/31986/jeunes-meres-sous-pression',
165 'only_matching': True,
167 'url': 'http://www.telequebec.tv/masha-et-michka/epi059masha-et-michka-3-053-078',
168 'only_matching': True,
170 'url': 'http://www.telequebec.tv/documentaire/bebes-sur-mesure/',
171 'only_matching': True,
174 def _real_extract(self
, url
):
175 display_id
= self
._match
_id
(url
)
177 webpage
= self
._download
_webpage
(url
, display_id
)
179 media_id
= self
._search
_regex
(
180 r
'mediaId\s*:\s*(?P<id>\d+)', webpage
, 'media id')
182 return self
.url_result(
183 'http://zonevideo.telequebec.tv/media/' + media_id
,
184 TeleQuebecIE
.ie_key())
187 class TeleQuebecLiveIE(TeleQuebecBaseIE
):
188 _VALID_URL
= r
'https?://zonevideo\.telequebec\.tv/(?P<id>endirect)'
190 'url': 'http://zonevideo.telequebec.tv/endirect/',
192 'id': '6159095684001',
194 'title': 're:^Télé-Québec [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
196 'description': 'Canal principal de Télé-Québec',
197 'uploader_id': '6150020952001',
198 'timestamp': 1590439901,
199 'upload_date': '20200525',
202 'skip_download': True,
206 def _real_extract(self
, url
):
207 return self
._brightcove
_result
('6159095684001', 'skCsmi2Uw')
210 class TeleQuebecVideoIE(TeleQuebecBaseIE
):
211 _VALID_URL
= r
'https?://video\.telequebec\.tv/player(?:-live)?/(?P<id>\d+)'
213 'url': 'https://video.telequebec.tv/player/31110/stream',
215 'id': '6202570652001',
217 'title': 'Le coût du véhicule le plus vendu au Canada / Tous les frais liés à la procréation assistée',
218 'description': 'md5:685a7e4c450ba777c60adb6e71e41526',
219 'upload_date': '20201019',
220 'timestamp': 1603115930,
221 'uploader_id': '6101674910001',
224 'format': 'bestvideo',
227 'url': 'https://video.telequebec.tv/player-live/28527',
228 'only_matching': True,
231 def _call_api(self
, path
, video_id
):
232 return self
._download
_json
(
233 'http://beacon.playback.api.brightcove.com/telequebec/api/assets/' + path
,
234 video_id
, query
={'device_layout': 'web', 'device_type': 'web'}
)['data']
236 def _real_extract(self
, url
):
237 asset_id
= self
._match
_id
(url
)
238 asset
= self
._call
_api
(asset_id
, asset_id
)['asset']
239 stream
= self
._call
_api
(
240 asset_id
+ '/streams/' + asset
['streams'][0]['id'], asset_id
)['stream']
241 stream_url
= stream
['url']
242 account_id
= try_get(
243 stream
, lambda x
: x
['video_provider_details']['account_id']) or '6101674910001'
244 info
= self
._brightcove
_result
(stream_url
, 'default', account_id
)
246 'description': asset
.get('long_description') or asset
.get('short_description'),
247 'series': asset
.get('series_original_name'),
248 'season_number': int_or_none(asset
.get('season_number')),
249 'episode': asset
.get('original_name'),
250 'episode_number': int_or_none(asset
.get('episode_number')),