2014-01-28 17:55:06 +00:00
from __future__ import unicode_literals
2013-12-05 13:29:08 +00:00
import re
from . common import InfoExtractor
2014-04-15 12:49:38 +00:00
from . . utils import str_to_int
2013-12-05 13:29:08 +00:00
class NineGagIE ( InfoExtractor ) :
IE_NAME = ' 9gag '
2015-09-22 19:58:47 +00:00
_VALID_URL = r ' https?://(?:www \ .)?9gag(?: \ .com/tv| \ .tv)/(?:p|embed)/(?P<id>[a-zA-Z0-9]+)(?:/(?P<display_id>[^?#/]+))? '
2013-12-05 13:29:08 +00:00
2014-04-10 23:25:24 +00:00
_TESTS = [ {
2015-09-22 19:56:26 +00:00
' url ' : ' http://9gag.com/tv/p/Kk2X5/people-are-awesome-2013-is-absolutely-awesome ' ,
' info_dict ' : {
' id ' : ' Kk2X5 ' ,
' 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!) ' ,
' title ' : ' \" People Are Awesome 2013 \" Is Absolutely Awesome ' ,
2014-12-12 19:10:15 +00:00
' uploader_id ' : ' UCdEH6EjDKwtTe-sO2f0_1XA ' ,
' uploader ' : ' CompilationChannel ' ,
' upload_date ' : ' 20131110 ' ,
2015-09-22 19:56:26 +00:00
' view_count ' : int ,
2013-12-05 13:29:08 +00:00
} ,
2015-09-22 19:55:16 +00:00
' add_ie ' : [ ' Youtube ' ] ,
} , {
' url ' : ' http://9gag.com/tv/p/aKolP3 ' ,
' info_dict ' : {
' id ' : ' aKolP3 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' This Guy Travelled 11 countries In 44 days Just To Make This Amazing Video ' ,
' description ' : " I just saw more in 1 minute than I ' ve seen in 1 year. This guy ' s video is epic!! " ,
' uploader_id ' : ' rickmereki ' ,
' uploader ' : ' Rick Mereki ' ,
' upload_date ' : ' 20110803 ' ,
' view_count ' : int ,
} ,
' add_ie ' : [ ' Vimeo ' ] ,
2014-11-23 20:39:15 +00:00
} , {
2015-09-22 19:41:44 +00:00
' url ' : ' http://9gag.com/tv/p/KklwM ' ,
' only_matching ' : True ,
2015-09-22 19:43:26 +00:00
} , {
' url ' : ' http://9gag.tv/p/Kk2X5 ' ,
' only_matching ' : True ,
2015-09-22 19:58:47 +00:00
} , {
' url ' : ' http://9gag.com/tv/embed/a5Dmvl ' ,
' only_matching ' : True ,
2014-04-10 23:25:24 +00:00
} ]
2015-09-22 19:58:47 +00:00
2015-09-21 13:01:12 +00:00
_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 ' ,
} ,
}
2013-12-05 13:29:08 +00:00
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
2015-09-21 13:01:12 +00:00
video_id = mobj . group ( ' id ' )
2015-09-22 19:40:06 +00:00
display_id = mobj . group ( ' display_id ' ) or video_id
2013-12-05 13:29:08 +00:00
2014-04-10 23:25:24 +00:00
webpage = self . _download_webpage ( url , display_id )
2013-12-05 13:29:08 +00:00
2015-09-22 19:48:13 +00:00
post_view = self . _parse_json (
self . _search_regex (
r ' var \ s+postView \ s*= \ s*new \ s+app \ .PostView \ ( { \ s*post: \ s*( { .+?}) \ s*, \ s*posts: \ s*prefetchedCurrentPost ' ,
webpage , ' post view ' ) ,
display_id )
2014-04-15 12:49:38 +00:00
2015-09-22 18:20:18 +00:00
ie_key = None
source_url = post_view . get ( ' sourceUrl ' )
2015-09-22 19:28:00 +00:00
if not source_url :
2015-09-22 18:20:18 +00:00
external_video_id = post_view [ ' videoExternalId ' ]
external_video_provider = post_view [ ' videoExternalProvider ' ]
source_url = self . _EXTERNAL_VIDEO_PROVIDER [ external_video_provider ] [ ' url ' ] % external_video_id
ie_key = self . _EXTERNAL_VIDEO_PROVIDER [ external_video_provider ] [ ' ie_key ' ]
2014-04-15 12:49:38 +00:00
title = post_view [ ' title ' ]
2015-09-22 19:46:40 +00:00
description = post_view . get ( ' description ' )
view_count = str_to_int ( post_view . get ( ' externalView ' ) )
2014-04-15 12:49:38 +00:00
thumbnail = post_view . get ( ' thumbnail_700w ' ) or post_view . get ( ' ogImageUrl ' ) or post_view . get ( ' thumbnail_300w ' )
2013-12-05 13:29:08 +00:00
return {
' _type ' : ' url_transparent ' ,
2015-09-22 18:20:18 +00:00
' url ' : source_url ,
' ie_key ' : ie_key ,
2013-12-05 13:29:08 +00:00
' id ' : video_id ,
2014-04-10 23:25:24 +00:00
' display_id ' : display_id ,
' title ' : title ,
2014-03-13 15:40:53 +00:00
' description ' : description ,
' view_count ' : view_count ,
2014-04-15 12:49:38 +00:00
' thumbnail ' : thumbnail ,
2013-12-05 13:29:08 +00:00
}