@ -17,17 +17,20 @@ from ..utils import (
class RedTubeIE ( InfoExtractor ) :
class RedTubeIE ( InfoExtractor ) :
_VALID_URL = r ' https?://(?:(?: \ w+ \ .)?redtube \ .com/|embed \ .redtube \ .com/ \ ?.*? \ bid=)(?P<id>[0-9]+) '
_VALID_URL = r ' https?://(?:(?: \ w+ \ .)?redtube \ .com/|embed \ .redtube \ .com/ \ ?.*? \ bid=)(?P<id>[0-9]+) '
_TESTS = [ {
_TESTS = [ {
' url ' : ' http ://www.redtube.com/66418 ' ,
' url ' : ' http s://www.redtube.com/38864951 ' ,
' md5 ' : ' fc08071233725f26b8f014dba9590005 ' ,
' md5 ' : ' 4fba70cbca3aefd25767ab4b523c9878 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 66418 ' ,
' id ' : ' 38864951 ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Sucked on a toilet ' ,
' title ' : ' Public Sex on the Balcony in Freezing Paris! Amateur Couple LeoLulu ' ,
' upload_date ' : ' 20110811 ' ,
' description ' : ' Watch video Public Sex on the Balcony in Freezing Paris! Amateur Couple LeoLulu on Redtube, home of free Blowjob porn videos and Blonde sex movies online. Video length: (10:46) - Uploaded by leolulu - Verified User - Starring Pornstar: Leolulu ' ,
' duration ' : 596 ,
' upload_date ' : ' 20210111 ' ,
' timestamp ' : 1610343109 ,
' duration ' : 646 ,
' view_count ' : int ,
' view_count ' : int ,
' age_limit ' : 18 ,
' age_limit ' : 18 ,
}
' thumbnail ' : r ' re:https:// \ wi-ph \ .rdtcdn \ .com/videos/.+/.+ \ .jpg ' ,
} ,
} , {
} , {
' url ' : ' http://embed.redtube.com/?bgcolor=000000&id=1443286 ' ,
' url ' : ' http://embed.redtube.com/?bgcolor=000000&id=1443286 ' ,
' only_matching ' : True ,
' only_matching ' : True ,
@ -84,15 +87,25 @@ class RedTubeIE(InfoExtractor):
r ' mediaDefinition[ " \' ]? \ s*: \ s*( \ [.+?} \ s* \ ]) ' , webpage ,
r ' mediaDefinition[ " \' ]? \ s*: \ s*( \ [.+?} \ s* \ ]) ' , webpage ,
' media definitions ' , default = ' {} ' ) ,
' media definitions ' , default = ' {} ' ) ,
video_id , fatal = False )
video_id , fatal = False )
if medias and isinstance ( medias , list ) :
for media in medias if isinstance ( medias , list ) else [ ] :
for media in medias :
format_url = url_or_none ( media . get ( ' videoUrl ' ) )
format_url = url_or_none ( media . get ( ' videoUrl ' ) )
if not format_url :
if not format_url :
continue
continue
if media . get ( ' format ' ) == ' hls ' or determine_ext ( format_url ) == ' m3u8 ' :
format_id = media . get ( ' format ' )
quality = media . get ( ' quality ' )
if format_id == ' hls ' or ( format_id == ' mp4 ' and not quality ) :
more_media = self . _download_json ( format_url , video_id , fatal = False )
else :
more_media = [ media ]
for media in more_media if isinstance ( more_media , list ) else [ ] :
format_url = url_or_none ( media . get ( ' videoUrl ' ) )
if not format_url :
continue
format_id = media . get ( ' format ' )
if format_id == ' hls ' or determine_ext ( format_url ) == ' m3u8 ' :
formats . extend ( self . _extract_m3u8_formats (
formats . extend ( self . _extract_m3u8_formats (
format_url , video_id , ' mp4 ' ,
format_url , video_id , ' mp4 ' ,
entry_protocol = ' m3u8_native ' , m3u8_id = ' hls ' ,
entry_protocol = ' m3u8_native ' , m3u8_id = format_id or ' hls ' ,
fatal = False ) )
fatal = False ) )
continue
continue
format_id = media . get ( ' quality ' )
format_id = media . get ( ' quality ' )