]> jfr.im git - yt-dlp.git/commitdiff
[extractor/npr] Use stream url from json-ld (#3455)
authorsiddharth ravikumar <redacted>
Fri, 3 Jun 2022 00:51:11 +0000 (20:51 -0400)
committerGitHub <redacted>
Fri, 3 Jun 2022 00:51:11 +0000 (17:51 -0700)
Closes #1934
Authored by: r5d

yt_dlp/extractor/common.py
yt_dlp/extractor/npr.py

index d88d5e6f945c905b06cc43cf2d541c5f8efb2dce..71e982f023e91315144592e10e43c033cfec8240 100644 (file)
@@ -1461,7 +1461,7 @@ def extract_video_object(e):
             assert e['@type'] == 'VideoObject'
             author = e.get('author')
             info.update({
-                'url': url_or_none(e.get('contentUrl')),
+                'url': traverse_obj(e, 'contentUrl', 'embedUrl', expected_type=url_or_none),
                 'title': unescapeHTML(e.get('name')),
                 'description': unescapeHTML(e.get('description')),
                 'thumbnails': [{'url': url}
@@ -1529,6 +1529,8 @@ def traverse_json_ld(json_ld, at_top_level=True):
                     })
                     if traverse_obj(e, ('video', 0, '@type')) == 'VideoObject':
                         extract_video_object(e['video'][0])
+                    elif traverse_obj(e, ('subjectOf', 0, '@type')) == 'VideoObject':
+                        extract_video_object(e['subjectOf'][0])
                 elif item_type == 'VideoObject':
                     extract_video_object(e)
                     if expected_type is None:
index 6d93f154c0fd7e44f2e36c169d975ad67847dd7b..e4ff8d6c22c7d09805c80c1af392444339d73caa 100644 (file)
@@ -51,6 +51,15 @@ class NprIE(InfoExtractor):
         # multimedia, no formats, stream
         'url': 'https://www.npr.org/2020/02/14/805476846/laura-stevenson-tiny-desk-concert',
         'only_matching': True,
+    }, {
+        'url': 'https://www.npr.org/2022/03/15/1084896560/bonobo-tiny-desk-home-concert',
+        'info_dict': {
+            'id': '1086468851',
+            'ext': 'mp4',
+            'title': 'Bonobo: Tiny Desk (Home) Concert',
+            'duration': 1061,
+            'thumbnail': r're:^https?://media.npr.org/assets/img/.*\.jpg$',
+        },
     }]
 
     def _real_extract(self, url):
@@ -65,6 +74,10 @@ def _real_extract(self, url):
             })['list']['story'][0]
         playlist_title = story.get('title', {}).get('$text')
 
+        # Fetch the JSON-LD from the npr page.
+        json_ld = self._search_json_ld(
+            self._download_webpage(url, playlist_id), playlist_id, 'NewsArticle', fatal=False)
+
         KNOWN_FORMATS = ('threegp', 'm3u8', 'smil', 'mp4', 'mp3')
         quality = qualities(KNOWN_FORMATS)
 
@@ -110,6 +123,10 @@ def _real_extract(self, url):
                 formats.extend(self._extract_m3u8_formats(
                     stream_url, stream_id, 'mp4', 'm3u8_native',
                     m3u8_id='hls', fatal=False))
+
+            if not formats and json_ld.get('url'):
+                formats.extend(self._extract_m3u8_formats(json_ld['url'], media_id, 'mp4', m3u8_id='hls', fatal=False))
+
             self._sort_formats(formats)
 
             entries.append({