[ie/wrestleuniverse:vod] Fix extractor (#16685)

Closes #13818
Authored by: Sec-Wayne, tewhalen, 0xvd, bashonly

Co-authored-by: tewhalen <6964120+tewhalen@users.noreply.github.com>
Co-authored-by: bashonly <88596187+bashonly@users.noreply.github.com>
This commit is contained in:
Wayne 2026-07-02 05:55:14 +01:00 committed by GitHub
parent 16bdcc525e
commit 498e51f5da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -6,6 +6,7 @@ import uuid
from .common import InfoExtractor from .common import InfoExtractor
from ..dependencies import Cryptodome from ..dependencies import Cryptodome
from ..networking.exceptions import HTTPError
from ..utils import ( from ..utils import (
ExtractorError, ExtractorError,
int_or_none, int_or_none,
@ -155,15 +156,35 @@ class WrestleUniverseBaseIE(InfoExtractor):
def _get_formats(self, data, path, video_id=None): def _get_formats(self, data, path, video_id=None):
hls_url = traverse_obj(data, path, get_all=False) hls_url = traverse_obj(data, path, get_all=False)
if not hls_url and not data.get('canWatch'): if not hls_url:
self.raise_no_formats( if not data.get('canWatch'):
'This account does not have access to the requested content', expected=True) self.raise_no_formats(
elif not hls_url: 'This account does not have access to the requested content', expected=True)
self.raise_no_formats('No supported formats found') else:
self.raise_no_formats('No supported formats found')
return []
return self._extract_m3u8_formats(hls_url, video_id, 'mp4', m3u8_id='hls', live=True) return self._extract_m3u8_formats(hls_url, video_id, 'mp4', m3u8_id='hls', live=True)
def _extract_hls_aes_info(self, video_data, decrypt):
if decrypt is None:
return {}
hls_aes_key = traverse_obj(video_data, ('hls', 'key', {decrypt}))
if hls_aes_key:
return {
'hls_aes': {
'key': hls_aes_key,
'iv': traverse_obj(video_data, ('hls', 'iv', {decrypt})),
},
}
elif traverse_obj(video_data, ('hls', 'encryptType', {int})):
self.report_warning('HLS AES-128 key was not found in API response')
return {}
class WrestleUniverseVODIE(WrestleUniverseBaseIE): class WrestleUniverseVODIE(WrestleUniverseBaseIE):
IE_NAME = 'wrestleuniverse:vod'
_VALID_URL = WrestleUniverseBaseIE._VALID_URL_TMPL % 'videos' _VALID_URL = WrestleUniverseBaseIE._VALID_URL_TMPL % 'videos'
_TESTS = [{ _TESTS = [{
'url': 'https://www.wrestle-universe.com/en/videos/dp8mpjmcKfxzUhEHM2uFws', 'url': 'https://www.wrestle-universe.com/en/videos/dp8mpjmcKfxzUhEHM2uFws',
@ -191,11 +212,19 @@ class WrestleUniverseVODIE(WrestleUniverseBaseIE):
def _real_extract(self, url): def _real_extract(self, url):
lang, video_id = self._match_valid_url(url).group('lang', 'id') lang, video_id = self._match_valid_url(url).group('lang', 'id')
metadata = self._download_metadata(url, video_id, lang, 'videoEpisodeFallbackData') metadata = self._download_metadata(url, video_id, lang, 'videoEpisodeFallbackData')
video_data = self._call_api(video_id, ':watch', 'watch', data={'deviceId': self._DEVICE_ID}) decrypt = None
try:
video_data = self._call_api(video_id, ':watch', 'watch', data={'deviceId': self._DEVICE_ID})
except ExtractorError as error:
if not isinstance(error.cause, HTTPError) or error.cause.status != 400:
raise
video_data, decrypt = self._call_encrypted_api(video_id, ':watch', 'watch', data={'method': 1})
return { return {
'id': video_id, 'id': video_id,
'formats': self._get_formats(video_data, ('protocolHls', 'url', {url_or_none}), video_id), 'formats': self._get_formats(video_data, ('protocolHls', 'url', {url_or_none}), video_id),
**self._extract_hls_aes_info(video_data, decrypt),
**traverse_obj(metadata, { **traverse_obj(metadata, {
'title': ('displayName', {str}), 'title': ('displayName', {str}),
'description': ('description', {str}), 'description': ('description', {str}),
@ -205,7 +234,7 @@ class WrestleUniverseVODIE(WrestleUniverseBaseIE):
'thumbnail': ('keyVisualUrl', {url_or_none}), 'thumbnail': ('keyVisualUrl', {url_or_none}),
'cast': ('casts', ..., 'displayName', {str}), 'cast': ('casts', ..., 'displayName', {str}),
'duration': ('duration', {int}), 'duration': ('duration', {int}),
'chapters': ('videoChapters', lambda _, v: isinstance(v.get('start'), int), { 'chapters': ('videoChapters', lambda _, v: isinstance(v['start'], int), {
'title': ('displayName', {str}), 'title': ('displayName', {str}),
'start_time': ('start', {int}), 'start_time': ('start', {int}),
'end_time': ('end', {int}), 'end_time': ('end', {int}),
@ -215,6 +244,7 @@ class WrestleUniverseVODIE(WrestleUniverseBaseIE):
class WrestleUniversePPVIE(WrestleUniverseBaseIE): class WrestleUniversePPVIE(WrestleUniverseBaseIE):
IE_NAME = 'wrestleuniverse:ppv'
_VALID_URL = WrestleUniverseBaseIE._VALID_URL_TMPL % 'lives' _VALID_URL = WrestleUniverseBaseIE._VALID_URL_TMPL % 'lives'
_TESTS = [{ _TESTS = [{
'note': 'HLS AES-128 key obtained via API', 'note': 'HLS AES-128 key obtained via API',
@ -300,13 +330,6 @@ class WrestleUniversePPVIE(WrestleUniverseBaseIE):
if not f['format_id'].startswith(url_basename(f['manifest_url']).partition('.')[0]): if not f['format_id'].startswith(url_basename(f['manifest_url']).partition('.')[0]):
f['preference'] = -10 f['preference'] = -10
hls_aes_key = traverse_obj(video_data, ('hls', 'key', {decrypt})) info.update(self._extract_hls_aes_info(video_data, decrypt))
if hls_aes_key:
info['hls_aes'] = {
'key': hls_aes_key,
'iv': traverse_obj(video_data, ('hls', 'iv', {decrypt})),
}
elif traverse_obj(video_data, ('hls', 'encryptType', {int})):
self.report_warning('HLS AES-128 key was not found in API response')
return info return info