@ -38,7 +38,7 @@ class TwitCastingIE(InfoExtractor):
' description ' : ' Twitter Oficial da cantora brasileira Ivete Sangalo. ' ,
' description ' : ' Twitter Oficial da cantora brasileira Ivete Sangalo. ' ,
' thumbnail ' : r ' re:^https?://.* \ .jpg$ ' ,
' thumbnail ' : r ' re:^https?://.* \ .jpg$ ' ,
' upload_date ' : ' 20110822 ' ,
' upload_date ' : ' 20110822 ' ,
' timestamp ' : 131 40108 24,
' timestamp ' : 131 39784 24,
' duration ' : 32 ,
' duration ' : 32 ,
' view_count ' : int ,
' view_count ' : int ,
} ,
} ,
@ -52,10 +52,10 @@ class TwitCastingIE(InfoExtractor):
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Live playing something #3689740 ' ,
' title ' : ' Live playing something #3689740 ' ,
' uploader_id ' : ' mttbernardini ' ,
' uploader_id ' : ' mttbernardini ' ,
' description ' : ' Salve, io sono Matto (ma con la e). Questa è la mia presentazione, in quanto sono letteralmente matto (nel senso di strano), con qualcosa in più. ' ,
' description ' : ' md5:1dc7efa2f1ab932fcd119265cebeec69 ' ,
' thumbnail ' : r ' re:^https?://.* \ .jpg$ ' ,
' thumbnail ' : r ' re:^https?://.* \ .jpg$ ' ,
' upload_date ' : ' 2012021 2 ' ,
' upload_date ' : ' 2012021 1 ' ,
' timestamp ' : 132 90280 24,
' timestamp ' : 132 89956 24,
' duration ' : 681 ,
' duration ' : 681 ,
' view_count ' : int ,
' view_count ' : int ,
} ,
} ,
@ -64,15 +64,22 @@ class TwitCastingIE(InfoExtractor):
' videopassword ' : ' abc ' ,
' videopassword ' : ' abc ' ,
} ,
} ,
} , {
} , {
' note ' : ' archive is split in 2 parts ' ,
' url ' : ' https://twitcasting.tv/loft_heaven/movie/685979292 ' ,
' url ' : ' https://twitcasting.tv/loft_heaven/movie/685979292 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 685979292 ' ,
' id ' : ' 685979292 ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' 南波一海のhear_here “ナタリー望月哲さんに聞く編集と「渋谷系狂騒曲」” ' ,
' title ' : ' 【無料配信】南波一海のhear/here “ナタリー望月哲さんに聞く編集と「渋谷系狂騒曲」” ' ,
' duration ' : 6964.599334 ,
' uploader_id ' : ' loft_heaven ' ,
' description ' : ' md5:3a0c7b53019df987ce545c935538bacf ' ,
' upload_date ' : ' 20210604 ' ,
' timestamp ' : 1622802114 ,
' thumbnail ' : r ' re:^https?://.* \ .jpg$ ' ,
' duration ' : 6964 ,
' view_count ' : int ,
} ,
' params ' : {
' skip_download ' : True ,
} ,
} ,
' playlist_mincount ' : 2 ,
} ]
} ]
def _parse_data_movie_playlist ( self , dmp , video_id ) :
def _parse_data_movie_playlist ( self , dmp , video_id ) :
@ -88,15 +95,18 @@ class TwitCastingIE(InfoExtractor):
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
uploader_id , video_id = self . _match_valid_url ( url ) . groups ( )
uploader_id , video_id = self . _match_valid_url ( url ) . groups ( )
webpage , urlh = self . _download_webpage_handle ( url , video_id )
video_password = self . get_param ( ' videopassword ' )
video_password = self . get_param ( ' videopassword ' )
request_data = None
request_data = None
if video_password :
if video_password :
request_data = urlencode_postdata ( {
request_data = urlencode_postdata ( {
' password ' : video_password ,
' password ' : video_password ,
* * self . _hidden_inputs ( webpage ) ,
} , encoding = ' utf-8 ' )
} , encoding = ' utf-8 ' )
webpage , urlh = self . _download_webpage_handle (
webpage , urlh = self . _download_webpage_handle (
url , video_id , data = request_data ,
url , video_id , data = request_data ,
headers = { ' Origin ' : ' https://twitcasting.tv ' } )
headers = { ' Origin ' : ' https://twitcasting.tv ' } ,
note = ' Trying video password ' )
if urlh . geturl ( ) != url and request_data :
if urlh . geturl ( ) != url and request_data :
webpage = self . _download_webpage (
webpage = self . _download_webpage (
urlh . geturl ( ) , video_id , data = request_data ,
urlh . geturl ( ) , video_id , data = request_data ,
@ -122,7 +132,7 @@ class TwitCastingIE(InfoExtractor):
duration = ( try_get ( video_js_data , lambda x : sum ( float_or_none ( y . get ( ' duration ' ) ) for y in x ) / 1000 )
duration = ( try_get ( video_js_data , lambda x : sum ( float_or_none ( y . get ( ' duration ' ) ) for y in x ) / 1000 )
or parse_duration ( clean_html ( get_element_by_class ( ' tw-player-duration-time ' , webpage ) ) ) )
or parse_duration ( clean_html ( get_element_by_class ( ' tw-player-duration-time ' , webpage ) ) ) )
view_count = str_to_int ( self . _search_regex (
view_count = str_to_int ( self . _search_regex (
( r ' Total \ s*: \ s* ([\ d,]+) \ s*Views ' , r ' 総視聴者 \ s*: \ s*([ \ d,]+) \ s*</ ' ) , webpage , ' views ' , None ) )
( r ' Total \ s*: \ s* Views\ s* ([\ d,]+) ' , r ' 総視聴者 \ s*: \ s*([ \ d,]+) \ s*</ ' ) , webpage , ' views ' , None ) )
timestamp = unified_timestamp ( self . _search_regex (
timestamp = unified_timestamp ( self . _search_regex (
r ' data-toggle= " true " [^>]+datetime= " ([^ " ]+) " ' ,
r ' data-toggle= " true " [^>]+datetime= " ([^ " ]+) " ' ,
webpage , ' datetime ' , None ) )
webpage , ' datetime ' , None ) )