| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  | # encoding: utf-8 | 
					
						
							|  |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  | from ..compat import compat_urllib_parse_unquote | 
					
						
							| 
									
										
										
										
											2014-05-25 07:14:18 +07:00
										 |  |  | from ..utils import ( | 
					
						
							|  |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |     int_or_none, | 
					
						
							|  |  |  |     parse_age_limit, | 
					
						
							| 
									
										
										
										
											2015-01-10 17:46:01 +01:00
										 |  |  |     parse_duration, | 
					
						
							| 
									
										
										
										
											2014-05-25 07:14:18 +07:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  | class NRKBaseIE(InfoExtractor): | 
					
						
							|  |  |  |     def _extract_formats(self, manifest_url, video_id, fatal=True): | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |         formats = [] | 
					
						
							|  |  |  |         formats.extend(self._extract_f4m_formats( | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |             manifest_url + '?hdcore=3.5.0&plugin=aasp-3.5.0.151.81', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |             video_id, f4m_id='hds', fatal=fatal)) | 
					
						
							|  |  |  |         formats.extend(self._extract_m3u8_formats(manifest_url.replace( | 
					
						
							|  |  |  |             'akamaihd.net/z/', 'akamaihd.net/i/').replace('/manifest.f4m', '/master.m3u8'), | 
					
						
							|  |  |  |             video_id, 'mp4', 'm3u8_native', m3u8_id='hls', fatal=fatal)) | 
					
						
							|  |  |  |         return formats | 
					
						
							| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2015-03-21 18:20:49 +06:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         data = self._download_json( | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |             'http://%s/mediaelement/%s' % (self._API_HOST, video_id), | 
					
						
							|  |  |  |             video_id, 'Downloading mediaelement JSON') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         title = data.get('fullTitle') or data.get('mainTitle') or data['title'] | 
					
						
							|  |  |  |         video_id = data.get('id') or video_id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         entries = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         media_assets = data.get('mediaAssets') | 
					
						
							|  |  |  |         if media_assets and isinstance(media_assets, list): | 
					
						
							|  |  |  |             def video_id_and_title(idx): | 
					
						
							|  |  |  |                 return ((video_id, title) if len(media_assets) == 1 | 
					
						
							|  |  |  |                         else ('%s-%d' % (video_id, idx), '%s (Part %d)' % (title, idx))) | 
					
						
							|  |  |  |             for num, asset in enumerate(media_assets, 1): | 
					
						
							|  |  |  |                 asset_url = asset.get('url') | 
					
						
							|  |  |  |                 if not asset_url: | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 formats = self._extract_formats(asset_url, video_id, fatal=False) | 
					
						
							|  |  |  |                 if not formats: | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 self._sort_formats(formats) | 
					
						
							|  |  |  |                 entry_id, entry_title = video_id_and_title(num) | 
					
						
							|  |  |  |                 duration = parse_duration(asset.get('duration')) | 
					
						
							|  |  |  |                 subtitles = {} | 
					
						
							|  |  |  |                 for subtitle in ('webVtt', 'timedText'): | 
					
						
							|  |  |  |                     subtitle_url = asset.get('%sSubtitlesUrl' % subtitle) | 
					
						
							|  |  |  |                     if subtitle_url: | 
					
						
							| 
									
										
										
										
											2016-05-21 05:09:16 +06:00
										 |  |  |                         subtitles.setdefault('no', []).append({ | 
					
						
							|  |  |  |                             'url': compat_urllib_parse_unquote(subtitle_url) | 
					
						
							|  |  |  |                         }) | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |                 entries.append({ | 
					
						
							|  |  |  |                     'id': asset.get('carrierId') or entry_id, | 
					
						
							|  |  |  |                     'title': entry_title, | 
					
						
							|  |  |  |                     'duration': duration, | 
					
						
							|  |  |  |                     'subtitles': subtitles, | 
					
						
							|  |  |  |                     'formats': formats, | 
					
						
							|  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         if not entries: | 
					
						
							|  |  |  |             media_url = data.get('mediaUrl') | 
					
						
							|  |  |  |             if media_url: | 
					
						
							|  |  |  |                 formats = self._extract_formats(media_url, video_id) | 
					
						
							|  |  |  |                 self._sort_formats(formats) | 
					
						
							|  |  |  |                 duration = parse_duration(data.get('duration')) | 
					
						
							|  |  |  |                 entries = [{ | 
					
						
							|  |  |  |                     'id': video_id, | 
					
						
							|  |  |  |                     'title': title, | 
					
						
							|  |  |  |                     'duration': duration, | 
					
						
							|  |  |  |                     'formats': formats, | 
					
						
							|  |  |  |                 }] | 
					
						
							| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         if not entries: | 
					
						
							|  |  |  |             if data.get('usageRights', {}).get('isGeoBlocked'): | 
					
						
							| 
									
										
										
										
											2015-12-01 18:35:24 +06:00
										 |  |  |                 raise ExtractorError( | 
					
						
							|  |  |  |                     'NRK har ikke rettigheter til å vise dette programmet utenfor Norge', | 
					
						
							|  |  |  |                     expected=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         conviva = data.get('convivaStatistics') or {} | 
					
						
							|  |  |  |         series = conviva.get('seriesName') or data.get('seriesTitle') | 
					
						
							|  |  |  |         episode = conviva.get('episodeName') or data.get('episodeNumberOrDate') | 
					
						
							| 
									
										
										
										
											2015-03-21 18:21:19 +06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         thumbnails = None | 
					
						
							| 
									
										
										
										
											2014-04-25 21:34:44 +07:00
										 |  |  |         images = data.get('images') | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         if images and isinstance(images, dict): | 
					
						
							|  |  |  |             web_images = images.get('webImages') | 
					
						
							|  |  |  |             if isinstance(web_images, list): | 
					
						
							|  |  |  |                 thumbnails = [{ | 
					
						
							|  |  |  |                     'url': image['imageUrl'], | 
					
						
							|  |  |  |                     'width': int_or_none(image.get('width')), | 
					
						
							|  |  |  |                     'height': int_or_none(image.get('height')), | 
					
						
							|  |  |  |                 } for image in web_images if image.get('imageUrl')] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         description = data.get('description') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_info = { | 
					
						
							|  |  |  |             'description': description, | 
					
						
							|  |  |  |             'series': series, | 
					
						
							|  |  |  |             'episode': episode, | 
					
						
							|  |  |  |             'age_limit': parse_age_limit(data.get('legalAge')), | 
					
						
							|  |  |  |             'thumbnails': thumbnails, | 
					
						
							| 
									
										
										
										
											2014-05-25 07:14:18 +07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         vcodec = 'none' if data.get('mediaType') == 'Audio' else None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # TODO: extract chapters when https://github.com/rg3/youtube-dl/pull/9409 is merged | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for entry in entries: | 
					
						
							|  |  |  |             entry.update(common_info) | 
					
						
							|  |  |  |             for f in entry['formats']: | 
					
						
							|  |  |  |                 f['vcodec'] = vcodec | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return self.playlist_result(entries, video_id, title, description) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class NRKIE(NRKBaseIE): | 
					
						
							|  |  |  |     _VALID_URL = r'(?:nrk:|https?://(?:www\.)?nrk\.no/video/PS\*)(?P<id>\d+)' | 
					
						
							|  |  |  |     _API_HOST = 'v8.psapi.nrk.no' | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |         # video | 
					
						
							|  |  |  |         'url': 'http://www.nrk.no/video/PS*150533', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |         'md5': '2f7f6eeb2aacdd99885f355428715cfa', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '150533', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |             'title': 'Dompap og andre fugler i Piip-Show', | 
					
						
							|  |  |  |             'description': 'md5:d9261ba34c43b61c812cb6b0269a5c8f', | 
					
						
							|  |  |  |             'duration': 263, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         # audio | 
					
						
							|  |  |  |         'url': 'http://www.nrk.no/video/PS*154915', | 
					
						
							|  |  |  |         # MD5 is unstable | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '154915', | 
					
						
							|  |  |  |             'ext': 'flv', | 
					
						
							|  |  |  |             'title': 'Slik høres internett ut når du er blind', | 
					
						
							|  |  |  |             'description': 'md5:a621f5cc1bd75c8d5104cb048c6b8568', | 
					
						
							|  |  |  |             'duration': 20, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class NRKTVIE(NRKBaseIE): | 
					
						
							|  |  |  |     IE_DESC = 'NRK TV and NRK Radio' | 
					
						
							|  |  |  |     _VALID_URL = r'https?://(?:tv|radio)\.nrk(?:super)?\.no/(?:serie/[^/]+|program)/(?P<id>[a-zA-Z]{4}\d{8})(?:/\d{2}-\d{2}-\d{4})?(?:#del=(?P<part_id>\d+))?' | 
					
						
							|  |  |  |     _API_HOST = 'psapi-we.nrk.no' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |         'url': 'https://tv.nrk.no/serie/20-spoersmaal-tv/MUHH48000314/23-05-2014', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |         'md5': '4e9ca6629f09e588ed240fb11619922a', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |             'id': 'MUHH48000314AA', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |             'title': '20 spørsmål 23.05.2014', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |             'description': 'md5:bdea103bc35494c143c6a9acdd84887a', | 
					
						
							| 
									
										
										
										
											2016-06-12 06:57:04 +07:00
										 |  |  |             'duration': 1741, | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         }, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'https://tv.nrk.no/program/mdfp15000514', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |         'md5': '43d0be26663d380603a9cf0c24366531', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |             'id': 'MDFP15000514CA', | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2016-05-13 08:05:28 +01:00
										 |  |  |             'title': 'Grunnlovsjubiléet - Stor ståhei for ingenting 24.05.2014', | 
					
						
							|  |  |  |             'description': 'md5:89290c5ccde1b3a24bb8050ab67fe1db', | 
					
						
							| 
									
										
										
										
											2016-06-12 06:57:04 +07:00
										 |  |  |             'duration': 4605, | 
					
						
							| 
									
										
										
										
											2016-05-13 02:07:12 +06:00
										 |  |  |         }, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         # single playlist video | 
					
						
							|  |  |  |         'url': 'https://tv.nrk.no/serie/tour-de-ski/MSPO40010515/06-01-2015#del=2', | 
					
						
							|  |  |  |         'md5': 'adbd1dbd813edaf532b0a253780719c2', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'MSPO40010515-part2', | 
					
						
							|  |  |  |             'ext': 'flv', | 
					
						
							|  |  |  |             'title': 'Tour de Ski: Sprint fri teknikk, kvinner og menn 06.01.2015 (del 2:2)', | 
					
						
							|  |  |  |             'description': 'md5:238b67b97a4ac7d7b4bf0edf8cc57d26', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'skip': 'Only works from Norway', | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'https://tv.nrk.no/serie/tour-de-ski/MSPO40010515/06-01-2015', | 
					
						
							|  |  |  |         'playlist': [{ | 
					
						
							|  |  |  |             'md5': '9480285eff92d64f06e02a5367970a7a', | 
					
						
							|  |  |  |             'info_dict': { | 
					
						
							|  |  |  |                 'id': 'MSPO40010515-part1', | 
					
						
							|  |  |  |                 'ext': 'flv', | 
					
						
							|  |  |  |                 'title': 'Tour de Ski: Sprint fri teknikk, kvinner og menn 06.01.2015 (del 1:2)', | 
					
						
							|  |  |  |                 'description': 'md5:238b67b97a4ac7d7b4bf0edf8cc57d26', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         }, { | 
					
						
							|  |  |  |             'md5': 'adbd1dbd813edaf532b0a253780719c2', | 
					
						
							|  |  |  |             'info_dict': { | 
					
						
							|  |  |  |                 'id': 'MSPO40010515-part2', | 
					
						
							|  |  |  |                 'ext': 'flv', | 
					
						
							|  |  |  |                 'title': 'Tour de Ski: Sprint fri teknikk, kvinner og menn 06.01.2015 (del 2:2)', | 
					
						
							|  |  |  |                 'description': 'md5:238b67b97a4ac7d7b4bf0edf8cc57d26', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         }], | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'MSPO40010515', | 
					
						
							|  |  |  |             'title': 'Tour de Ski: Sprint fri teknikk, kvinner og menn', | 
					
						
							|  |  |  |             'description': 'md5:238b67b97a4ac7d7b4bf0edf8cc57d26', | 
					
						
							|  |  |  |             'duration': 6947.52, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'skip': 'Only works from Norway', | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'https://radio.nrk.no/serie/dagsnytt/NPUB21019315/12-07-2015#', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-25 07:14:18 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 18:22:08 +06:00
										 |  |  | class NRKPlaylistIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?nrk\.no/(?!video|skole)(?:[^/]+/)+(?P<id>[^/]+)' | 
					
						
							| 
									
										
										
										
											2015-03-21 18:22:08 +06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 20:42:48 +06:00
										 |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2015-03-21 18:22:08 +06:00
										 |  |  |         'url': 'http://www.nrk.no/troms/gjenopplev-den-historiske-solformorkelsen-1.12270763', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'gjenopplev-den-historiske-solformorkelsen-1.12270763', | 
					
						
							|  |  |  |             'title': 'Gjenopplev den historiske solformørkelsen', | 
					
						
							|  |  |  |             'description': 'md5:c2df8ea3bac5654a26fc2834a542feed', | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-03-21 20:42:48 +06:00
										 |  |  |         'playlist_count': 2, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.nrk.no/kultur/bok/rivertonprisen-til-karin-fossum-1.12266449', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'rivertonprisen-til-karin-fossum-1.12266449', | 
					
						
							|  |  |  |             'title': 'Rivertonprisen til Karin Fossum', | 
					
						
							|  |  |  |             'description': 'Første kvinne på 15 år til å vinne krimlitteraturprisen.', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'playlist_count': 5, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2015-03-21 18:22:08 +06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         playlist_id = self._match_id(url) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         webpage = self._download_webpage(url, playlist_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         entries = [ | 
					
						
							|  |  |  |             self.url_result('nrk:%s' % video_id, 'NRK') | 
					
						
							|  |  |  |             for video_id in re.findall( | 
					
						
							| 
									
										
										
										
											2015-03-21 20:42:48 +06:00
										 |  |  |                 r'class="[^"]*\brich\b[^"]*"[^>]+data-video-id="([^"]+)"', | 
					
						
							|  |  |  |                 webpage) | 
					
						
							| 
									
										
										
										
											2015-03-21 18:22:08 +06:00
										 |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         playlist_title = self._og_search_title(webpage) | 
					
						
							|  |  |  |         playlist_description = self._og_search_description(webpage) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return self.playlist_result( | 
					
						
							|  |  |  |             entries, playlist_id, playlist_title, playlist_description) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  | class NRKSkoleIE(InfoExtractor): | 
					
						
							|  |  |  |     IE_DESC = 'NRK Skole' | 
					
						
							| 
									
										
										
										
											2016-06-12 07:20:37 +07:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?nrk\.no/skole/?\?.*\bmediaId=(?P<id>\d+)' | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2016-06-12 07:20:37 +07:00
										 |  |  |         'url': 'https://www.nrk.no/skole/?page=search&q=&mediaId=14099', | 
					
						
							|  |  |  |         'md5': '6bc936b01f9dd8ed45bc58b252b2d9b6', | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '6021', | 
					
						
							| 
									
										
										
										
											2016-06-12 07:20:37 +07:00
										 |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  |             'title': 'Genetikk og eneggede tvillinger', | 
					
						
							|  |  |  |             'description': 'md5:3aca25dcf38ec30f0363428d2b265f8d', | 
					
						
							|  |  |  |             'duration': 399, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, { | 
					
						
							| 
									
										
										
										
											2016-06-12 07:20:37 +07:00
										 |  |  |         'url': 'https://www.nrk.no/skole/?page=objectives&subject=naturfag&objective=K15114&mediaId=19355', | 
					
						
							| 
									
										
										
										
											2016-03-02 20:57:04 +06:00
										 |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  |     }] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2016-06-12 07:20:37 +07:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         webpage = self._download_webpage( | 
					
						
							|  |  |  |             'https://mimir.nrk.no/plugin/1.0/static?mediaId=%s' % video_id, | 
					
						
							|  |  |  |             video_id) | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 07:20:37 +07:00
										 |  |  |         nrk_id = self._parse_json( | 
					
						
							|  |  |  |             self._search_regex( | 
					
						
							|  |  |  |                 r'<script[^>]+type=["\']application/json["\'][^>]*>({.+?})</script>', | 
					
						
							|  |  |  |                 webpage, 'application json'), | 
					
						
							|  |  |  |             video_id)['activeMedia']['psId'] | 
					
						
							| 
									
										
										
										
											2016-03-02 20:52:06 +06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return self.url_result('nrk:%s' % nrk_id) |