@ -16,6 +16,7 @@ from ..utils import (
HEADRequest ,
HEADRequest ,
sanitized_Request ,
sanitized_Request ,
strip_or_none ,
strip_or_none ,
timeconvert ,
unescapeHTML ,
unescapeHTML ,
url_basename ,
url_basename ,
RegexNotFoundError ,
RegexNotFoundError ,
@ -36,13 +37,13 @@ class MTVServicesInfoExtractor(InfoExtractor):
return uri . split ( ' : ' ) [ - 1 ]
return uri . split ( ' : ' ) [ - 1 ]
# This was originally implemented for ComedyCentral, but it also works here
# This was originally implemented for ComedyCentral, but it also works here
@ static method
@ class method
def _transform_rtmp_url ( rtmp_video_url ) :
def _transform_rtmp_url ( cls , rtmp_video_url ) :
m = re . match ( r ' ^rtmpe?://.*?/(?P<finalid>gsp \ ..+?/.*)$ ' , rtmp_video_url )
m = re . match ( r ' ^rtmpe?://.*?/(?P<finalid>gsp \ ..+?/.*)$ ' , rtmp_video_url )
if not m :
if not m :
return rtmp_video_url
return { ' rtmp ' : rtmp_video_url }
base = ' http://viacommtvstrmfs.fplive.net/ '
base = ' http://viacommtvstrmfs.fplive.net/ '
return base + m . group ( ' finalid ' )
return { ' http ' : base + m . group ( ' finalid ' ) }
def _get_feed_url ( self , uri ) :
def _get_feed_url ( self , uri ) :
return self . _FEED_URL
return self . _FEED_URL
@ -86,14 +87,14 @@ class MTVServicesInfoExtractor(InfoExtractor):
rtmp_video_url = rendition . find ( ' ./src ' ) . text
rtmp_video_url = rendition . find ( ' ./src ' ) . text
if rtmp_video_url . endswith ( ' siteunavail.png ' ) :
if rtmp_video_url . endswith ( ' siteunavail.png ' ) :
continue
continue
new_url = self . _transform_rtmp_url ( rtmp_video_url )
new_url s = self . _transform_rtmp_url ( rtmp_video_url )
formats . append( {
formats . extend( [ {
' ext ' : ' flv ' if new_url . startswith ( ' rtmp ' ) else ext ,
' ext ' : ' flv ' if new_url . startswith ( ' rtmp ' ) else ext ,
' url ' : new_url ,
' url ' : new_url ,
' format_id ' : rendition . get ( ' bitrate ' ) ,
' format_id ' : ' - ' . join ( [ kind , rendition . get ( ' bitrate ' ) ] ) ,
' width ' : int ( rendition . get ( ' width ' ) ) ,
' width ' : int ( rendition . get ( ' width ' ) ) ,
' height ' : int ( rendition . get ( ' height ' ) ) ,
' height ' : int ( rendition . get ( ' height ' ) ) ,
} )
} for kind , new_url in new_urls . items ( ) ] )
except ( KeyError , TypeError ) :
except ( KeyError , TypeError ) :
raise ExtractorError ( ' Invalid rendition field. ' )
raise ExtractorError ( ' Invalid rendition field. ' )
self . _sort_formats ( formats )
self . _sort_formats ( formats )
@ -136,6 +137,8 @@ class MTVServicesInfoExtractor(InfoExtractor):
description = strip_or_none ( xpath_text ( itemdoc , ' description ' ) )
description = strip_or_none ( xpath_text ( itemdoc , ' description ' ) )
timestamp = timeconvert ( xpath_text ( itemdoc , ' pubDate ' ) )
title_el = None
title_el = None
if title_el is None :
if title_el is None :
title_el = find_xpath_attr (
title_el = find_xpath_attr (
@ -168,6 +171,7 @@ class MTVServicesInfoExtractor(InfoExtractor):
' thumbnail ' : self . _get_thumbnail_url ( uri , itemdoc ) ,
' thumbnail ' : self . _get_thumbnail_url ( uri , itemdoc ) ,
' description ' : description ,
' description ' : description ,
' duration ' : float_or_none ( content_el . attrib . get ( ' duration ' ) ) ,
' duration ' : float_or_none ( content_el . attrib . get ( ' duration ' ) ) ,
' timestamp ' : timestamp ,
}
}
def _get_feed_query ( self , uri ) :
def _get_feed_query ( self , uri ) :
@ -186,8 +190,13 @@ class MTVServicesInfoExtractor(InfoExtractor):
idoc = self . _download_xml (
idoc = self . _download_xml (
url , video_id ,
url , video_id ,
' Downloading info ' , transform_source = fix_xml_ampersands )
' Downloading info ' , transform_source = fix_xml_ampersands )
title = xpath_text ( idoc , ' ./channel/title ' )
description = xpath_text ( idoc , ' ./channel/description ' )
return self . playlist_result (
return self . playlist_result (
[ self . _get_video_info ( item ) for item in idoc . findall ( ' .//item ' ) ] )
[ self . _get_video_info ( item ) for item in idoc . findall ( ' .//item ' ) ] ,
playlist_title = title , playlist_description = description )
def _extract_mgid ( self , webpage ) :
def _extract_mgid ( self , webpage ) :
try :
try :
@ -233,6 +242,8 @@ class MTVServicesEmbeddedIE(MTVServicesInfoExtractor):
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Peter Dinklage Sums Up \' Game Of Thrones \' In 45 Seconds ' ,
' title ' : ' Peter Dinklage Sums Up \' Game Of Thrones \' In 45 Seconds ' ,
' description ' : ' " Sexy sexy sexy, stabby stabby stabby, beautiful language, " says Peter Dinklage as he tries summarizing " Game of Thrones " in under a minute. ' ,
' description ' : ' " Sexy sexy sexy, stabby stabby stabby, beautiful language, " says Peter Dinklage as he tries summarizing " Game of Thrones " in under a minute. ' ,
' timestamp ' : 1400126400 ,
' upload_date ' : ' 20140515 ' ,
} ,
} ,
}
}
@ -275,6 +286,8 @@ class MTVIE(MTVServicesInfoExtractor):
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Taylor Swift - " Ours (VH1 Storytellers) " ' ,
' title ' : ' Taylor Swift - " Ours (VH1 Storytellers) " ' ,
' description ' : ' Album: Taylor Swift performs " Ours " for VH1 Storytellers at Harvey Mudd College. ' ,
' description ' : ' Album: Taylor Swift performs " Ours " for VH1 Storytellers at Harvey Mudd College. ' ,
' timestamp ' : 1352610000 ,
' upload_date ' : ' 20121111 ' ,
} ,
} ,
} ,
} ,
]
]
@ -301,20 +314,6 @@ class MTVIE(MTVServicesInfoExtractor):
return self . _get_videos_info ( uri )
return self . _get_videos_info ( uri )
class MTVIggyIE ( MTVServicesInfoExtractor ) :
IE_NAME = ' mtviggy.com '
_VALID_URL = r ' https?://www \ .mtviggy \ .com/videos/.+ '
_TEST = {
' url ' : ' http://www.mtviggy.com/videos/arcade-fire-behind-the-scenes-at-the-biggest-music-experiment-yet/ ' ,
' info_dict ' : {
' id ' : ' 984696 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Arcade Fire: Behind the Scenes at the Biggest Music Experiment Yet ' ,
}
}
_FEED_URL = ' http://all.mtvworldverticals.com/feed-xml/ '
class MTVDEIE ( MTVServicesInfoExtractor ) :
class MTVDEIE ( MTVServicesInfoExtractor ) :
IE_NAME = ' mtv.de '
IE_NAME = ' mtv.de '
_VALID_URL = r ' https?://(?:www \ .)?mtv \ .de/(?:artists|shows|news)/(?:[^/]+/)*(?P<id> \ d+)-[^/#?]+/*(?:[#?].*)?$ '
_VALID_URL = r ' https?://(?:www \ .)?mtv \ .de/(?:artists|shows|news)/(?:[^/]+/)*(?P<id> \ d+)-[^/#?]+/*(?:[#?].*)?$ '
@ -322,7 +321,7 @@ class MTVDEIE(MTVServicesInfoExtractor):
' url ' : ' http://www.mtv.de/artists/10571-cro/videos/61131-traum ' ,
' url ' : ' http://www.mtv.de/artists/10571-cro/videos/61131-traum ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' music_video-a50bc5f0b3aa4b3190aa ' ,
' id ' : ' music_video-a50bc5f0b3aa4b3190aa ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' flv ' ,
' title ' : ' MusicVideo_cro-traum ' ,
' title ' : ' MusicVideo_cro-traum ' ,
' description ' : ' Cro - Traum ' ,
' description ' : ' Cro - Traum ' ,
} ,
} ,
@ -335,7 +334,7 @@ class MTVDEIE(MTVServicesInfoExtractor):
' url ' : ' http://www.mtv.de/shows/933-teen-mom-2/staffeln/5353/folgen/63565-enthullungen ' ,
' url ' : ' http://www.mtv.de/shows/933-teen-mom-2/staffeln/5353/folgen/63565-enthullungen ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' local_playlist-f5ae778b9832cc837189 ' ,
' id ' : ' local_playlist-f5ae778b9832cc837189 ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' flv ' ,
' title ' : ' Episode_teen-mom-2_shows_season-5_episode-1_full-episode_part1 ' ,
' title ' : ' Episode_teen-mom-2_shows_season-5_episode-1_full-episode_part1 ' ,
} ,
} ,
' params ' : {
' params ' : {
@ -343,7 +342,6 @@ class MTVDEIE(MTVServicesInfoExtractor):
' skip_download ' : True ,
' skip_download ' : True ,
} ,
} ,
} , {
} , {
# single video in pagePlaylist with different id
' url ' : ' http://www.mtv.de/news/77491-mtv-movies-spotlight-pixels-teil-3 ' ,
' url ' : ' http://www.mtv.de/news/77491-mtv-movies-spotlight-pixels-teil-3 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' local_playlist-4e760566473c4c8c5344 ' ,
' id ' : ' local_playlist-4e760566473c4c8c5344 ' ,
@ -355,6 +353,7 @@ class MTVDEIE(MTVServicesInfoExtractor):
# rtmp download
# rtmp download
' skip_download ' : True ,
' skip_download ' : True ,
} ,
} ,
' skip ' : ' Das Video kann zur Zeit nicht abgespielt werden. ' ,
} ]
} ]
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
@ -367,11 +366,14 @@ class MTVDEIE(MTVServicesInfoExtractor):
r ' window \ .pagePlaylist \ s*= \ s*( \ [.+? \ ]); \ n ' , webpage , ' page playlist ' ) ,
r ' window \ .pagePlaylist \ s*= \ s*( \ [.+? \ ]); \ n ' , webpage , ' page playlist ' ) ,
video_id )
video_id )
def _mrss_url ( item ) :
return item [ ' mrss ' ] + item . get ( ' mrssvars ' , ' ' )
# news pages contain single video in playlist with different id
# news pages contain single video in playlist with different id
if len ( playlist ) == 1 :
if len ( playlist ) == 1 :
return self . _get_videos_info_from_url ( playlist [ 0 ] [ ' mrss ' ] , video_id )
return self . _get_videos_info_from_url ( _mrss_url( playlist [ 0 ] ) , video_id )
for item in playlist :
for item in playlist :
item_id = item . get ( ' id ' )
item_id = item . get ( ' id ' )
if item_id and compat_str ( item_id ) == video_id :
if item_id and compat_str ( item_id ) == video_id :
return self . _get_videos_info_from_url ( item[ ' mrss ' ] , video_id )
return self . _get_videos_info_from_url ( _mrss_url( item ) , video_id )