]> jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/nerdcubed.py
[ie/NerdCubedFeed] Overhaul extractor (#9269)
[yt-dlp.git] / yt_dlp / extractor / nerdcubed.py
1 from .common import InfoExtractor
2 from .youtube import YoutubeIE
3 from ..utils import parse_iso8601, url_or_none
4 from ..utils.traversal import traverse_obj
5
6
7 class NerdCubedFeedIE(InfoExtractor):
8 _VALID_URL = r'https?://(?:www\.)?nerdcubed\.co\.uk/?(?:$|[#?])'
9 _TEST = {
10 'url': 'http://www.nerdcubed.co.uk/',
11 'info_dict': {
12 'id': 'nerdcubed-feed',
13 'title': 'nerdcubed.co.uk feed',
14 },
15 'playlist_mincount': 5500,
16 }
17
18 def _extract_video(self, feed_entry):
19 return self.url_result(
20 f'https://www.youtube.com/watch?v={feed_entry["id"]}', YoutubeIE,
21 **traverse_obj(feed_entry, {
22 'id': ('id', {str}),
23 'title': ('title', {str}),
24 'description': ('description', {str}),
25 'timestamp': ('publishedAt', {parse_iso8601}),
26 'channel': ('source', 'name', {str}),
27 'channel_id': ('source', 'id', {str}),
28 'channel_url': ('source', 'url', {str}),
29 'thumbnail': ('thumbnail', 'source', {url_or_none}),
30 }), url_transparent=True)
31
32 def _real_extract(self, url):
33 video_id = 'nerdcubed-feed'
34 feed = self._download_json('https://www.nerdcubed.co.uk/_/cdn/videos.json', video_id)
35
36 return self.playlist_result(
37 map(self._extract_video, traverse_obj(feed, ('videos', lambda _, v: v['id']))),
38 video_id, 'nerdcubed.co.uk feed')