]>
Commit | Line | Data |
---|---|---|
143a2cca | 1 | from .common import InfoExtractor |
2 | from ..utils import parse_iso8601, traverse_obj, try_call | |
3 | ||
4 | ||
5 | class PrankCastIE(InfoExtractor): | |
6 | _VALID_URL = r'https?://(?:www\.)?prankcast\.com/[^/?#]+/showreel/(?P<id>\d+)-(?P<display_id>[^/?#]+)' | |
7 | _TESTS = [{ | |
8 | 'url': 'https://prankcast.com/Devonanustart/showreel/1561-Beverly-is-back-like-a-heart-attack-', | |
9 | 'info_dict': { | |
10 | 'id': '1561', | |
11 | 'ext': 'mp3', | |
12 | 'title': 'Beverly is back like a heart attack!', | |
13 | 'display_id': 'Beverly-is-back-like-a-heart-attack-', | |
14 | 'timestamp': 1661391575, | |
15 | 'uploader': 'Devonanustart', | |
16 | 'channel_id': 4, | |
17 | 'duration': 7918, | |
18 | 'cast': ['Devonanustart', 'Phonelosers'], | |
19 | 'description': '', | |
20 | 'categories': ['prank'], | |
ed4cc4ea | 21 | 'tags': ['prank call', 'prank', 'live show'], |
143a2cca | 22 | 'upload_date': '20220825' |
23 | } | |
d5d1df8a | 24 | }, { |
25 | 'url': 'https://prankcast.com/phonelosers/showreel/2048-NOT-COOL', | |
26 | 'info_dict': { | |
27 | 'id': '2048', | |
28 | 'ext': 'mp3', | |
29 | 'title': 'NOT COOL', | |
30 | 'display_id': 'NOT-COOL', | |
31 | 'timestamp': 1665028364, | |
32 | 'uploader': 'phonelosers', | |
33 | 'channel_id': 6, | |
34 | 'duration': 4044, | |
35 | 'cast': ['phonelosers'], | |
36 | 'description': '', | |
37 | 'categories': ['prank'], | |
ed4cc4ea | 38 | 'tags': ['prank call', 'prank', 'live show'], |
d5d1df8a | 39 | 'upload_date': '20221006' |
40 | } | |
143a2cca | 41 | }] |
42 | ||
43 | def _real_extract(self, url): | |
44 | video_id, display_id = self._match_valid_url(url).group('id', 'display_id') | |
45 | ||
46 | webpage = self._download_webpage(url, video_id) | |
47 | json_info = self._search_nextjs_data(webpage, video_id)['props']['pageProps']['ssr_data_showreel'] | |
48 | ||
49 | uploader = json_info.get('user_name') | |
50 | guests_json = self._parse_json(json_info.get('guests_json') or '{}', video_id) | |
51 | start_date = parse_iso8601(json_info.get('start_date')) | |
52 | ||
53 | return { | |
54 | 'id': video_id, | |
55 | 'title': json_info.get('broadcast_title') or self._og_search_title(webpage), | |
56 | 'display_id': display_id, | |
57 | 'url': f'{json_info["broadcast_url"]}{json_info["recording_hash"]}.mp3', | |
58 | 'timestamp': start_date, | |
59 | 'uploader': uploader, | |
60 | 'channel_id': json_info.get('user_id'), | |
61 | 'duration': try_call(lambda: parse_iso8601(json_info['end_date']) - start_date), | |
62 | 'cast': list(filter(None, [uploader] + traverse_obj(guests_json, (..., 'name')))), | |
63 | 'description': json_info.get('broadcast_description'), | |
64 | 'categories': [json_info.get('broadcast_category')], | |
ed4cc4ea | 65 | 'tags': try_call(lambda: json_info['broadcast_tags'].split(',')) |
143a2cca | 66 | } |