@ -10,15 +10,18 @@ from ..utils import (
class SteamIE ( InfoExtractor ) :
class SteamIE ( InfoExtractor ) :
_VALID_URL = r """ (?x)http://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
"""
_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 ] + )
"""
_VIDEO_PAGE_TEMPLATE = ' http://store.steampowered.com/video/ %s / '
_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 '
_AGECHECK_TEMPLATE = ' http://store.steampowered.com/agecheck/video/ %s /?snr=1_agecheck_agecheck__age-gate&ageDay=1&ageMonth=January&ageYear=1970 '
_TEST = {
_TESTS = [ {
" url " : " http://store.steampowered.com/video/105600/ " ,
" url " : " http://store.steampowered.com/video/105600/ " ,
" playlist " : [
" playlist " : [
{
{
@ -43,44 +46,78 @@ class SteamIE(InfoExtractor):
' params ' : {
' params ' : {
' playlistend ' : 2 ,
' playlistend ' : 2 ,
}
}
}
} , {
' 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 ' ,
}
} ]
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
m = re . match ( self . _VALID_URL , url , re . VERBOSE )
gameID = m . group ( ' gameID ' )
videourl = self . _VIDEO_PAGE_TEMPLATE % gameID
webpage = self . _download_webpage ( videourl , gameID )
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 )
if re . search ( ' <h2>Please enter your birth date to continue:</h2> ' , webpage ) is not None :
if re . search ( ' <h2>Please enter your birth date to continue:</h2> ' , webpage ) is not None :
videourl = self . _AGECHECK_TEMPLATE % gameID
videourl = self . _AGECHECK_TEMPLATE % playlist_id
self . report_age_confirmation ( )
self . report_age_confirmation ( )
webpage = self . _download_webpage ( videourl , gameID )
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 ' )
self . report_extraction ( gameID )
game_title = self . _html_search_regex ( r ' <h2 class= " pageheader " >(.*?)</h2> ' ,
webpage , ' game title ' )
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 ' )
mweb = re . finditer (
r " ' movie_(?P<videoID> \ d+) ' : \ { \ s*FILENAME: \" (?P<videoURL>[ \ w:/ \ . \ ?=]+) \" (, \ s*MOVIE_NAME: \" (?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
} )
return self . playlist_result ( videos , gameID , game_title )
return self . playlist_result ( videos , playlist_id , playlist_title )