3 from .common
import InfoExtractor
11 class CrowdBunkerIE(InfoExtractor
):
12 _VALID_URL
= r
'https?://(?:www\.)?crowdbunker\.com/v/(?P<id>[^/?#$&]+)'
15 'url': 'https://crowdbunker.com/v/0z4Kms8pi8I',
19 'title': '117) Pass vax et solutions',
20 'description': 'md5:86bcb422c29475dbd2b5dcfa6ec3749c',
23 'uploader': 'Jérémie Mercier',
24 'uploader_id': 'UCeN_qQV829NYf0pvPJhW5dQ',
26 'upload_date': '20211218',
27 'thumbnail': 'https://scw.divulg.org/cb-medias4/images/0z4Kms8pi8I/maxres.jpg'
29 'params': {'skip_download': True}
32 def _real_extract(self
, url
):
33 id = self
._match
_id
(url
)
34 data_json
= self
._download
_json
(f
'https://api.divulg.org/post/{id}/details',
35 id, headers
={'accept': 'application/json, text/plain, */*'}
)
36 video_json
= data_json
['video']
37 formats
, subtitles
= [], {}
38 for sub
in video_json
.get('captions') or []:
39 sub_url
= try_get(sub
, lambda x
: x
['file']['url'])
42 subtitles
.setdefault(sub
.get('languageCode', 'fr'), []).append({
46 mpd_url
= try_get(video_json
, lambda x
: x
['dashManifest']['url'])
48 fmts
, subs
= self
._extract
_mpd
_formats
_and
_subtitles
(mpd_url
, id)
50 subtitles
= self
._merge
_subtitles
(subtitles
, subs
)
51 m3u8_url
= try_get(video_json
, lambda x
: x
['hlsManifest']['url'])
53 fmts
, subs
= self
._extract
_m
3u8_formats
_and
_subtitles
(mpd_url
, id)
55 subtitles
= self
._merge
_subtitles
(subtitles
, subs
)
59 'height': int_or_none(image
.get('height')),
60 'width': int_or_none(image
.get('width')),
61 } for image
in video_json
.get('thumbnails') or [] if image
.get('url')]
65 'title': video_json
.get('title'),
66 'description': video_json
.get('description'),
67 'view_count': video_json
.get('viewCount'),
68 'duration': video_json
.get('duration'),
69 'uploader': try_get(data_json
, lambda x
: x
['channel']['name']),
70 'uploader_id': try_get(data_json
, lambda x
: x
['channel']['id']),
71 'like_count': data_json
.get('likesCount'),
72 'upload_date': unified_strdate(video_json
.get('publishedAt') or video_json
.get('createdAt')),
73 'thumbnails': thumbnails
,
75 'subtitles': subtitles
,
79 class CrowdBunkerChannelIE(InfoExtractor
):
80 _VALID_URL
= r
'https?://(?:www\.)?crowdbunker\.com/@(?P<id>[^/?#$&]+)'
83 'url': 'https://crowdbunker.com/@Milan_UHRIN',
84 'playlist_mincount': 14,
90 def _entries(self
, id):
93 for page
in itertools
.count():
94 channel_json
= self
._download
_json
(
95 f
'https://api.divulg.org/organization/{id}/posts', id, headers
={'accept': 'application/json, text/plain, */*'}
,
96 query
={'after': last}
if last
else {}, note=f'Downloading Page {page}
')
97 for item in channel_json.get('items
') or []:
98 v_id = item.get('uid
')
101 yield self.url_result(
102 'https
://crowdbunker
.com
/v
/%s' % v_id, ie=CrowdBunkerIE.ie_key(), video_id=v_id)
103 last = channel_json.get('last
')
107 def _real_extract(self, url):
108 id = self._match_id(url)
109 return self.playlist_result(self._entries(id), playlist_id=id)