]> jfr.im git - yt-dlp.git/blame - yt_dlp/extractor/nick.py
Ensure `mergeall` selects best format when multistreams are disabled
[yt-dlp.git] / yt_dlp / extractor / nick.py
CommitLineData
a0e5beb0 1# coding: utf-8
2from __future__ import unicode_literals
3
9c82bba0
S
4import re
5
a0e5beb0 6from .mtv import MTVServicesInfoExtractor
f0118760 7from ..utils import update_url_query
a0e5beb0 8
9
10class NickIE(MTVServicesInfoExtractor):
11 IE_NAME = 'nick.com'
f3b737ed 12 _VALID_URL = r'https?://(?P<domain>(?:www\.)?nick(?:jr)?\.com)/(?:[^/]+/)?(?P<type>videos/clip|[^/]+/videos|episodes/[^/]+)/(?P<id>[^/?#.]+)'
a0e5beb0 13 _FEED_URL = 'http://udat.mtvnservices.com/service1/dispatch.htm'
f0e31e32 14 _GEO_COUNTRIES = ['US']
a0e5beb0 15 _TESTS = [{
f3b737ed
HD
16 'url': 'https://www.nick.com/episodes/sq47rw/spongebob-squarepants-a-place-for-pets-lockdown-for-love-season-13-ep-1',
17 'info_dict': {
18 'description': 'md5:0650a9eb88955609d5c1d1c79292e234',
19 'title': 'A Place for Pets/Lockdown for Love',
20 },
a0e5beb0 21 'playlist': [
22 {
f3b737ed 23 'md5': 'cb8a2afeafb7ae154aca5a64815ec9d6',
a0e5beb0 24 'info_dict': {
f3b737ed 25 'id': '85ee8177-d6ce-48f8-9eee-a65364f8a6df',
a0e5beb0 26 'ext': 'mp4',
f3b737ed
HD
27 'title': 'SpongeBob SquarePants: "A Place for Pets/Lockdown for Love" S1',
28 'description': 'A Place for Pets/Lockdown for Love: When customers bring pets into the Krusty Krab, Mr. Krabs realizes pets are more profitable than owners. Plankton ruins another date with Karen, so she puts the Chum Bucket on lockdown until he proves his affection.',
a0e5beb0 29
30 }
31 },
32 {
f3b737ed 33 'md5': '839a04f49900a1fcbf517020d94e0737',
a0e5beb0 34 'info_dict': {
f3b737ed 35 'id': '2e2a9960-8fd4-411d-868b-28eb1beb7fae',
a0e5beb0 36 'ext': 'mp4',
f3b737ed
HD
37 'title': 'SpongeBob SquarePants: "A Place for Pets/Lockdown for Love" S2',
38 'description': 'A Place for Pets/Lockdown for Love: When customers bring pets into the Krusty Krab, Mr. Krabs realizes pets are more profitable than owners. Plankton ruins another date with Karen, so she puts the Chum Bucket on lockdown until he proves his affection.',
a0e5beb0 39
40 }
41 },
42 {
f3b737ed 43 'md5': 'f1145699f199770e2919ee8646955d46',
a0e5beb0 44 'info_dict': {
f3b737ed 45 'id': 'dc91c304-6876-40f7-84a6-7aece7baa9d0',
a0e5beb0 46 'ext': 'mp4',
f3b737ed
HD
47 'title': 'SpongeBob SquarePants: "A Place for Pets/Lockdown for Love" S3',
48 'description': 'A Place for Pets/Lockdown for Love: When customers bring pets into the Krusty Krab, Mr. Krabs realizes pets are more profitable than owners. Plankton ruins another date with Karen, so she puts the Chum Bucket on lockdown until he proves his affection.',
49
a0e5beb0 50 }
51 },
52 {
f3b737ed 53 'md5': 'd463116875aee2585ee58de3b12caebd',
a0e5beb0 54 'info_dict': {
f3b737ed 55 'id': '5d929486-cf4c-42a1-889a-6e0d183a101a',
a0e5beb0 56 'ext': 'mp4',
f3b737ed
HD
57 'title': 'SpongeBob SquarePants: "A Place for Pets/Lockdown for Love" S4',
58 'description': 'A Place for Pets/Lockdown for Love: When customers bring pets into the Krusty Krab, Mr. Krabs realizes pets are more profitable than owners. Plankton ruins another date with Karen, so she puts the Chum Bucket on lockdown until he proves his affection.',
59
a0e5beb0 60 }
61 },
62 ],
0ab7f4fe 63 }, {
f3b737ed
HD
64 'url': 'http://www.nickjr.com/blues-clues-and-you/videos/blues-clues-and-you-original-209-imagination-station/',
65 'info_dict': {
66 'id': '31631529-2fc5-430b-b2ef-6a74b4609abd',
67 'ext': 'mp4',
68 'description': 'md5:9d65a66df38e02254852794b2809d1cf',
69 'title': 'Blue\'s Imagination Station',
70 },
a0e5beb0 71 }]
72
73 def _get_feed_query(self, uri):
0c75abbb 74 return {
a0e5beb0 75 'feed': 'nick_arc_player_prime',
e565cf60 76 'mgid': uri,
0c75abbb 77 }
a0e5beb0 78
f3b737ed
HD
79 def _extract_mgid(self, webpage):
80 mgid = self._search_regex(r'"media":{"video":{"config":{"uri":"(mgid:.*?)"', webpage, 'mgid', default=None)
81 return mgid
82
5868079e 83 def _real_extract(self, url):
f3b737ed
HD
84 domain, video_type, display_id = re.match(self._VALID_URL, url).groups()
85 if video_type.startswith("episodes"):
86 return super()._real_extract(url)
5868079e
RA
87 video_data = self._download_json(
88 'http://%s/data/video.endLevel.json' % domain,
89 display_id, query={
90 'urlKey': display_id,
91 })
92 return self._get_videos_info(video_data['player'] + video_data['id'])
f0118760
S
93
94
127e98d3 95class NickBrIE(MTVServicesInfoExtractor):
08d77a95 96 IE_NAME = 'nickelodeon:br'
d65a48a0
S
97 _VALID_URL = r'''(?x)
98 https?://
99 (?:
100 (?P<domain>(?:www\.)?nickjr|mundonick\.uol)\.com\.br|
d7da1e37
PD
101 (?:www\.)?nickjr\.[a-z]{2}|
102 (?:www\.)?nickelodeonjunior\.fr
d65a48a0
S
103 )
104 /(?:programas/)?[^/]+/videos/(?:episodios/)?(?P<id>[^/?\#.]+)
105 '''
08d77a95
RA
106 _TESTS = [{
107 'url': 'http://www.nickjr.com.br/patrulha-canina/videos/210-labirinto-de-pipoca/',
108 'only_matching': True,
109 }, {
110 'url': 'http://mundonick.uol.com.br/programas/the-loud-house/videos/muitas-irmas/7ljo9j',
111 'only_matching': True,
d65a48a0
S
112 }, {
113 'url': 'http://www.nickjr.nl/paw-patrol/videos/311-ge-wol-dig-om-terug-te-zijn/',
114 'only_matching': True,
1344d3e1
S
115 }, {
116 'url': 'http://www.nickjr.de/blaze-und-die-monster-maschinen/videos/f6caaf8f-e4e8-4cc1-b489-9380d6dcd059/',
117 'only_matching': True,
d7da1e37
PD
118 }, {
119 'url': 'http://www.nickelodeonjunior.fr/paw-patrol-la-pat-patrouille/videos/episode-401-entier-paw-patrol/',
120 'only_matching': True,
08d77a95
RA
121 }]
122
123 def _real_extract(self, url):
124 domain, display_id = re.match(self._VALID_URL, url).groups()
125 webpage = self._download_webpage(url, display_id)
126 uri = self._search_regex(
127 r'data-(?:contenturi|mgid)="([^"]+)', webpage, 'mgid')
128 video_id = self._id_from_uri(uri)
129 config = self._download_json(
130 'http://media.mtvnservices.com/pmt/e1/access/index.html',
131 video_id, query={
132 'uri': uri,
133 'configtype': 'edge',
134 }, headers={
135 'Referer': url,
136 })
137 info_url = self._remove_template_parameter(config['feedWithQueryParams'])
138 if info_url == 'None':
139 if domain.startswith('www.'):
140 domain = domain[4:]
141 content_domain = {
142 'mundonick.uol': 'mundonick.com.br',
143 'nickjr': 'br.nickelodeonjunior.tv',
144 }[domain]
145 query = {
146 'mgid': uri,
147 'imageEp': content_domain,
148 'arcEp': content_domain,
149 }
150 if domain == 'nickjr.com.br':
151 query['ep'] = 'c4b16088'
152 info_url = update_url_query(
153 'http://feeds.mtvnservices.com/od/feed/intl-mrss-player-feed', query)
154 return self._get_videos_info_from_url(info_url, video_id)
155
156
f0118760
S
157class NickDeIE(MTVServicesInfoExtractor):
158 IE_NAME = 'nick.de'
f03ee0b3 159 _VALID_URL = r'https?://(?:www\.)?(?P<host>nick\.(?:de|com\.pl|ch)|nickelodeon\.(?:nl|be|at|dk|no|se))/[^/]+/(?:[^/]+/)*(?P<id>[^/?#&]+)'
f0118760
S
160 _TESTS = [{
161 'url': 'http://www.nick.de/playlist/3773-top-videos/videos/episode/17306-zu-wasser-und-zu-land-rauchende-erdnusse',
162 'only_matching': True,
163 }, {
164 'url': 'http://www.nick.de/shows/342-icarly',
165 'only_matching': True,
f3eeaacb
S
166 }, {
167 'url': 'http://www.nickelodeon.nl/shows/474-spongebob/videos/17403-een-kijkje-in-de-keuken-met-sandy-van-binnenuit',
168 'only_matching': True,
9c82bba0
S
169 }, {
170 'url': 'http://www.nickelodeon.at/playlist/3773-top-videos/videos/episode/77993-das-letzte-gefecht',
171 'only_matching': True,
dee04d24
S
172 }, {
173 'url': 'http://www.nick.com.pl/seriale/474-spongebob-kanciastoporty/wideo/17412-teatr-to-jest-to-rodeo-oszolom',
174 'only_matching': True,
3ebbd999
AS
175 }, {
176 'url': 'http://www.nickelodeon.no/program/2626-bulderhuset/videoer/90947-femteklasse-veronica-vs-vanzilla',
177 'only_matching': True,
178 }, {
179 'url': 'http://www.nickelodeon.dk/serier/2626-hojs-hus/videoer/761-tissepause',
180 'only_matching': True,
181 }, {
182 'url': 'http://www.nickelodeon.se/serier/2626-lugn-i-stormen/videos/998-',
183 'only_matching': True,
cf6bda31
S
184 }, {
185 'url': 'http://www.nick.ch/shows/2304-adventure-time-abenteuerzeit-mit-finn-und-jake',
186 'only_matching': True,
f03ee0b3
S
187 }, {
188 'url': 'http://www.nickelodeon.be/afspeellijst/4530-top-videos/videos/episode/73917-inval-broodschapper-lariekoek-arie',
189 'only_matching': True,
f0118760
S
190 }]
191
51707d9a
U
192 def _get_feed_url(self, uri, url=None):
193 video_id = self._id_from_uri(uri)
194 config = self._download_json(
195 'http://media.mtvnservices.com/pmt/e1/access/index.html?uri=%s&configtype=edge&ref=%s' % (uri, url), video_id)
196 return self._remove_template_parameter(config['feedWithQueryParams'])
e3577722
N
197
198
f449c061
S
199class NickNightIE(NickDeIE):
200 IE_NAME = 'nicknight'
201 _VALID_URL = r'https?://(?:www\.)(?P<host>nicknight\.(?:de|at|tv))/(?:playlist|shows)/(?:[^/]+/)*(?P<id>[^/?#&]+)'
e3577722
N
202 _TESTS = [{
203 'url': 'http://www.nicknight.at/shows/977-awkward/videos/85987-nimmer-beste-freunde',
204 'only_matching': True,
205 }, {
206 'url': 'http://www.nicknight.at/shows/977-awkward',
207 'only_matching': True,
208 }, {
209 'url': 'http://www.nicknight.at/shows/1900-faking-it',
210 'only_matching': True,
211 }]
212
f449c061
S
213 def _extract_mrss_url(self, webpage, *args):
214 return self._search_regex(
215 r'mrss\s*:\s*(["\'])(?P<url>http.+?)\1', webpage,
216 'mrss url', group='url')
c99d6890
S
217
218
219class NickRuIE(MTVServicesInfoExtractor):
220 IE_NAME = 'nickelodeonru'
266fbd6b 221 _VALID_URL = r'https?://(?:www\.)nickelodeon\.(?:ru|fr|es|pt|ro|hu|com\.tr)/[^/]+/(?:[^/]+/)*(?P<id>[^/?#&]+)'
c99d6890
S
222 _TESTS = [{
223 'url': 'http://www.nickelodeon.ru/shows/henrydanger/videos/episodes/3-sezon-15-seriya-licenziya-na-polyot/pmomfb#playlist/7airc6',
224 'only_matching': True,
225 }, {
226 'url': 'http://www.nickelodeon.ru/videos/smotri-na-nickelodeon-v-iyule/g9hvh7',
227 'only_matching': True,
9ff6273c
S
228 }, {
229 'url': 'http://www.nickelodeon.fr/programmes/bob-l-eponge/videos/le-marathon-de-booh-kini-bottom-mardi-31-octobre/nfn7z0',
230 'only_matching': True,
231 }, {
232 'url': 'http://www.nickelodeon.es/videos/nickelodeon-consejos-tortitas/f7w7xy',
233 'only_matching': True,
234 }, {
235 'url': 'http://www.nickelodeon.pt/series/spongebob-squarepants/videos/a-bolha-de-tinta-gigante/xutq1b',
236 'only_matching': True,
237 }, {
238 'url': 'http://www.nickelodeon.ro/emisiuni/shimmer-si-shine/video/nahal-din-bomboane/uw5u2k',
239 'only_matching': True,
240 }, {
241 'url': 'http://www.nickelodeon.hu/musorok/spongyabob-kockanadrag/videok/episodes/buborekfujas-az-elszakadt-nadrag/q57iob#playlist/k6te4y',
242 'only_matching': True,
266fbd6b
S
243 }, {
244 'url': 'http://www.nickelodeon.com.tr/programlar/sunger-bob/videolar/kayip-yatak/mgqbjy',
245 'only_matching': True,
c99d6890
S
246 }]
247
248 def _real_extract(self, url):
249 video_id = self._match_id(url)
250 webpage = self._download_webpage(url, video_id)
cf7cb942 251 mgid = self._extract_mgid(webpage, url)
c99d6890 252 return self.url_result('http://media.mtvnservices.com/embed/%s' % mgid)