]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/comedycentral.py
ba4d73ab8bf3ff893fdb2c07fc57f0cbc009ec44
   1 from __future__ 
import unicode_literals
 
   5 from .common 
import InfoExtractor
 
   6 from .mtv 
import MTVServicesInfoExtractor
 
  16 class ComedyCentralIE(MTVServicesInfoExtractor
): 
  17     _VALID_URL 
= r
'''(?x)https?://(?:www\.)?(comedycentral|cc)\.com/ 
  18         (video-clips|episodes|cc-studios|video-collections) 
  20     _FEED_URL 
= 'http://comedycentral.com/feeds/mrss/' 
  23         'url': 'http://www.comedycentral.com/video-clips/kllhuv/stand-up-greg-fitzsimmons--uncensored---too-good-of-a-mother', 
  24         'md5': 'c4f48e9eda1b16dd10add0744344b6d8', 
  26             'id': 'cef0cbb3-e776-4bc9-b62e-8016deccb354', 
  28             'title': 'CC:Stand-Up|Greg Fitzsimmons: Life on Stage|Uncensored - Too Good of a Mother', 
  29             'description': 'After a certain point, breastfeeding becomes c**kblocking.', 
  34 class ComedyCentralShowsIE(InfoExtractor
): 
  35     IE_DESC 
= 'The Daily Show / The Colbert Report' 
  36     # urls can be abbreviations like :thedailyshow or :colbert 
  37     # urls for episodes like: 
  38     # or urls for clips like: http://www.thedailyshow.com/watch/mon-december-10-2012/any-given-gun-day 
  39     #                     or: http://www.colbertnation.com/the-colbert-report-videos/421667/november-29-2012/moon-shattering-news 
  40     #                     or: http://www.colbertnation.com/the-colbert-report-collections/422008/festival-of-lights/79524 
  41     _VALID_URL 
= r
'''(?x)^(:(?P<shortname>tds|thedailyshow|cr|colbert|colbertnation|colbertreport) 
  43                           (?P<showname>thedailyshow|thecolbertreport)\.(?:cc\.)?com/ 
  44                          ((?:full-)?episodes/(?:[0-9a-z]{6}/)?(?P<episode>.*)| 
  46                               (?:(?:guests/[^/]+|videos|video-playlists|special-editions)/[^/]+/(?P<videotitle>[^/?#]+)) 
  47                               |(the-colbert-report-(videos|collections)/(?P<clipID>[0-9]+)/[^/]*/(?P<cntitle>.*?)) 
  48                               |(watch/(?P<date>[^/]*)/(?P<tdstitle>.*)) 
  51                               extended-interviews/(?P<interID>[0-9a-z]+)/(?:playlist_tds_extended_)?(?P<interview_title>.*?)(/.*?)?))) 
  54         'url': 'http://thedailyshow.cc.com/watch/thu-december-13-2012/kristen-stewart', 
  55         'md5': '4e2f5cb088a83cd8cdb7756132f9739d', 
  57             'id': 'ab9ab3e7-5a98-4dbe-8b21-551dc0523d55', 
  59             'upload_date': '20121213', 
  60             'description': 'Kristen Stewart learns to let loose in "On the Road."', 
  61             'uploader': 'thedailyshow', 
  62             'title': 'thedailyshow kristen-stewart part 1', 
  66     _available_formats 
= ['3500', '2200', '1700', '1200', '750', '400'] 
  86     def _transform_rtmp_url(rtmp_video_url
): 
  87         m 
= re
.match(r
'^rtmpe?://.*?/(?P<finalid>gsp\.comedystor/.*)$', rtmp_video_url
) 
  89             raise ExtractorError('Cannot transform RTMP url') 
  90         base 
= 'http://mtvnmobile.vo.llnwd.net/kip0/_pxn=1+_pxI0=Ripod-h264+_pxL0=undefined+_pxM0=+_pxK=18639+_pxE=mp4/44620/mtvnorigin/' 
  91         return base 
+ m
.group('finalid') 
  93     def _real_extract(self
, url
): 
  94         mobj 
= re
.match(self
._VALID
_URL
, url
, re
.VERBOSE
) 
  96             raise ExtractorError('Invalid URL: %s' % url
) 
  98         if mobj
.group('shortname'): 
  99             if mobj
.group('shortname') in ('tds', 'thedailyshow'): 
 100                 url 
= 'http://thedailyshow.cc.com/full-episodes/' 
 102                 url 
= 'http://thecolbertreport.cc.com/full-episodes/' 
 103             mobj 
= re
.match(self
._VALID
_URL
, url
, re
.VERBOSE
) 
 104             assert mobj 
is not None 
 106         if mobj
.group('clip'): 
 107             if mobj
.group('videotitle'): 
 108                 epTitle 
= mobj
.group('videotitle') 
 109             elif mobj
.group('showname') == 'thedailyshow': 
 110                 epTitle 
= mobj
.group('tdstitle') 
 112                 epTitle 
= mobj
.group('cntitle') 
 114         elif mobj
.group('interview'): 
 115             epTitle 
= mobj
.group('interview_title') 
 118             dlNewest 
= not mobj
.group('episode') 
 120                 epTitle 
= mobj
.group('showname') 
 122                 epTitle 
= mobj
.group('episode') 
 123         show_name 
= mobj
.group('showname') 
 125         webpage
, htmlHandle 
= self
._download
_webpage
_handle
(url
, epTitle
) 
 127             url 
= htmlHandle
.geturl() 
 128             mobj 
= re
.match(self
._VALID
_URL
, url
, re
.VERBOSE
) 
 130                 raise ExtractorError('Invalid redirected URL: ' + url
) 
 131             if mobj
.group('episode') == '': 
 132                 raise ExtractorError('Redirected URL is still not specific: ' + url
) 
 133             epTitle 
= mobj
.group('episode').rpartition('/')[-1] 
 135         mMovieParams 
= re
.findall('(?:<param name="movie" value="|var url = ")(http://media.mtvnservices.com/([^"]*(?:episode|video).*?:.*?))"', webpage
) 
 136         if len(mMovieParams
) == 0: 
 137             # The Colbert Report embeds the information in a without 
 138             # a URL prefix; so extract the alternate reference 
 139             # and then add the URL prefix manually. 
 141             altMovieParams 
= re
.findall('data-mgid="([^"]*(?:episode|video|playlist).*?:.*?)"', webpage
) 
 142             if len(altMovieParams
) == 0: 
 143                 raise ExtractorError('unable to find Flash URL in webpage ' + url
) 
 145                 mMovieParams 
= [("http://media.mtvnservices.com/" + altMovieParams
[0], altMovieParams
[0])] 
 147         uri 
= mMovieParams
[0][1] 
 148         # Correct cc.com in uri 
 149         uri 
= re
.sub(r
'(episode:[^.]+)(\.cc)?\.com', r
'\1.cc.com', uri
) 
 151         index_url 
= 'http://%s.cc.com/feeds/mrss?%s' % (show_name
, compat_urllib_parse
.urlencode({'uri': uri
})) 
 152         idoc 
= self
._download
_xml
( 
 154             'Downloading show index', 'Unable to download episode index') 
 156         title 
= idoc
.find('./channel/title').text
 
 157         description 
= idoc
.find('./channel/description').text
 
 160         item_els 
= idoc
.findall('.//item') 
 161         for part_num
, itemEl 
in enumerate(item_els
): 
 162             upload_date 
= unified_strdate(itemEl
.findall('./pubDate')[0].text
) 
 163             thumbnail 
= itemEl
.find('.//{http://search.yahoo.com/mrss/}thumbnail').attrib
.get('url') 
 165             content 
= itemEl
.find('.//{http://search.yahoo.com/mrss/}content') 
 166             duration 
= float_or_none(content
.attrib
.get('duration')) 
 167             mediagen_url 
= content
.attrib
['url'] 
 168             guid 
= itemEl
.find('./guid').text
.rpartition(':')[-1] 
 170             cdoc 
= self
._download
_xml
( 
 171                 mediagen_url
, epTitle
, 
 172                 'Downloading configuration for segment %d / %d' % (part_num 
+ 1, len(item_els
))) 
 175             for rendition 
in cdoc
.findall('.//rendition'): 
 176                 finfo 
= (rendition
.attrib
['bitrate'], rendition
.findall('./src')[0].text
) 
 180             for format
, rtmp_video_url 
in turls
: 
 181                 w
, h 
= self
._video
_dimensions
.get(format
, (None, None)) 
 183                     'format_id': 'vhttp-%s' % format
, 
 184                     'url': self
._transform
_rtmp
_url
(rtmp_video_url
), 
 185                     'ext': self
._video
_extensions
.get(format
, 'mp4'), 
 190                     'format_id': 'rtmp-%s' % format
, 
 191                     'url': rtmp_video_url
.replace('viacomccstrm', 'viacommtvstrm'), 
 192                     'ext': self
._video
_extensions
.get(format
, 'mp4'), 
 196                 self
._sort
_formats
(formats
) 
 198             virtual_id 
= show_name 
+ ' ' + epTitle 
+ ' part ' + compat_str(part_num 
+ 1) 
 203                 'uploader': show_name
, 
 204                 'upload_date': upload_date
, 
 205                 'duration': duration
, 
 206                 'thumbnail': thumbnail
, 
 207                 'description': description
, 
 213             'title': show_name 
+ ' ' + title
, 
 214             'description': description
,