]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/dispeak.py
   1 from __future__ 
import unicode_literals
 
   5 from .common 
import InfoExtractor
 
  15 class DigitallySpeakingIE(InfoExtractor
): 
  16     _VALID_URL 
= r
'https?://(?:s?evt\.dispeak|events\.digitallyspeaking)\.com/(?:[^/]+/)+xml/(?P<id>[^.]+)\.xml' 
  19         # From http://gdcvault.com/play/1023460/Tenacious-Design-and-The-Interface 
  20         'url': 'http://evt.dispeak.com/ubm/gdc/sf16/xml/840376_BQRC.xml', 
  21         'md5': 'a8efb6c31ed06ca8739294960b2dbabd', 
  25             'title': 'Tenacious Design and The Interface of \'Destiny\'', 
  28         # From http://www.gdcvault.com/play/1014631/Classic-Game-Postmortem-PAC 
  29         'url': 'http://events.digitallyspeaking.com/gdc/sf11/xml/12396_1299111843500GMPX.xml', 
  30         'only_matching': True, 
  32         # From http://www.gdcvault.com/play/1013700/Advanced-Material 
  33         'url': 'http://sevt.dispeak.com/ubm/gdc/eur10/xml/11256_1282118587281VNIT.xml', 
  34         'only_matching': True, 
  37     def _parse_mp4(self
, metadata
): 
  41         mp4_video 
= xpath_text(metadata
, './mp4video', default
=None) 
  42         if mp4_video 
is not None: 
  43             mobj 
= re
.match(r
'(?P<root>https?://.*?/).*', mp4_video
) 
  44             video_root 
= mobj
.group('root') 
  45         if video_root 
is None: 
  46             http_host 
= xpath_text(metadata
, 'httpHost', default
=None) 
  48                 video_root 
= 'http://%s/' % http_host
 
  49         if video_root 
is None: 
  50             # Hard-coded in http://evt.dispeak.com/ubm/gdc/sf16/custom/player2.js 
  51             # Works for GPUTechConf, too 
  52             video_root 
= 'http://s3-2u.digitallyspeaking.com/' 
  54         formats 
= metadata
.findall('./MBRVideos/MBRVideo') 
  57         for a_format 
in formats
: 
  58             stream_name 
= xpath_text(a_format
, 'streamName', fatal
=True) 
  59             video_path 
= re
.match(r
'mp4\:(?P<path>.*)', stream_name
).group('path') 
  60             url 
= video_root 
+ video_path
 
  61             vbr 
= xpath_text(a_format
, 'bitrate') 
  62             video_formats
.append({ 
  64                 'vbr': int_or_none(vbr
), 
  68     def _parse_flv(self
, metadata
): 
  70         akamai_url 
= xpath_text(metadata
, './akamaiHost', fatal
=True) 
  71         audios 
= metadata
.findall('./audios/audio') 
  74                 'url': 'rtmp://%s/ondemand?ovpfv=1.1' % akamai_url
, 
  75                 'play_path': remove_end(audio
.get('url'), '.flv'), 
  78                 'format_id': audio
.get('code'), 
  80         slide_video_path 
= xpath_text(metadata
, './slideVideo', fatal
=True) 
  82             'url': 'rtmp://%s/ondemand?ovpfv=1.1' % akamai_url
, 
  83             'play_path': remove_end(slide_video_path
, '.flv'), 
  85             'format_note': 'slide deck video', 
  88             'format_id': 'slides', 
  90         speaker_video_path 
= xpath_text(metadata
, './speakerVideo', fatal
=True) 
  92             'url': 'rtmp://%s/ondemand?ovpfv=1.1' % akamai_url
, 
  93             'play_path': remove_end(speaker_video_path
, '.flv'), 
  95             'format_note': 'speaker video', 
  98             'format_id': 'speaker', 
 102     def _real_extract(self
, url
): 
 103         video_id 
= self
._match
_id
(url
) 
 105         xml_description 
= self
._download
_xml
(url
, video_id
) 
 106         metadata 
= xpath_element(xml_description
, 'metadata') 
 108         video_formats 
= self
._parse
_mp
4(metadata
) 
 109         if video_formats 
is None: 
 110             video_formats 
= self
._parse
_flv
(metadata
) 
 114             'formats': video_formats
, 
 115             'title': xpath_text(metadata
, 'title', fatal
=True), 
 116             'duration': parse_duration(xpath_text(metadata
, 'endTime')), 
 117             'creator': xpath_text(metadata
, 'speaker'),