]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/extractor/nerdcubed.py
[ie/NerdCubedFeed] Overhaul extractor (#9269)
[yt-dlp.git] / yt_dlp / extractor / nerdcubed.py
index 7c801b5d38b45403a50fd64a31bcc1759f62a5c4..5f5607a20b25fdcf2c82889b83ef9b24e598edca 100644 (file)
@@ -1,33 +1,38 @@
-import datetime
-
 from .common import InfoExtractor
+from .youtube import YoutubeIE
+from ..utils import parse_iso8601, url_or_none
+from ..utils.traversal import traverse_obj
 
 
 class NerdCubedFeedIE(InfoExtractor):
-    _VALID_URL = r'https?://(?:www\.)?nerdcubed\.co\.uk/feed\.json'
+    _VALID_URL = r'https?://(?:www\.)?nerdcubed\.co\.uk/?(?:$|[#?])'
     _TEST = {
-        'url': 'http://www.nerdcubed.co.uk/feed.json',
+        'url': 'http://www.nerdcubed.co.uk/',
         'info_dict': {
             'id': 'nerdcubed-feed',
             'title': 'nerdcubed.co.uk feed',
         },
-        'playlist_mincount': 1300,
+        'playlist_mincount': 5500,
     }
 
-    def _real_extract(self, url):
-        feed = self._download_json(url, url, 'Downloading NerdCubed JSON feed')
+    def _extract_video(self, feed_entry):
+        return self.url_result(
+            f'https://www.youtube.com/watch?v={feed_entry["id"]}', YoutubeIE,
+            **traverse_obj(feed_entry, {
+                'id': ('id', {str}),
+                'title': ('title', {str}),
+                'description': ('description', {str}),
+                'timestamp': ('publishedAt', {parse_iso8601}),
+                'channel': ('source', 'name', {str}),
+                'channel_id': ('source', 'id', {str}),
+                'channel_url': ('source', 'url', {str}),
+                'thumbnail': ('thumbnail', 'source', {url_or_none}),
+            }), url_transparent=True)
 
-        entries = [{
-            '_type': 'url',
-            'title': feed_entry['title'],
-            'uploader': feed_entry['source']['name'] if feed_entry['source'] else None,
-            'upload_date': datetime.datetime.strptime(feed_entry['date'], '%Y-%m-%d').strftime('%Y%m%d'),
-            'url': 'http://www.youtube.com/watch?v=' + feed_entry['youtube_id'],
-        } for feed_entry in feed]
+    def _real_extract(self, url):
+        video_id = 'nerdcubed-feed'
+        feed = self._download_json('https://www.nerdcubed.co.uk/_/cdn/videos.json', video_id)
 
-        return {
-            '_type': 'playlist',
-            'title': 'nerdcubed.co.uk feed',
-            'id': 'nerdcubed-feed',
-            'entries': entries,
-        }
+        return self.playlist_result(
+            map(self._extract_video, traverse_obj(feed, ('videos', lambda _, v: v['id']))),
+            video_id, 'nerdcubed.co.uk feed')