]> jfr.im git - yt-dlp.git/blame - youtube_dl/extractor/rtlnl.py
[extractor/generic] Add support for francetv embeds
[yt-dlp.git] / youtube_dl / extractor / rtlnl.py
CommitLineData
59b8ab58 1# coding: utf-8
6493f5d7
JMF
2from __future__ import unicode_literals
3
6493f5d7 4from .common import InfoExtractor
59b8ab58
PH
5from ..utils import (
6 int_or_none,
7 parse_duration,
8)
6493f5d7
JMF
9
10
59b8ab58
PH
11class RtlNlIE(InfoExtractor):
12 IE_NAME = 'rtl.nl'
13 IE_DESC = 'rtl.nl and rtlxl.nl'
14 _VALID_URL = r'''(?x)
a9d56c68 15 https?://(?:www\.)?
59b8ab58
PH
16 (?:
17 rtlxl\.nl/\#!/[^/]+/|
a9d56c68 18 rtl\.nl/system/videoplayer/(?:[^/]+/)+(?:video_)?embed\.html\b.+?\buuid=
59b8ab58
PH
19 )
20 (?P<id>[0-9a-f-]+)'''
6493f5d7 21
59b8ab58 22 _TESTS = [{
6493f5d7 23 'url': 'http://www.rtlxl.nl/#!/rtl-nieuws-132237/6e4203a6-0a5e-3596-8424-c599a59e0677',
de2d9f5f 24 'md5': 'cc16baa36a6c169391f0764fa6b16654',
6493f5d7
JMF
25 'info_dict': {
26 'id': '6e4203a6-0a5e-3596-8424-c599a59e0677',
de2d9f5f 27 'ext': 'mp4',
6493f5d7 28 'title': 'RTL Nieuws - Laat',
de2d9f5f 29 'description': 'md5:6b61f66510c8889923b11f2778c72dc5',
6493f5d7
JMF
30 'timestamp': 1408051800,
31 'upload_date': '20140814',
7adcbe75 32 'duration': 576.880,
6493f5d7 33 },
59b8ab58
PH
34 }, {
35 'url': 'http://www.rtl.nl/system/videoplayer/derden/rtlnieuws/video_embed.html#uuid=84ae5571-ac25-4225-ae0c-ef8d9efb2aed/autoplay=false',
36 'md5': 'dea7474214af1271d91ef332fb8be7ea',
37 'info_dict': {
38 'id': '84ae5571-ac25-4225-ae0c-ef8d9efb2aed',
39 'ext': 'mp4',
40 'timestamp': 1424039400,
41 'title': 'RTL Nieuws - Nieuwe beelden Kopenhagen: chaos direct na aanslag',
42 'thumbnail': 're:^https?://screenshots\.rtl\.nl/system/thumb/sz=[0-9]+x[0-9]+/uuid=84ae5571-ac25-4225-ae0c-ef8d9efb2aed$',
43 'upload_date': '20150215',
44 'description': 'Er zijn nieuwe beelden vrijgegeven die vlak na de aanslag in Kopenhagen zijn gemaakt. Op de video is goed te zien hoe omstanders zich bekommeren om één van de slachtoffers, terwijl de eerste agenten ter plaatse komen.',
45 }
9dfc4fa1 46 }, {
89d42c2c 47 # encrypted m3u8 streams, georestricted
9dfc4fa1
S
48 'url': 'http://www.rtlxl.nl/#!/afl-2-257632/52a74543-c504-4cde-8aa8-ec66fe8d68a7',
49 'only_matching': True,
a9d56c68
S
50 }, {
51 'url': 'http://www.rtl.nl/system/videoplayer/derden/embed.html#!/uuid=bb0353b0-d6a4-1dad-90e9-18fe75b8d1f0',
52 'only_matching': True,
59b8ab58 53 }]
6493f5d7
JMF
54
55 def _real_extract(self, url):
59b8ab58 56 uuid = self._match_id(url)
6493f5d7 57 info = self._download_json(
bea41c7f 58 'http://www.rtl.nl/system/s4m/vfd/version=2/uuid=%s/fmt=adaptive/' % uuid,
6493f5d7 59 uuid)
7adcbe75 60
6493f5d7 61 material = info['material'][0]
6493f5d7
JMF
62 progname = info['abstracts'][0]['name']
63 subtitle = material['title'] or info['episodes'][0]['name']
59b8ab58 64 description = material.get('synopsis') or info['episodes'][0]['synopsis']
6493f5d7 65
43232d5c
S
66 meta = info.get('meta', {})
67
49f0da7a 68 # Use unencrypted m3u8 streams (See https://github.com/rg3/youtube-dl/issues/4118)
0c20ee7d
S
69 # NB: nowadays, recent ffmpeg and avconv can handle these encrypted streams, so
70 # this adaptive -> flash workaround is not required in general, but it also
71 # allows bypassing georestriction therefore is retained for now.
43232d5c
S
72 videopath = material['videopath'].replace('/adaptive/', '/flash/')
73 m3u8_url = meta.get('videohost', 'http://manifest.us.rtl.nl') + videopath
de2d9f5f 74
37eddd31 75 formats = self._extract_m3u8_formats(m3u8_url, uuid, ext='mp4')
de2d9f5f 76
4698b14b 77 video_urlpart = videopath.split('/flash/')[1][:-5]
de2d9f5f
S
78 PG_URL_TEMPLATE = 'http://pg.us.rtl.nl/rtlxl/network/%s/progressive/%s.mp4'
79
80 formats.extend([
81 {
82 'url': PG_URL_TEMPLATE % ('a2m', video_urlpart),
83 'format_id': 'pg-sd',
84 },
85 {
86 'url': PG_URL_TEMPLATE % ('a3m', video_urlpart),
87 'format_id': 'pg-hd',
480b7c32 88 'quality': 0,
de2d9f5f
S
89 }
90 ])
37eddd31
NJ
91 self._sort_formats(formats)
92
59b8ab58 93 thumbnails = []
43232d5c 94
59b8ab58
PH
95 for p in ('poster_base_url', '"thumb_base_url"'):
96 if not meta.get(p):
97 continue
98
99 thumbnails.append({
100 'url': self._proto_relative_url(meta[p] + uuid),
101 'width': int_or_none(self._search_regex(
102 r'/sz=([0-9]+)', meta[p], 'thumbnail width', fatal=False)),
103 'height': int_or_none(self._search_regex(
104 r'/sz=[0-9]+x([0-9]+)',
105 meta[p], 'thumbnail height', fatal=False))
106 })
107
6493f5d7
JMF
108 return {
109 'id': uuid,
7adcbe75 110 'title': '%s - %s' % (progname, subtitle),
de2d9f5f 111 'formats': formats,
6493f5d7 112 'timestamp': material['original_date'],
59b8ab58 113 'description': description,
7adcbe75 114 'duration': parse_duration(material.get('duration')),
59b8ab58 115 'thumbnails': thumbnails,
6493f5d7 116 }