3 from .common
import InfoExtractor
15 class CineverseBaseIE(InfoExtractor
):
16 _VALID_URL_BASE
= r
'https?://www\.(?P<host>{})'.format('|'.join(map(re
.escape
, (
27 class CineverseIE(CineverseBaseIE
):
28 _VALID_URL
= rf
'{CineverseBaseIE._VALID_URL_BASE}/watch/(?P<id>[A-Z0-9]+)'
30 'url': 'https://www.asiancrush.com/watch/DMR00018919/Women-Who-Flirt',
31 'skip': 'geo-blocked',
33 'title': 'Women Who Flirt',
36 'modified_timestamp': 1678744575289,
37 'cast': ['Xun Zhou', 'Xiaoming Huang', 'Yi-Lin Sie', 'Sonia Sui', 'Quniciren'],
39 'description': 'md5:892fd62a05611d394141e8394ace0bc6',
43 'url': 'https://www.retrocrush.tv/watch/1000000023016/Archenemy! Crystal Bowie',
44 'skip': 'geo-blocked',
46 'title': 'Archenemy! Crystal Bowie',
48 'id': '1000000023016',
51 'cast': ['Nachi Nozawa', 'Yoshiko Sakakibara', 'Toshiko Fujita'],
53 'episode': 'Episode 3',
56 'description': 'Cobra meets a beautiful bounty hunter by the name of Jane Royal.',
57 'series': 'Space Adventure COBRA (Original Japanese)',
61 def _real_extract(self
, url
):
62 url
, smuggled_data
= unsmuggle_url(url
, default
={})
63 self
._initialize
_geo
_bypass
({
64 'countries': smuggled_data
.get('geo_countries'),
66 video_id
= self
._match
_id
(url
)
67 html
= self
._download
_webpage
(url
, video_id
)
68 idetails
= self
._search
_nextjs
_data
(html
, video_id
)['props']['pageProps']['idetails']
70 err_code
= idetails
.get('err_code')
72 self
.raise_login_required()
73 elif err_code
== 1200:
74 self
.raise_geo_restricted(
75 'This video is not available from your location due to geo restriction. '
76 'You may be able to bypass it by using the /details/ page instead of the /watch/ page',
77 countries
=smuggled_data
.get('geo_countries'))
80 'subtitles': filter_dict({
81 'en': traverse_obj(idetails
, (('cc_url_vtt', 'subtitle_url'), {'url': {url_or_none}
})) or None,
83 'formats': self
._extract
_m
3u8_formats
(idetails
['url'], video_id
),
84 **traverse_obj(idetails
, {
86 'id': ('details', 'item_id'),
87 'description': ('details', 'description'),
88 'duration': ('duration', {lambda x
: x
/ 1000}),
89 'cast': ('details', 'cast', {lambda x
: x
.split(', ')}),
90 'modified_timestamp': ('details', 'updated_by', 0, 'update_time', 'time', {int_or_none}
),
91 'season_number': ('details', 'season', {int_or_none}
),
92 'episode_number': ('details', 'episode', {int_or_none}
),
93 'age_limit': ('details', 'rating_code', {parse_age_limit}
),
94 'series': ('details', 'series_details', 'title'),
99 class CineverseDetailsIE(CineverseBaseIE
):
100 _VALID_URL
= rf
'{CineverseBaseIE._VALID_URL_BASE}/details/(?P<id>[A-Z0-9]+)'
102 'url': 'https://www.retrocrush.tv/details/1000000023012/Space-Adventure-COBRA-(Original-Japanese)',
103 'playlist_mincount': 30,
105 'title': 'Space Adventure COBRA (Original Japanese)',
106 'id': '1000000023012',
109 'url': 'https://www.asiancrush.com/details/NNVG4938/Hansel-and-Gretel',
113 'title': 'Hansel and Gretel',
114 'description': 'md5:e3e4c35309c2e82aee044f972c2fb05d',
115 'cast': ['Jeong-myeong Cheon', 'Eun Won-jae', 'Shim Eun-gyeong', 'Ji-hee Jin', 'Hee-soon Park', 'Lydia Park', 'Kyeong-ik Kim'],
116 'duration': 7030.732,
120 def _real_extract(self
, url
):
121 host
, series_id
= self
._match
_valid
_url
(url
).group('host', 'id')
122 html
= self
._download
_webpage
(url
, series_id
)
123 pageprops
= self
._search
_nextjs
_data
(html
, series_id
)['props']['pageProps']
125 geo_countries
= traverse_obj(pageprops
, ('itemDetailsData', 'geo_country', {lambda x
: x
.split(', ')}))
126 geoblocked
= traverse_obj(pageprops
, (
127 'itemDetailsData', 'playback_err_msg')) == 'This title is not available in your location.'
129 def item_result(item
):
130 item_url
= f
'https://www.{host}/watch/{item["item_id"]}/{item["title"]}'
132 item_url
= smuggle_url(item_url
, {'geo_countries': geo_countries
})
133 return self
.url_result(item_url
, CineverseIE
)
135 season
= traverse_obj(pageprops
, ('seasonEpisodes', ..., 'episodes', lambda _
, v
: v
['item_id'] and v
['title']))
137 return self
.playlist_result([item_result(ep
) for ep
in season
], playlist_id
=series_id
,
138 playlist_title
=traverse_obj(pageprops
, ('itemDetailsData', 'title')))
139 return item_result(pageprops
['itemDetailsData'])