summaryrefslogtreecommitdiffstats
path: root/yt_dlp/extractor/cellebrite.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--yt_dlp/extractor/cellebrite.py71
1 files changed, 29 insertions, 42 deletions
diff --git a/yt_dlp/extractor/cellebrite.py b/yt_dlp/extractor/cellebrite.py
index e90365a..54367c4 100644
--- a/yt_dlp/extractor/cellebrite.py
+++ b/yt_dlp/extractor/cellebrite.py
@@ -1,63 +1,50 @@
-from .common import InfoExtractor
-from ..utils import traverse_obj
+from .vidyard import VidyardBaseIE, VidyardIE
+from ..utils import ExtractorError, make_archive_id, url_basename
-class CellebriteIE(InfoExtractor):
+class CellebriteIE(VidyardBaseIE):
_VALID_URL = r'https?://cellebrite\.com/(?:\w+)?/(?P<id>[\w-]+)'
_TESTS = [{
'url': 'https://cellebrite.com/en/collect-data-from-android-devices-with-cellebrite-ufed/',
'info_dict': {
- 'id': '16025876',
+ 'id': 'ZqmUss3dQfEMGpauambPuH',
+ 'display_id': '16025876',
'ext': 'mp4',
- 'description': 'md5:174571cb97083fd1d457d75c684f4e2b',
- 'thumbnail': 'https://cellebrite.com/wp-content/uploads/2021/05/Chat-Capture-1024x559.png',
'title': 'Ask the Expert: Chat Capture - Collect Data from Android Devices in Cellebrite UFED',
- 'duration': 455,
- 'tags': [],
+ 'description': 'md5:dee48fe12bbae5c01fe6a053f7676da4',
+ 'thumbnail': 'https://cellebrite.com/wp-content/uploads/2021/05/Chat-Capture-1024x559.png',
+ 'duration': 455.979,
+ '_old_archive_ids': ['cellebrite 16025876'],
},
}, {
'url': 'https://cellebrite.com/en/how-to-lawfully-collect-the-maximum-amount-of-data-from-android-devices/',
'info_dict': {
- 'id': '29018255',
+ 'id': 'QV1U8a2yzcxigw7VFnqKyg',
+ 'display_id': '29018255',
'ext': 'mp4',
- 'duration': 134,
- 'tags': [],
- 'description': 'md5:e9a3d124c7287b0b07bad2547061cacf',
+ 'title': 'How to Lawfully Collect the Maximum Amount of Data From Android Devices',
+ 'description': 'md5:0e943a9ac14c374d5d74faed634d773c',
'thumbnail': 'https://cellebrite.com/wp-content/uploads/2022/07/How-to-Lawfully-Collect-the-Maximum-Amount-of-Data-From-Android-Devices.png',
- 'title': 'Android Extractions Explained',
+ 'duration': 134.315,
+ '_old_archive_ids': ['cellebrite 29018255'],
},
}]
- def _get_formats_and_subtitles(self, json_data, display_id):
- formats = [{'url': url} for url in traverse_obj(json_data, ('mp4', ..., 'url')) or []]
- subtitles = {}
-
- for url in traverse_obj(json_data, ('hls', ..., 'url')) or []:
- fmt, sub = self._extract_m3u8_formats_and_subtitles(
- url, display_id, ext='mp4', headers={'Referer': 'https://play.vidyard.com/'})
- formats.extend(fmt)
- self._merge_subtitles(sub, target=subtitles)
-
- return formats, subtitles
-
def _real_extract(self, url):
- display_id = self._match_id(url)
- webpage = self._download_webpage(url, display_id)
-
- player_uuid = self._search_regex(
- r'<img\s[^>]*\bdata-uuid\s*=\s*"([^"\?]+)', webpage, 'player UUID')
- json_data = self._download_json(
- f'https://play.vidyard.com/player/{player_uuid}.json', display_id)['payload']['chapters'][0]
+ slug = self._match_id(url)
+ webpage = self._download_webpage(url, slug)
+ vidyard_url = next(VidyardIE._extract_embed_urls(url, webpage), None)
+ if not vidyard_url:
+ raise ExtractorError('No Vidyard video embeds found on page')
+
+ video_id = url_basename(vidyard_url)
+ info = self._process_video_json(self._fetch_video_json(video_id)['chapters'][0], video_id)
+ if info.get('display_id'):
+ info['_old_archive_ids'] = [make_archive_id(self, info['display_id'])]
+ if thumbnail := self._og_search_thumbnail(webpage, default=None):
+ info.setdefault('thumbnails', []).append({'url': thumbnail})
- formats, subtitles = self._get_formats_and_subtitles(json_data['sources'], display_id)
return {
- 'id': str(json_data['videoId']),
- 'title': json_data.get('name') or self._og_search_title(webpage),
- 'formats': formats,
- 'subtitles': subtitles,
- 'description': json_data.get('description') or self._og_search_description(webpage),
- 'duration': json_data.get('seconds'),
- 'tags': json_data.get('tags'),
- 'thumbnail': self._og_search_thumbnail(webpage),
- 'http_headers': {'Referer': 'https://play.vidyard.com/'},
+ 'description': self._og_search_description(webpage, default=None),
+ **info,
}