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