@ -9,17 +9,12 @@ from ..utils import str_to_int
class NineGagIE ( InfoExtractor ) :
class NineGagIE ( InfoExtractor ) :
IE_NAME = ' 9gag '
IE_NAME = ' 9gag '
_VALID_URL = r ''' (?x)^https?://(?:www \ .)?9gag \ .tv/
_VALID_URL = r ' https?://(?:www \ .)?9gag \ .com/tv/p/(?P<id>[a-zA-Z0-9]+)/(?P<display_id>[^?#/]+) '
( ? :
v / ( ? P < numid > [ 0 - 9 ] + ) |
p / ( ? P < id > [ a - zA - Z0 - 9 ] + ) / ( ? P < display_id > [ ^ ? #/]+)
)
'''
_TESTS = [ {
_TESTS = [ {
" url " : " http://9gag. tv/v/1912 " ,
" url " : " http://9gag.com/tv/p/Kk2X5/people-are-awesome-2013-is-absolutely-awesome " ,
" info_dict " : {
" info_dict " : {
" id " : " 1912 " ,
" id " : " Kk2X5 " ,
" ext " : " mp4 " ,
" ext " : " mp4 " ,
" description " : " This 3-minute video will make you smile and then make you feel untalented and insignificant. Anyway, you should share this awesomeness. (Thanks, Dino!) " ,
" description " : " This 3-minute video will make you smile and then make you feel untalented and insignificant. Anyway, you should share this awesomeness. (Thanks, Dino!) " ,
" title " : " \" People Are Awesome 2013 \" Is Absolutely Awesome " ,
" title " : " \" People Are Awesome 2013 \" Is Absolutely Awesome " ,
@ -31,7 +26,7 @@ class NineGagIE(InfoExtractor):
} ,
} ,
' add_ie ' : [ ' Youtube ' ]
' add_ie ' : [ ' Youtube ' ]
} , {
} , {
' url ' : ' http://9gag. tv/p/KklwM/alternate-banned-opening-scene-of-gravity?ref=fsidebar' ,
' url ' : ' http://9gag. com/ tv/p/KklwM/alternate-banned-opening-scene-of-gravity?ref=fsidebar' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' KklwM ' ,
' id ' : ' KklwM ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
@ -42,19 +37,39 @@ class NineGagIE(InfoExtractor):
' upload_date ' : ' 20140401 ' ,
' upload_date ' : ' 20140401 ' ,
' uploader_id ' : ' krishnashenoi93 ' ,
' uploader_id ' : ' krishnashenoi93 ' ,
} ,
} ,
' add_ie ' : [ ' Youtube ' ]
} ]
} ]
_EXTERNAL_VIDEO_PROVIDER = {
' 1 ' : {
' url ' : ' %s ' ,
' ie_key ' : ' Youtube ' ,
} ,
' 2 ' : {
' url ' : ' http://player.vimeo.com/video/ %s ' ,
' ie_key ' : ' Vimeo ' ,
} ,
' 3 ' : {
' url ' : ' http://instagram.com/p/ %s ' ,
' ie_key ' : ' Instagram ' ,
} ,
' 4 ' : {
' url ' : ' http://vine.co/v/ %s ' ,
' ie_key ' : ' Vine ' ,
} ,
}
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
mobj = re . match ( self . _VALID_URL , url )
video_id = mobj . group ( ' numid ' ) or mobj . group ( ' id ' )
video_id = mobj . group ( ' id' )
display_id = mobj . group ( ' display_id ' ) or video_id
display_id = mobj . group ( ' display_id ' )
webpage = self . _download_webpage ( url , display_id )
webpage = self . _download_webpage ( url , display_id )
post_view = json . loads ( self . _html_search_regex (
post_view = json . loads ( self . _html_search_regex (
r ' var postView = new app \ .PostView \ ( { \ s*post: \ s*( { .+?}), \ s*posts: \ s*prefetchedCurrentPost ' , webpage , ' post view ' ) )
r ' var postView = new app \ .PostView \ ( { \ s*post: \ s*( { .+?}), \ s*posts: \ s*prefetchedCurrentPost ' , webpage , ' post view ' ) )
youtube_id = post_view [ ' videoExternalId ' ]
external_video_id = post_view [ ' videoExternalId ' ]
external_video_provider = post_view [ ' videoExternalProvider ' ]
title = post_view [ ' title ' ]
title = post_view [ ' title ' ]
description = post_view [ ' description ' ]
description = post_view [ ' description ' ]
view_count = str_to_int ( post_view [ ' externalView ' ] )
view_count = str_to_int ( post_view [ ' externalView ' ] )
@ -62,8 +77,8 @@ class NineGagIE(InfoExtractor):
return {
return {
' _type ' : ' url_transparent ' ,
' _type ' : ' url_transparent ' ,
' url ' : youtube _id,
' url ' : self . _EXTERNAL_VIDEO_PROVIDER [ external_video_provider ] [ ' url ' ] % external_video _id,
' ie_key ' : ' Youtube ' ,
' ie_key ' : self . _EXTERNAL_VIDEO_PROVIDER [ external_video_provider ] [ ' ie_key ' ] ,
' id ' : video_id ,
' id ' : video_id ,
' display_id ' : display_id ,
' display_id ' : display_id ,
' title ' : title ,
' title ' : title ,