2016-01-15 17:45:51 +01:00
from . common import InfoExtractor
from . . utils import (
2018-10-17 07:22:07 +02:00
ExtractorError ,
2016-01-15 17:45:51 +01:00
int_or_none ,
2018-08-17 12:59:22 +02:00
parse_age_limit ,
2016-01-15 17:45:51 +01:00
parse_iso8601 ,
2018-08-17 12:59:22 +02:00
smuggle_url ,
str_or_none ,
2024-10-12 19:47:37 +02:00
update_url_query ,
2016-01-15 17:45:51 +01:00
)
class CWTVIE ( InfoExtractor ) :
2016-08-01 17:51:01 +02:00
_VALID_URL = r ' https?://(?:www \ .)?cw(?:tv(?:pr)?|seed) \ .com/(?:shows/)?(?:[^/]+/)+[^?]* \ ?.* \ b(?:play|watch)=(?P<id>[a-z0-9] {8} -[a-z0-9] {4} -[a-z0-9] {4} -[a-z0-9] {4} -[a-z0-9] {12} ) '
2016-01-15 17:45:51 +01:00
_TESTS = [ {
2024-10-08 01:24:31 +02:00
' url ' : ' https://www.cwtv.com/shows/all-american-homecoming/ready-or-not/?play=d848488f-f62a-40fd-af1f-6440b1821aab ' ,
' info_dict ' : {
' id ' : ' d848488f-f62a-40fd-af1f-6440b1821aab ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Ready Or Not ' ,
' description ' : ' Simone is concerned about changes taking place at Bringston; JR makes a decision about his future. ' ,
' thumbnail ' : r ' re:^https?://.* \ .jpe?g$ ' ,
' duration ' : 2547 ,
' timestamp ' : 1720519200 ,
' uploader ' : ' CWTV ' ,
' chapters ' : ' count:6 ' ,
' series ' : ' All American: Homecoming ' ,
' season_number ' : 3 ,
' episode_number ' : 1 ,
' age_limit ' : 0 ,
' upload_date ' : ' 20240709 ' ,
' season ' : ' Season 3 ' ,
' episode ' : ' Episode 1 ' ,
} ,
' params ' : {
# m3u8 download
' skip_download ' : True ,
} ,
} , {
2016-01-15 17:45:51 +01:00
' url ' : ' http://cwtv.com/shows/arrow/legends-of-yesterday/?play=6b15e985-9345-4f60-baf8-56e96be57c63 ' ,
' info_dict ' : {
' id ' : ' 6b15e985-9345-4f60-baf8-56e96be57c63 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Legends of Yesterday ' ,
' description ' : ' Oliver and Barry Allen take Kendra Saunders and Carter Hall to a remote location to keep them hidden from Vandal Savage while they figure out how to defeat him. ' ,
' duration ' : 2665 ,
' series ' : ' Arrow ' ,
' season_number ' : 4 ,
' season ' : ' 4 ' ,
' episode_number ' : 8 ,
' upload_date ' : ' 20151203 ' ,
' timestamp ' : 1449122100 ,
} ,
' params ' : {
# m3u8 download
' skip_download ' : True ,
2016-08-07 23:56:04 +02:00
} ,
' skip ' : ' redirect to http://cwtv.com/shows/arrow/ ' ,
2016-01-15 17:45:51 +01:00
} , {
' url ' : ' http://www.cwseed.com/shows/whose-line-is-it-anyway/jeff-davis-4/?play=24282b12-ead2-42f2-95ad-26770c2c6088 ' ,
' info_dict ' : {
' id ' : ' 24282b12-ead2-42f2-95ad-26770c2c6088 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Jeff Davis 4 ' ,
' description ' : ' Jeff Davis is back to make you laugh. ' ,
' duration ' : 1263 ,
' series ' : ' Whose Line Is It Anyway? ' ,
' season_number ' : 11 ,
' episode_number ' : 20 ,
' upload_date ' : ' 20151006 ' ,
' timestamp ' : 1444107300 ,
2018-08-17 12:59:22 +02:00
' age_limit ' : 14 ,
' uploader ' : ' CWTV ' ,
2023-12-12 01:00:35 +01:00
' thumbnail ' : r ' re:^https?://.* \ .jpe?g$ ' ,
' chapters ' : ' count:4 ' ,
' episode ' : ' Episode 20 ' ,
' season ' : ' Season 11 ' ,
2018-08-17 12:59:22 +02:00
} ,
' params ' : {
# m3u8 download
' skip_download ' : True ,
2016-01-15 17:45:51 +01:00
} ,
2016-04-28 00:01:21 +02:00
} , {
' url ' : ' http://cwtv.com/thecw/chroniclesofcisco/?play=8adebe35-f447-465f-ab52-e863506ff6d6 ' ,
' only_matching ' : True ,
2016-08-01 17:51:01 +02:00
} , {
' url ' : ' http://cwtvpr.com/the-cw/video?watch=9eee3f60-ef4e-440b-b3b2-49428ac9c54e ' ,
' only_matching ' : True ,
} , {
' url ' : ' http://cwtv.com/shows/arrow/legends-of-yesterday/?watch=6b15e985-9345-4f60-baf8-56e96be57c63 ' ,
' only_matching ' : True ,
2016-01-15 17:45:51 +01:00
} ]
def _real_extract ( self , url ) :
video_id = self . _match_id ( url )
2018-10-17 07:22:07 +02:00
data = self . _download_json (
2024-10-08 01:24:31 +02:00
f ' https://images.cwtv.com/feed/mobileapp/video-meta/apiversion_12/guid_ { video_id } ' , video_id )
2018-10-17 07:22:07 +02:00
if data . get ( ' result ' ) != ' ok ' :
raise ExtractorError ( data [ ' msg ' ] , expected = True )
video_data = data [ ' video ' ]
2018-08-17 12:59:22 +02:00
title = video_data [ ' title ' ]
2024-10-12 19:47:37 +02:00
mpx_url = update_url_query (
video_data . get ( ' mpx_url ' ) or f ' https://link.theplatform.com/s/cwtv/media/guid/2703454149/ { video_id } ' ,
{ ' formats ' : ' M3U+none ' } )
2016-01-15 17:45:51 +01:00
2018-08-17 12:59:22 +02:00
season = str_or_none ( video_data . get ( ' season ' ) )
episode = str_or_none ( video_data . get ( ' episode ' ) )
if episode and season :
2019-03-27 18:01:51 +01:00
episode = episode [ len ( season ) : ]
2016-01-15 17:45:51 +01:00
return {
2018-08-17 12:59:22 +02:00
' _type ' : ' url_transparent ' ,
2016-01-15 17:45:51 +01:00
' id ' : video_id ,
2018-08-17 12:59:22 +02:00
' title ' : title ,
' url ' : smuggle_url ( mpx_url , { ' force_smil_url ' : True } ) ,
' description ' : video_data . get ( ' description_long ' ) ,
' duration ' : int_or_none ( video_data . get ( ' duration_secs ' ) ) ,
' series ' : video_data . get ( ' series_name ' ) ,
' season_number ' : int_or_none ( season ) ,
' episode_number ' : int_or_none ( episode ) ,
' timestamp ' : parse_iso8601 ( video_data . get ( ' start_time ' ) ) ,
' age_limit ' : parse_age_limit ( video_data . get ( ' rating ' ) ) ,
' ie_key ' : ' ThePlatform ' ,
2024-06-12 01:09:58 +02:00
' thumbnail ' : video_data . get ( ' large_thumbnail ' ) ,
2016-01-15 17:45:51 +01:00
}