|
|
@ -1,5 +1,5 @@
|
|
|
|
from .mtv import MTVServicesInfoExtractor
|
|
|
|
|
|
|
|
from ..utils import random_uuidv4, traverse_obj, ExtractorError
|
|
|
|
from ..utils import random_uuidv4, traverse_obj, ExtractorError
|
|
|
|
|
|
|
|
from .mtv import MTVServicesInfoExtractor
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SouthParkIE(MTVServicesInfoExtractor):
|
|
|
|
class SouthParkIE(MTVServicesInfoExtractor):
|
|
|
@ -107,10 +107,15 @@ class SouthParkDeIE(SouthParkIE): # XXX: Do not subclass from concrete IE
|
|
|
|
data = self._parse_json(self._search_regex(
|
|
|
|
data = self._parse_json(self._search_regex(
|
|
|
|
r'window\.__DATA__\s*=\s*({.+?});', webpage, 'data'), display_id)
|
|
|
|
r'window\.__DATA__\s*=\s*({.+?});', webpage, 'data'), display_id)
|
|
|
|
|
|
|
|
|
|
|
|
video_detail = traverse_obj(data, (
|
|
|
|
video_detail = traverse_obj(
|
|
|
|
'children', lambda _, v: v.get('type') == 'MainContainer',
|
|
|
|
data,
|
|
|
|
'children', 0, 'children', 0, 'props', 'videoDetail'
|
|
|
|
# Path for regular episodes
|
|
|
|
), ('children', 0, 'videoDetail'), get_all=False,)
|
|
|
|
('children', lambda _, v: v.get('type') == 'MainContainer',
|
|
|
|
|
|
|
|
'children', 0, 'children', 0, 'props', 'videoDetail'),
|
|
|
|
|
|
|
|
# Fallback path for special episodes
|
|
|
|
|
|
|
|
('children', 0, 'videoDetail'),
|
|
|
|
|
|
|
|
get_all=False,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if not video_detail:
|
|
|
|
if not video_detail:
|
|
|
|
raise ExtractorError('Could not find video data in page')
|
|
|
|
raise ExtractorError('Could not find video data in page')
|
|
|
|