]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/lego.py
2 from __future__
import unicode_literals
7 from .common
import InfoExtractor
8 from ..compat
import compat_HTTPError
16 class LEGOIE(InfoExtractor
):
17 _VALID_URL
= r
'https?://(?:www\.)?lego\.com/(?P<locale>[a-z]{2}-[a-z]{2})/(?:[^/]+/)*videos/(?:[^/]+/)*[^/?#]+-(?P<id>[0-9a-f]{32})'
19 'url': 'http://www.lego.com/en-us/videos/themes/club/blocumentary-kawaguchi-55492d823b1b4d5e985787fa8c2973b1',
20 'md5': 'f34468f176cfd76488767fc162c405fa',
22 'id': '55492d82-3b1b-4d5e-9857-87fa8c2973b1_en-US',
24 'title': 'Blocumentary Great Creations: Akiyuki Kawaguchi',
25 'description': 'Blocumentary Great Creations: Akiyuki Kawaguchi',
28 # geo-restricted but the contentUrl contain a valid url
29 'url': 'http://www.lego.com/nl-nl/videos/themes/nexoknights/episode-20-kingdom-of-heroes-13bdc2299ab24d9685701a915b3d71e7##sp=399',
30 'md5': 'c7420221f7ffd03ff056f9db7f8d807c',
32 'id': '13bdc229-9ab2-4d96-8570-1a915b3d71e7_nl-NL',
34 'title': 'Aflevering 20: Helden van het koninkrijk',
35 'description': 'md5:8ee499aac26d7fa8bcb0cedb7f9c3941',
40 'url': 'https://www.lego.com/nl-nl/kids/videos/classic/creative-storytelling-the-little-puppy-aa24f27c7d5242bc86102ebdc0f24cba',
42 'id': 'aa24f27c-7d52-42bc-8610-2ebdc0f24cba_nl-NL',
44 'title': 'De kleine puppy',
45 'description': 'md5:5b725471f849348ac73f2e12cfb4be06',
50 'url': r
're:^https://.+\.srt$',
55 'skip_download': True,
59 'Lowest': (64, 180, 320),
60 'Low': (64, 270, 480),
61 'Medium': (96, 360, 640),
62 'High': (128, 540, 960),
63 'Highest': (128, 720, 1280),
66 def _real_extract(self
, url
):
67 locale
, video_id
= re
.match(self
._VALID
_URL
, url
).groups()
68 countries
= [locale
.split('-')[1].upper()]
69 self
._initialize
_geo
_bypass
({
70 'countries': countries
,
74 item
= self
._download
_json
(
75 # https://contentfeed.services.lego.com/api/v2/item/[VIDEO_ID]?culture=[LOCALE]&contentType=Video
76 'https://services.slingshot.lego.com/mediaplayer/v2',
78 'videoId': '%s_%s' % (uuid
.UUID(video_id
), locale
),
79 }, headers
=self
.geo_verification_headers())
80 except ExtractorError
as e
:
81 if isinstance(e
.cause
, compat_HTTPError
) and e
.cause
.code
== 451:
82 self
.raise_geo_restricted(countries
=countries
)
86 video_id
= video
['Id']
87 title
= video
['Title']
89 q
= qualities(['Lowest', 'Low', 'Medium', 'High', 'Highest'])
91 for video_source
in item
.get('VideoFormats', []):
92 video_source_url
= video_source
.get('Url')
93 if not video_source_url
:
95 video_source_format
= video_source
.get('Format')
96 if video_source_format
== 'F4M':
97 formats
.extend(self
._extract
_f
4m
_formats
(
98 video_source_url
, video_id
,
99 f4m_id
=video_source_format
, fatal
=False))
100 elif video_source_format
== 'M3U8':
101 formats
.extend(self
._extract
_m
3u8_formats
(
102 video_source_url
, video_id
, 'mp4', 'm3u8_native',
103 m3u8_id
=video_source_format
, fatal
=False))
105 video_source_quality
= video_source
.get('Quality')
107 for v
in (video_source_format
, video_source_quality
):
111 'format_id': '-'.join(format_id
),
112 'quality': q(video_source_quality
),
113 'url': video_source_url
,
115 quality
= self
._QUALITIES
.get(video_source_quality
)
119 'height': quality
[1],
123 self
._sort
_formats
(formats
)
126 sub_file_id
= video
.get('SubFileId')
127 if sub_file_id
and sub_file_id
!= '00000000-0000-0000-0000-000000000000':
128 net_storage_path
= video
.get('NetstoragePath')
129 invariant_id
= video
.get('InvariantId')
130 video_file_id
= video
.get('VideoFileId')
131 video_version
= video
.get('VideoVersion')
132 if net_storage_path
and invariant_id
and video_file_id
and video_version
:
133 subtitles
.setdefault(locale
[:2], []).append({
134 'url': 'https://lc-mediaplayerns-live-s.legocdn.com/public/%s/%s_%s_%s_%s_sub.srt' % (net_storage_path
, invariant_id
, video_file_id
, locale
, video_version
),
140 'description': video
.get('Description'),
141 'thumbnail': video
.get('GeneratedCoverImage') or video
.get('GeneratedThumbnail'),
142 'duration': int_or_none(video
.get('Length')),
144 'subtitles': subtitles
,
145 'age_limit': int_or_none(video
.get('AgeFrom')),
146 'season': video
.get('SeasonTitle'),
147 'season_number': int_or_none(video
.get('Season')) or None,
148 'episode_number': int_or_none(video
.get('Episode')) or None,