[nrktv] Add support for new episode URL schema (closes #16909)
authorSergey M․ <dstftw@gmail.com>
Mon, 9 Jul 2018 16:44:05 +0000 (23:44 +0700)
committerSergey M․ <dstftw@gmail.com>
Mon, 9 Jul 2018 16:44:05 +0000 (23:44 +0700)
youtube_dl/extractor/extractors.py
youtube_dl/extractor/nrk.py

index ed532d77f751ad8802d14bd25de01e5204b9405c..a20712d34a04cae3292fbedc91608e535d467dbe 100644 (file)
@@ -768,6 +768,7 @@ from .nrk import (
     NRKSkoleIE,
     NRKTVIE,
     NRKTVDirekteIE,
+    NRKTVEpisodeIE,
     NRKTVEpisodesIE,
     NRKTVSeriesIE,
 )
index 7157e2390909dec9667ac0d563dbe88627249d34..50dd07d1125a6f05bea2d06dd7034f6ee22e38e2 100644 (file)
@@ -8,6 +8,7 @@ from ..compat import compat_urllib_parse_unquote
 from ..utils import (
     ExtractorError,
     int_or_none,
+    JSON_LD_RE,
     parse_age_limit,
     parse_duration,
 )
@@ -359,6 +360,40 @@ class NRKTVIE(NRKBaseIE):
     }]
 
 
+class NRKTVEpisodeIE(InfoExtractor):
+    _VALID_URL = r'https?://tv\.nrk\.no/serie/(?P<id>[^/]+/sesong/\d+/episode/\d+)'
+    _TEST = {
+        'url': 'https://tv.nrk.no/serie/backstage/sesong/1/episode/8',
+        'info_dict': {
+            'id': 'MSUI14000816AA',
+            'ext': 'mp4',
+            'title': 'Backstage 8:30',
+            'description': 'md5:de6ca5d5a2d56849e4021f2bf2850df4',
+            'duration': 1320,
+            'series': 'Backstage',
+            'season_number': 1,
+            'episode_number': 8,
+            'episode': '8:30',
+        },
+        'params': {
+            'skip_download': True,
+        },
+    }
+
+    def _real_extract(self, url):
+        display_id = self._match_id(url)
+
+        webpage = self._download_webpage(url, display_id)
+
+        nrk_id = self._parse_json(
+            self._search_regex(JSON_LD_RE, webpage, 'JSON-LD', group='json_ld'),
+            display_id)['@id']
+
+        assert re.match(NRKTVIE._EPISODE_RE, nrk_id)
+        return self.url_result(
+            'nrk:%s' % nrk_id, ie=NRKIE.ie_key(), video_id=nrk_id)
+
+
 class NRKTVDirekteIE(NRKTVIE):
     IE_DESC = 'NRK TV Direkte and NRK Radio Direkte'
     _VALID_URL = r'https?://(?:tv|radio)\.nrk\.no/direkte/(?P<id>[^/?#&]+)'
@@ -470,7 +505,8 @@ class NRKTVSeriesIE(InfoExtractor):
 
     @classmethod
     def suitable(cls, url):
-        return False if NRKTVIE.suitable(url) else super(NRKTVSeriesIE, cls).suitable(url)
+        return (False if NRKTVIE.suitable(url) or NRKTVEpisodeIE.suitable(url)
+                else super(NRKTVSeriesIE, cls).suitable(url))
 
     def _real_extract(self, url):
         series_id = self._match_id(url)