|  | @@ -211,13 +211,13 @@ class NRKIE(NRKBaseIE):
 | 
	
		
			
				|  |  |      _TESTS = [{
 | 
	
		
			
				|  |  |          # video
 | 
	
		
			
				|  |  |          'url': 'http://www.nrk.no/video/PS*150533',
 | 
	
		
			
				|  |  | -        'md5': '2f7f6eeb2aacdd99885f355428715cfa',
 | 
	
		
			
				|  |  | +        'md5': '706f34cdf1322577589e369e522b50ef',
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
		
			
				|  |  |              'id': '150533',
 | 
	
		
			
				|  |  |              'ext': 'mp4',
 | 
	
		
			
				|  |  |              'title': 'Dompap og andre fugler i Piip-Show',
 | 
	
		
			
				|  |  |              'description': 'md5:d9261ba34c43b61c812cb6b0269a5c8f',
 | 
	
		
			
				|  |  | -            'duration': 263,
 | 
	
		
			
				|  |  | +            'duration': 262,
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }, {
 | 
	
		
			
				|  |  |          # audio
 | 
	
	
		
			
				|  | @@ -256,14 +256,14 @@ class NRKTVIE(NRKBaseIE):
 | 
	
		
			
				|  |  |      _API_HOSTS = ('psapi-ne.nrk.no', 'psapi-we.nrk.no')
 | 
	
		
			
				|  |  |      _TESTS = [{
 | 
	
		
			
				|  |  |          'url': 'https://tv.nrk.no/serie/20-spoersmaal-tv/MUHH48000314/23-05-2014',
 | 
	
		
			
				|  |  | -        'md5': '4e9ca6629f09e588ed240fb11619922a',
 | 
	
		
			
				|  |  | +        'md5': '9a167e54d04671eb6317a37b7bc8a280',
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
		
			
				|  |  |              'id': 'MUHH48000314AA',
 | 
	
		
			
				|  |  |              'ext': 'mp4',
 | 
	
		
			
				|  |  |              'title': '20 spørsmål 23.05.2014',
 | 
	
		
			
				|  |  |              'description': 'md5:bdea103bc35494c143c6a9acdd84887a',
 | 
	
		
			
				|  |  |              'duration': 1741,
 | 
	
		
			
				|  |  | -            'series': '20 spørsmål - TV',
 | 
	
		
			
				|  |  | +            'series': '20 spørsmål',
 | 
	
		
			
				|  |  |              'episode': '23.05.2014',
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |      }, {
 | 
	
	
		
			
				|  | @@ -301,7 +301,7 @@ class NRKTVIE(NRKBaseIE):
 | 
	
		
			
				|  |  |                  'id': 'MSPO40010515AH',
 | 
	
		
			
				|  |  |                  'ext': 'mp4',
 | 
	
		
			
				|  |  |                  'title': 'Sprint fri teknikk, kvinner og menn 06.01.2015 (Part 1)',
 | 
	
		
			
				|  |  | -                'description': 'md5:c03aba1e917561eface5214020551b7a',
 | 
	
		
			
				|  |  | +                'description': 'md5:1f97a41f05a9486ee00c56f35f82993d',
 | 
	
		
			
				|  |  |                  'duration': 772,
 | 
	
		
			
				|  |  |                  'series': 'Tour de Ski',
 | 
	
		
			
				|  |  |                  'episode': '06.01.2015',
 | 
	
	
		
			
				|  | @@ -314,7 +314,7 @@ class NRKTVIE(NRKBaseIE):
 | 
	
		
			
				|  |  |                  'id': 'MSPO40010515BH',
 | 
	
		
			
				|  |  |                  'ext': 'mp4',
 | 
	
		
			
				|  |  |                  'title': 'Sprint fri teknikk, kvinner og menn 06.01.2015 (Part 2)',
 | 
	
		
			
				|  |  | -                'description': 'md5:c03aba1e917561eface5214020551b7a',
 | 
	
		
			
				|  |  | +                'description': 'md5:1f97a41f05a9486ee00c56f35f82993d',
 | 
	
		
			
				|  |  |                  'duration': 6175,
 | 
	
		
			
				|  |  |                  'series': 'Tour de Ski',
 | 
	
		
			
				|  |  |                  'episode': '06.01.2015',
 | 
	
	
		
			
				|  | @@ -326,7 +326,7 @@ class NRKTVIE(NRKBaseIE):
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
		
			
				|  |  |              'id': 'MSPO40010515',
 | 
	
		
			
				|  |  |              'title': 'Sprint fri teknikk, kvinner og menn 06.01.2015',
 | 
	
		
			
				|  |  | -            'description': 'md5:c03aba1e917561eface5214020551b7a',
 | 
	
		
			
				|  |  | +            'description': 'md5:1f97a41f05a9486ee00c56f35f82993d',
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          'expected_warnings': ['Video is geo restricted'],
 | 
	
		
			
				|  |  |      }, {
 | 
	
	
		
			
				|  | @@ -406,21 +406,35 @@ class NRKTVSerieBaseIE(InfoExtractor):
 | 
	
		
			
				|  |  |      def _extract_series(self, webpage, display_id, fatal=True):
 | 
	
		
			
				|  |  |          config = self._parse_json(
 | 
	
		
			
				|  |  |              self._search_regex(
 | 
	
		
			
				|  |  | -                r'({.+?})\s*,\s*"[^"]+"\s*\)\s*</script>', webpage, 'config',
 | 
	
		
			
				|  |  | -                default='{}' if not fatal else NO_DEFAULT),
 | 
	
		
			
				|  |  | +                (r'INITIAL_DATA_*\s*=\s*({.+?})\s*;',
 | 
	
		
			
				|  |  | +                 r'({.+?})\s*,\s*"[^"]+"\s*\)\s*</script>'),
 | 
	
		
			
				|  |  | +                webpage, 'config', default='{}' if not fatal else NO_DEFAULT),
 | 
	
		
			
				|  |  |              display_id, fatal=False)
 | 
	
		
			
				|  |  |          if not config:
 | 
	
		
			
				|  |  |              return
 | 
	
		
			
				|  |  | -        return try_get(config, lambda x: x['series'], dict)
 | 
	
		
			
				|  |  | +        return try_get(
 | 
	
		
			
				|  |  | +            config,
 | 
	
		
			
				|  |  | +            (lambda x: x['initialState']['series'], lambda x: x['series']),
 | 
	
		
			
				|  |  | +            dict)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _extract_seasons(self, seasons):
 | 
	
		
			
				|  |  | +        if not isinstance(seasons, list):
 | 
	
		
			
				|  |  | +            return []
 | 
	
		
			
				|  |  | +        entries = []
 | 
	
		
			
				|  |  | +        for season in seasons:
 | 
	
		
			
				|  |  | +            entries.extend(self._extract_episodes(season))
 | 
	
		
			
				|  |  | +        return entries
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _extract_episodes(self, season):
 | 
	
		
			
				|  |  | -        entries = []
 | 
	
		
			
				|  |  |          if not isinstance(season, dict):
 | 
	
		
			
				|  |  | -            return entries
 | 
	
		
			
				|  |  | -        episodes = season.get('episodes')
 | 
	
		
			
				|  |  | -        if not isinstance(episodes, list):
 | 
	
		
			
				|  |  | -            return entries
 | 
	
		
			
				|  |  | -        for episode in episodes:
 | 
	
		
			
				|  |  | +            return []
 | 
	
		
			
				|  |  | +        return self._extract_entries(season.get('episodes'))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _extract_entries(self, entry_list):
 | 
	
		
			
				|  |  | +        if not isinstance(entry_list, list):
 | 
	
		
			
				|  |  | +            return []
 | 
	
		
			
				|  |  | +        entries = []
 | 
	
		
			
				|  |  | +        for episode in entry_list:
 | 
	
		
			
				|  |  |              nrk_id = episode.get('prfId')
 | 
	
		
			
				|  |  |              if not nrk_id or not isinstance(nrk_id, compat_str):
 | 
	
		
			
				|  |  |                  continue
 | 
	
	
		
			
				|  | @@ -465,7 +479,7 @@ class NRKTVSeriesIE(NRKTVSerieBaseIE):
 | 
	
		
			
				|  |  |      _VALID_URL = r'https?://(?:tv|radio)\.nrk(?:super)?\.no/serie/(?P<id>[^/]+)'
 | 
	
		
			
				|  |  |      _ITEM_RE = r'(?:data-season=["\']|id=["\']season-)(?P<id>\d+)'
 | 
	
		
			
				|  |  |      _TESTS = [{
 | 
	
		
			
				|  |  | -        # new layout
 | 
	
		
			
				|  |  | +        # new layout, seasons
 | 
	
		
			
				|  |  |          'url': 'https://tv.nrk.no/serie/backstage',
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
		
			
				|  |  |              'id': 'backstage',
 | 
	
	
		
			
				|  | @@ -474,20 +488,21 @@ class NRKTVSeriesIE(NRKTVSerieBaseIE):
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          'playlist_mincount': 60,
 | 
	
		
			
				|  |  |      }, {
 | 
	
		
			
				|  |  | -        # old layout
 | 
	
		
			
				|  |  | +        # new layout, instalments
 | 
	
		
			
				|  |  |          'url': 'https://tv.nrk.no/serie/groenn-glede',
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
		
			
				|  |  |              'id': 'groenn-glede',
 | 
	
		
			
				|  |  |              'title': 'Grønn glede',
 | 
	
		
			
				|  |  |              'description': 'md5:7576e92ae7f65da6993cf90ee29e4608',
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | -        'playlist_mincount': 9,
 | 
	
		
			
				|  |  | +        'playlist_mincount': 10,
 | 
	
		
			
				|  |  |      }, {
 | 
	
		
			
				|  |  | -        'url': 'http://tv.nrksuper.no/serie/labyrint',
 | 
	
		
			
				|  |  | +        # old layout
 | 
	
		
			
				|  |  | +        'url': 'https://tv.nrksuper.no/serie/labyrint',
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
		
			
				|  |  |              'id': 'labyrint',
 | 
	
		
			
				|  |  |              'title': 'Labyrint',
 | 
	
		
			
				|  |  | -            'description': 'md5:58afd450974c89e27d5a19212eee7115',
 | 
	
		
			
				|  |  | +            'description': 'md5:318b597330fdac5959247c9b69fdb1ec',
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          'playlist_mincount': 3,
 | 
	
		
			
				|  |  |      }, {
 | 
	
	
		
			
				|  | @@ -520,11 +535,11 @@ class NRKTVSeriesIE(NRKTVSerieBaseIE):
 | 
	
		
			
				|  |  |              description = try_get(
 | 
	
		
			
				|  |  |                  series, lambda x: x['titles']['subtitle'], compat_str)
 | 
	
		
			
				|  |  |              entries = []
 | 
	
		
			
				|  |  | -            for season in series['seasons']:
 | 
	
		
			
				|  |  | -                entries.extend(self._extract_episodes(season))
 | 
	
		
			
				|  |  | +            entries.extend(self._extract_seasons(series.get('seasons')))
 | 
	
		
			
				|  |  | +            entries.extend(self._extract_entries(series.get('instalments')))
 | 
	
		
			
				|  |  |              return self.playlist_result(entries, series_id, title, description)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        # Old layout (e.g. https://tv.nrk.no/serie/groenn-glede)
 | 
	
		
			
				|  |  | +        # Old layout (e.g. https://tv.nrksuper.no/serie/labyrint)
 | 
	
		
			
				|  |  |          entries = [
 | 
	
		
			
				|  |  |              self.url_result(
 | 
	
		
			
				|  |  |                  'https://tv.nrk.no/program/Episodes/{series}/{season}'.format(
 | 
	
	
		
			
				|  | @@ -536,6 +551,9 @@ class NRKTVSeriesIE(NRKTVSerieBaseIE):
 | 
	
		
			
				|  |  |              'seriestitle', webpage,
 | 
	
		
			
				|  |  |              'title', default=None) or self._og_search_title(
 | 
	
		
			
				|  |  |              webpage, fatal=False)
 | 
	
		
			
				|  |  | +        if title:
 | 
	
		
			
				|  |  | +            title = self._search_regex(
 | 
	
		
			
				|  |  | +                r'NRK (?:Super )?TV\s*[-–]\s*(.+)', title, 'title', default=title)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          description = self._html_search_meta(
 | 
	
		
			
				|  |  |              'series_description', webpage,
 | 
	
	
		
			
				|  | @@ -596,7 +614,7 @@ class NRKPlaylistIE(NRKPlaylistBaseIE):
 | 
	
		
			
				|  |  |              'title': 'Rivertonprisen til Karin Fossum',
 | 
	
		
			
				|  |  |              'description': 'Første kvinne på 15 år til å vinne krimlitteraturprisen.',
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | -        'playlist_count': 5,
 | 
	
		
			
				|  |  | +        'playlist_count': 2,
 | 
	
		
			
				|  |  |      }]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _extract_title(self, webpage):
 |