|
|
@ -3,6 +3,44 @@ import itertools
|
|
|
|
from .common import InfoExtractor, SearchInfoExtractor
|
|
|
|
from .common import InfoExtractor, SearchInfoExtractor
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VMwareIE(InfoExtractor):
|
|
|
|
|
|
|
|
_VALID_URL = r'https?://(?:www\.)?vmware\.com/video/(?P<id>\d+)'
|
|
|
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
|
|
|
'url': 'https://www.vmware.com/video/6362484671112',
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
|
|
|
|
'id': '6362484671112',
|
|
|
|
|
|
|
|
'ext': 'mp4',
|
|
|
|
|
|
|
|
'title': 'GCI Communications',
|
|
|
|
|
|
|
|
'description': '',
|
|
|
|
|
|
|
|
'thumbnail': r're:^https?://.*/image\.jpg',
|
|
|
|
|
|
|
|
'tags': [],
|
|
|
|
|
|
|
|
'timestamp': 1727345356,
|
|
|
|
|
|
|
|
'upload_date': '20240926',
|
|
|
|
|
|
|
|
'uploader_id': '6415665063001',
|
|
|
|
|
|
|
|
'duration': 106.283,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
'url': 'https://www.vmware.com/video/6350300466112',
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
|
|
|
|
'id': '6350300466112',
|
|
|
|
|
|
|
|
'ext': 'mp4',
|
|
|
|
|
|
|
|
'title': 'VMware Private AI',
|
|
|
|
|
|
|
|
'description': r're:^Learn the significance of AI and Generative AI',
|
|
|
|
|
|
|
|
'thumbnail': r're:^https?://.*/image\.jpg',
|
|
|
|
|
|
|
|
'tags': 'count:8',
|
|
|
|
|
|
|
|
'timestamp': 1712293111,
|
|
|
|
|
|
|
|
'upload_date': '20240405',
|
|
|
|
|
|
|
|
'uploader_id': '6415665063001',
|
|
|
|
|
|
|
|
'duration': 3154.624,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
BRIGHTCOVE_URL_TEMPLATE = 'https://players.brightcove.net/6415665063001/83iWkhhmz_default/index.html?videoId=%s'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url):
|
|
|
|
|
|
|
|
video_id = self._match_id(url)
|
|
|
|
|
|
|
|
return self.url_result(self.BRIGHTCOVE_URL_TEMPLATE % video_id, url_transparent=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VMwareExploreIE(InfoExtractor):
|
|
|
|
class VMwareExploreIE(InfoExtractor):
|
|
|
|
_VALID_URL = r'https?://(?:www\.)?vmware\.com/explore/video-library/video/(?P<id>\d+)'
|
|
|
|
_VALID_URL = r'https?://(?:www\.)?vmware\.com/explore/video-library/video/(?P<id>\d+)'
|
|
|
|
_TESTS = [{
|
|
|
|
_TESTS = [{
|
|
|
@ -12,7 +50,7 @@ class VMwareExploreIE(InfoExtractor):
|
|
|
|
'ext': 'mp4',
|
|
|
|
'ext': 'mp4',
|
|
|
|
'title': 'VCFB1440LV',
|
|
|
|
'title': 'VCFB1440LV',
|
|
|
|
'description': r're:^All About vSphere 8: What\'s New in the Technology',
|
|
|
|
'description': r're:^All About vSphere 8: What\'s New in the Technology',
|
|
|
|
'thumbnail': 'https://cf-images.us-east-1.prod.boltdns.net/v1/static/6164421911001/cde65c5a-51ff-4a0c-905f-ed71e25c0f2c/80d7489b-7b65-47d9-b30c-8056b132892f/1920x1080/match/image.jpg',
|
|
|
|
'thumbnail': r're:^https?://.*/image\.jpg',
|
|
|
|
'tags': 'count:6',
|
|
|
|
'tags': 'count:6',
|
|
|
|
'timestamp': 1724585610,
|
|
|
|
'timestamp': 1724585610,
|
|
|
|
'upload_date': '20240825',
|
|
|
|
'upload_date': '20240825',
|
|
|
@ -26,7 +64,7 @@ class VMwareExploreIE(InfoExtractor):
|
|
|
|
'ext': 'mp4',
|
|
|
|
'ext': 'mp4',
|
|
|
|
'title': 'AODB1676LV',
|
|
|
|
'title': 'AODB1676LV',
|
|
|
|
'description': r're:^Automation, Analytics and Intelligence: Our Quest for Operational Excellence',
|
|
|
|
'description': r're:^Automation, Analytics and Intelligence: Our Quest for Operational Excellence',
|
|
|
|
'thumbnail': 'https://cf-images.us-east-1.prod.boltdns.net/v1/jit/6164421911001/56cc0c8e-9d51-4c25-9d97-4b7364989c47/main/1920x1080/14m18s858ms/match/image.jpg',
|
|
|
|
'thumbnail': r're:^https?://.*/image\.jpg',
|
|
|
|
'tags': 'count:6',
|
|
|
|
'tags': 'count:6',
|
|
|
|
'timestamp': 1724585574,
|
|
|
|
'timestamp': 1724585574,
|
|
|
|
'upload_date': '20240825',
|
|
|
|
'upload_date': '20240825',
|
|
|
@ -40,7 +78,7 @@ class VMwareExploreIE(InfoExtractor):
|
|
|
|
'ext': 'mp4',
|
|
|
|
'ext': 'mp4',
|
|
|
|
'title': 'ANSB1976LV',
|
|
|
|
'title': 'ANSB1976LV',
|
|
|
|
'description': r're:^The Conman of the Digital Era — Ransomware',
|
|
|
|
'description': r're:^The Conman of the Digital Era — Ransomware',
|
|
|
|
'thumbnail': 'https://cf-images.us-east-1.prod.boltdns.net/v1/jit/6164421911001/4ec22e41-7812-49d9-9fc8-5dbcf1ef4b3c/main/1920x1080/22m36s555ms/match/image.jpg',
|
|
|
|
'thumbnail': r're:^https?://.*/image\.jpg',
|
|
|
|
'tags': 'count:6',
|
|
|
|
'tags': 'count:6',
|
|
|
|
'timestamp': 1724585612,
|
|
|
|
'timestamp': 1724585612,
|
|
|
|
'upload_date': '20240825',
|
|
|
|
'upload_date': '20240825',
|
|
|
@ -55,46 +93,51 @@ class VMwareExploreIE(InfoExtractor):
|
|
|
|
return self.url_result(self.BRIGHTCOVE_URL_TEMPLATE % video_id, url_transparent=True)
|
|
|
|
return self.url_result(self.BRIGHTCOVE_URL_TEMPLATE % video_id, url_transparent=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VMwareExploreSearchIE(SearchInfoExtractor):
|
|
|
|
class VMwareSearchIE(SearchInfoExtractor):
|
|
|
|
IE_NAME = 'VMwareExplore:search'
|
|
|
|
IE_NAME = 'VMware:search'
|
|
|
|
_SEARCH_KEY = 'vmwaresearch'
|
|
|
|
_SEARCH_KEY = 'vmwaresearch'
|
|
|
|
_TESTS = [{
|
|
|
|
_TESTS = [{
|
|
|
|
'url': 'vmwaresearch10:*',
|
|
|
|
'url': 'vmwaresearch10:*',
|
|
|
|
'playlist_count': 10,
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
'info_dict': {
|
|
|
|
'id': '*',
|
|
|
|
'id': '*',
|
|
|
|
'title': '*',
|
|
|
|
'title': '*',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
'playlist_count': 10,
|
|
|
|
}, {
|
|
|
|
}, {
|
|
|
|
'url': 'vmwaresearchall:ransomware',
|
|
|
|
'url': 'vmwaresearchall:uptime',
|
|
|
|
'playlist_count': 15,
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
'info_dict': {
|
|
|
|
'id': 'ransomware',
|
|
|
|
'id': 'uptime',
|
|
|
|
'title': 'ransomware',
|
|
|
|
'title': 'uptime',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
'playlist_mincount': 5,
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
_URL_TEMPLATE = 'https://www.vmware.com/explore/video-library/video/%s'
|
|
|
|
_LIBRARY_MAP = {
|
|
|
|
|
|
|
|
'explore': ('VMware Explore Video Library', 'https://www.vmware.com/explore/video-library/video/%s'),
|
|
|
|
|
|
|
|
'vmware': ('VMware Video Library', 'https://www.vmware.com/video/%s'),
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _search_results(self, query):
|
|
|
|
def _search_results(self, query):
|
|
|
|
def search_query(query, offset, limit, total_count):
|
|
|
|
def search_query(query, offset, limit, account):
|
|
|
|
# search api:
|
|
|
|
# search api:
|
|
|
|
# https://www.vmware.com/api/nocache/tools/brightcove/search?q=%2B{query}%20%2Byear:2023:2024%20%20-vod_on_demand_publish:%22False%22%2Bcomplete:%22true%22%2Bstate:%22ACTIVE%22&limit=12&offset=0&sort=-updated_at&account=explore
|
|
|
|
# https://www.vmware.com/api/nocache/tools/brightcove/search?q=%2B{query}%20%2Byear:2023:2024%20%20-vod_on_demand_publish:%22False%22%2Bcomplete:%22true%22%2Bstate:%22ACTIVE%22&limit=12&offset=0&sort=-updated_at&account=explore
|
|
|
|
return self._download_json(
|
|
|
|
return self._download_json(
|
|
|
|
'https://www.vmware.com/api/nocache/tools/brightcove/search', query,
|
|
|
|
'https://www.vmware.com/api/nocache/tools/brightcove/search', query,
|
|
|
|
note=f'Downloading result {offset + 1}-{min(offset + limit, total_count or 99999999)}', query={
|
|
|
|
note=f'Searching videos in {self._LIBRARY_MAP[account][0]}', query={
|
|
|
|
'q': f'+{query} -vod_on_demand_publish:"False"+complete:"true"+state:"ACTIVE"',
|
|
|
|
'q': f'+{query} -vod_on_demand_publish:"False"+complete:"true"+state:"ACTIVE"',
|
|
|
|
'limit': limit,
|
|
|
|
'limit': limit,
|
|
|
|
'offset': offset,
|
|
|
|
'offset': offset,
|
|
|
|
'sort': 'updated_at', # chronological ascending order. For descending order: '-updated_at'
|
|
|
|
'sort': 'updated_at', # chronological ascending order. For descending order: '-updated_at'
|
|
|
|
'account': 'explore',
|
|
|
|
'account': account,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
limit, total_count = 100, None # limit: maximum 100
|
|
|
|
for account in ['explore', 'vmware']:
|
|
|
|
for i in itertools.count():
|
|
|
|
limit, total_count = 100, None # limit: maximum 100
|
|
|
|
search_results = search_query(query, i * limit, limit, total_count)
|
|
|
|
for i in itertools.count():
|
|
|
|
total_count = search_results.get('count', 0)
|
|
|
|
search_results = search_query(query, i * limit, limit, account)
|
|
|
|
for video in search_results.get('videos', []):
|
|
|
|
total_count = search_results.get('count', 0)
|
|
|
|
if video_id := video.get('id'):
|
|
|
|
for video in search_results.get('videos', []):
|
|
|
|
yield self.url_result(self._URL_TEMPLATE % video_id)
|
|
|
|
if video_id := video.get('id'):
|
|
|
|
if (i + 1) * limit >= total_count:
|
|
|
|
yield self.url_result(self._LIBRARY_MAP[account][1] % video_id)
|
|
|
|
break
|
|
|
|
if (i + 1) * limit >= total_count:
|
|
|
|
|
|
|
|
self.to_screen(f'{query}: {total_count} video(s) found')
|
|
|
|
|
|
|
|
break
|
|
|
|