]>
Commit | Line | Data |
---|---|---|
36163001 H |
1 | from .common import InfoExtractor |
2 | from ..utils import ( | |
3 | int_or_none, | |
4 | traverse_obj, | |
5 | unified_timestamp, | |
6 | url_or_none | |
7 | ) | |
8 | ||
9 | ||
10 | class YappyIE(InfoExtractor): | |
11 | _VALID_URL = r'https?://yappy\.media/video/(?P<id>\w+)' | |
12 | _TESTS = [{ | |
13 | 'url': 'https://yappy.media/video/47fea6d8586f48d1a0cf96a7342aabd2', | |
14 | 'info_dict': { | |
15 | 'id': '47fea6d8586f48d1a0cf96a7342aabd2', | |
16 | 'ext': 'mp4', | |
17 | 'title': 'Куда нажимать? Как снимать? Смотри видос и погнали!🤘🏻', | |
18 | 'timestamp': 1661893200, | |
19 | 'description': 'Куда нажимать? Как снимать? Смотри видос и погнали!🤘🏻', | |
20 | 'thumbnail': 'https://cdn-st.ritm.media/static/pic/thumbnails/0c7c4d73388f47848acaf540d2e2bb8c-thumbnail.jpg', | |
21 | 'upload_date': '20220830', | |
22 | 'view_count': int, | |
23 | 'like_count': int, | |
24 | 'uploader_id': '59a0c8c485e5410b9c43474bf4c6a373', | |
25 | 'categories': ['Образование и наука', 'Лайфхак', 'Технологии', 'Арт/искусство'], | |
26 | 'repost_count': int, | |
27 | 'uploader': 'YAPPY', | |
28 | } | |
29 | }, { | |
30 | 'url': 'https://yappy.media/video/3862451954ad4bd58ae2ccefddb0bd33', | |
31 | 'info_dict': { | |
32 | 'id': '3862451954ad4bd58ae2ccefddb0bd33', | |
33 | 'ext': 'mp4', | |
34 | 'title': 'Опиши свой характер 3 словами🙃\n#психология #дружба #отношения', | |
35 | 'timestamp': 1674726985, | |
36 | 'like_count': int, | |
37 | 'description': 'Опиши свой характер 3 словами🙃\n#психология #дружба #отношения', | |
38 | 'uploader_id': '6793ee3581974a3586fc01e157de6c99', | |
39 | 'view_count': int, | |
40 | 'repost_count': int, | |
41 | 'uploader': 'LENA SHTURMAN', | |
42 | 'upload_date': '20230126', | |
43 | 'thumbnail': 'https://cdn-st.ritm.media/static/pic/user_thumbnails/6e76bb4bbad640b6/9ec84c115b2b1967/1674716171.jpg', | |
44 | } | |
45 | }] | |
46 | ||
47 | def _real_extract(self, url): | |
48 | video_id = self._match_id(url) | |
49 | webpage = self._download_webpage(url, video_id) | |
50 | json_ld = self._search_json_ld(webpage, video_id) | |
51 | nextjs_data = self._search_nextjs_data(webpage, video_id) | |
52 | ||
53 | media_data = ( | |
54 | traverse_obj( | |
55 | nextjs_data, ('props', 'pageProps', ('data', 'OpenGraphParameters')), get_all=False) | |
56 | or self._download_json(f'https://yappy.media/api/video/{video_id}', video_id)) | |
57 | ||
58 | media_url = traverse_obj(media_data, ('link', {url_or_none})) or '' | |
59 | has_watermark = media_url.endswith('-wm.mp4') | |
60 | ||
61 | formats = [{ | |
62 | 'url': media_url, | |
63 | 'ext': 'mp4', | |
64 | 'format_note': 'Watermarked' if has_watermark else None, | |
65 | 'preference': -10 if has_watermark else None | |
66 | }] if media_url else [] | |
67 | ||
68 | if has_watermark: | |
69 | formats.append({ | |
70 | 'url': media_url.replace('-wm.mp4', '.mp4'), | |
71 | 'ext': 'mp4' | |
72 | }) | |
73 | ||
74 | audio_link = traverse_obj(media_data, ('audio', 'link')) | |
75 | if audio_link: | |
76 | formats.append({ | |
77 | 'url': audio_link, | |
78 | 'ext': 'mp3', | |
79 | 'acodec': 'mp3', | |
80 | 'vcodec': 'none' | |
81 | }) | |
82 | ||
83 | return { | |
84 | 'id': video_id, | |
85 | 'title': (json_ld.get('description') or self._html_search_meta(['og:title'], webpage) | |
86 | or self._html_extract_title(webpage)), | |
87 | 'formats': formats, | |
88 | 'thumbnail': (media_data.get('thumbnail') | |
89 | or self._html_search_meta(['og:image', 'og:image:secure_url'], webpage)), | |
90 | 'description': (media_data.get('description') or json_ld.get('description') | |
91 | or self._html_search_meta(['description', 'og:description'], webpage)), | |
92 | 'timestamp': unified_timestamp(media_data.get('publishedAt') or json_ld.get('timestamp')), | |
93 | 'view_count': int_or_none(media_data.get('viewsCount') or json_ld.get('view_count')), | |
94 | 'like_count': int_or_none(media_data.get('likesCount')), | |
95 | 'uploader': traverse_obj(media_data, ('creator', 'firstName')), | |
96 | 'uploader_id': traverse_obj(media_data, ('creator', ('uuid', 'nickname')), get_all=False), | |
97 | 'categories': traverse_obj(media_data, ('categories', ..., 'name')) or None, | |
98 | 'repost_count': int_or_none(media_data.get('sharingCount')) | |
99 | } |