2014-04-19 10:51:04 -07:00
from __future__ import unicode_literals
2013-06-23 13:02:56 -07:00
import re
from . common import InfoExtractor
from . . utils import (
ExtractorError ,
unescapeHTML ,
)
class SteamIE ( InfoExtractor ) :
2014-04-20 17:34:34 -07:00
_VALID_URL = r """ (?x)
https ? : / / store \. steampowered \. com /
( agecheck / ) ?
( ? P < urltype > video | app ) / #If the page is only for videos or for a game
( ? P < gameID > \d + ) / ?
( ? P < videoID > \d * ) ( ? P < extra > \? ? ) # For urltype == video we sometimes get the videoID
|
https ? : / / ( ? : www \. ) ? steamcommunity \. com / sharedfiles / filedetails / \? id = ( ? P < fileID > [ 0 - 9 ] + )
"""
2013-06-23 13:02:56 -07:00
_VIDEO_PAGE_TEMPLATE = ' http://store.steampowered.com/video/ %s / '
_AGECHECK_TEMPLATE = ' http://store.steampowered.com/agecheck/video/ %s /?snr=1_agecheck_agecheck__age-gate&ageDay=1&ageMonth=January&ageYear=1970 '
2014-04-20 17:34:34 -07:00
_TESTS = [ {
2014-04-19 10:51:04 -07:00
" url " : " http://store.steampowered.com/video/105600/ " ,
" playlist " : [
2013-06-27 11:20:00 -07:00
{
2014-04-19 10:51:04 -07:00
" md5 " : " f870007cee7065d7c76b88f0a45ecc07 " ,
" info_dict " : {
' id ' : ' 81300 ' ,
' ext ' : ' flv ' ,
" title " : " Terraria 1.1 Trailer " ,
' playlist_index ' : 1 ,
2013-06-27 11:20:00 -07:00
}
} ,
{
2014-04-19 10:51:04 -07:00
" md5 " : " 61aaf31a5c5c3041afb58fb83cbb5751 " ,
" info_dict " : {
' id ' : ' 80859 ' ,
' ext ' : ' flv ' ,
" title " : " Terraria Trailer " ,
' playlist_index ' : 2 ,
2013-06-27 11:20:00 -07:00
}
}
2014-04-19 10:55:53 -07:00
] ,
' params ' : {
' playlistend ' : 2 ,
}
2014-04-20 17:34:34 -07:00
} , {
' url ' : ' http://steamcommunity.com/sharedfiles/filedetails/?id=242472205 ' ,
' info_dict ' : {
' id ' : ' WB5DvDOOvAY ' ,
' ext ' : ' mp4 ' ,
' upload_date ' : ' 20140329 ' ,
' title ' : ' FRONTIERS - Final Greenlight Trailer ' ,
' description ' : " The final trailer for the Steam Greenlight launch. Hooray, progress! Here ' s the official Greenlight page: http://steamcommunity.com/sharedfiles/filedetails/?id=242472205 " ,
' uploader ' : ' AAD Productions ' ,
' uploader_id ' : ' AtomicAgeDogGames ' ,
}
} ]
2013-06-27 11:20:00 -07:00
2013-06-23 13:02:56 -07:00
def _real_extract ( self , url ) :
2014-04-20 17:34:34 -07:00
m = re . match ( self . _VALID_URL , url )
fileID = m . group ( ' fileID ' )
if fileID :
videourl = url
playlist_id = fileID
else :
gameID = m . group ( ' gameID ' )
playlist_id = gameID
videourl = self . _VIDEO_PAGE_TEMPLATE % playlist_id
webpage = self . _download_webpage ( videourl , playlist_id )
2013-06-23 13:02:56 -07:00
if re . search ( ' <h2>Please enter your birth date to continue:</h2> ' , webpage ) is not None :
2014-04-20 17:34:34 -07:00
videourl = self . _AGECHECK_TEMPLATE % playlist_id
2013-06-23 13:02:56 -07:00
self . report_age_confirmation ( )
2014-04-20 17:34:34 -07:00
webpage = self . _download_webpage ( videourl , playlist_id )
if fileID :
playlist_title = self . _html_search_regex (
r ' <div class= " workshopItemTitle " >(.+)</div> ' , webpage , ' title ' )
mweb = re . finditer ( r ''' (?x)
' movie_(?P<videoID>[0-9]+) ' : \s * \{ \s *
YOUTUBE_VIDEO_ID : \s * " (?P<youtube_id>[^ " ] + ) " ,
''' , webpage)
videos = [ {
' _type ' : ' url ' ,
' url ' : vid . group ( ' youtube_id ' ) ,
' ie_key ' : ' Youtube ' ,
} for vid in mweb ]
else :
playlist_title = self . _html_search_regex (
r ' <h2 class= " pageheader " >(.*?)</h2> ' , webpage , ' game title ' )
2013-06-23 13:02:56 -07:00
2014-04-20 17:34:34 -07:00
mweb = re . finditer ( r ''' (?x)
' movie_(?P<videoID>[0-9]+) ' : \s * \{ \s *
FILENAME : \s * " (?P<videoURL>[ \ w:/ \ . \ ?=]+) "
( , \s * MOVIE_NAME : \s * \" (?P<videoName>[ \ w:/ \ . \ ?= \ +-]+) \" )? \ s* \ },
''' , webpage)
titles = re . finditer (
r ' <span class= " title " >(?P<videoName>.+?)</span> ' , webpage )
thumbs = re . finditer (
r ' <img class= " movie_thumb " src= " (?P<thumbnail>.+?) " > ' , webpage )
videos = [ ]
for vid , vtitle , thumb in zip ( mweb , titles , thumbs ) :
video_id = vid . group ( ' videoID ' )
title = vtitle . group ( ' videoName ' )
video_url = vid . group ( ' videoURL ' )
video_thumb = thumb . group ( ' thumbnail ' )
if not video_url :
raise ExtractorError ( ' Cannot find video url for %s ' % video_id )
videos . append ( {
' id ' : video_id ,
' url ' : video_url ,
' ext ' : ' flv ' ,
' title ' : unescapeHTML ( title ) ,
' thumbnail ' : video_thumb
} )
if not videos :
raise ExtractorError ( ' Could not find any videos ' )
2013-06-23 13:02:56 -07:00
2014-04-20 17:34:34 -07:00
return self . playlist_result ( videos , playlist_id , playlist_title )