Merge pull request #853 from mc2avr/master
authorJaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com>
Sat, 8 Jun 2013 09:11:49 +0000 (11:11 +0200)
committerJaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com>
Sat, 8 Jun 2013 09:44:01 +0000 (11:44 +0200)
add ZDFIE

1  2 
youtube_dl/FileDownloader.py
youtube_dl/InfoExtractors.py

index 49f3a871261d3816ec0b537ae60644691dc52f19,2c35a05d8221c7834ebf98a3a40561ad9853f9c1..bf0f5bb9ef9834247c465204af006cfdfffc8efd
@@@ -810,6 -810,39 +810,37 @@@ class FileDownloader(object)
              self.report_error(u'rtmpdump exited with code %d' % retval)
              return False
  
 -#        args = ['mmsclient', url]                                     # doesn't work anymore
 -#        args = ['wpro', url, '-O', tmpfilename]                       # dont work
+     def _download_with_mplayer(self, filename, url):
+         self.report_destination(filename)
+         tmpfilename = self.temp_name(filename)
 -            subprocess.call(args[0], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT)
+         args = ['mplayer', '-really-quiet', '-vo', 'null', '-vc', 'dummy', '-dumpstream', '-dumpfile', tmpfilename, url]
+         # Check for mplayer first
+         try:
 -            self.report_error(u'%s exited with code %d' % (args[0], retval))
++            subprocess.call(['mplayer', '-h'], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT)
+         except (OSError, IOError):
+             self.report_error(u'MMS or RTSP download detected but "%s" could not be run' % args[0] )
+             return False
+         # Download using mplayer. 
+         retval = subprocess.call(args)
+         if retval == 0:
+             fsize = os.path.getsize(encodeFilename(tmpfilename))
+             self.to_screen(u'\r[%s] %s bytes' % (args[0], fsize))
+             self.try_rename(tmpfilename, filename)
+             self._hook_progress({
+                 'downloaded_bytes': fsize,
+                 'total_bytes': fsize,
+                 'filename': filename,
+                 'status': 'finished',
+             })
+             return True
+         else:
+             self.to_stderr(u"\n")
++            self.report_error(u'mplayer exited with code %d' % retval)
+             return False
      def _do_download(self, filename, info_dict):
          url = info_dict['url']
  
index 11fcd6adcc8b73e1b7ec278fb2eb184327539bc0,4ca744daface942191f26a3dff41123471842671..24a77a1abba247c49234189d794d7da6cc83486f
@@@ -4091,6 -4052,64 +4091,64 @@@ class ARDIE(InfoExtractor)
              info["url"] = stream["video_url"]
          return [info]
  
 -        # s['media_type'] == 'wstreaming' -> use 'Windows Media Player' und mms url
 -        # s['media_type'] == 'hstreaming' -> use 'Quicktime' und rtsp url
+ class ZDFIE(InfoExtractor):
+     _VALID_URL = r'^http://www\.zdf\.de\/ZDFmediathek\/(.*beitrag\/video\/)(?P<video_id>[^/\?]+)(?:\?.*)?'
+     _TITLE = r'<h1(?: class="beitragHeadline")?>(?P<title>.*)</h1>'
+     _MEDIA_STREAM = r'<a href="(?P<video_url>.+(?P<media_type>.streaming).+/zdf/(?P<quality>[^\/]+)/[^"]*)".+class="play".+>'
+     _MMS_STREAM = r'href="(?P<video_url>mms://[^"]*)"'
+     _RTSP_STREAM = r'(?P<video_url>rtsp://[^"]*.mp4)'
+     def _real_extract(self, url):
+         mobj = re.match(self._VALID_URL, url)
+         if mobj is None:
+             raise ExtractorError(u'Invalid URL: %s' % url)
+         video_id = mobj.group('video_id')
+         html = self._download_webpage(url, video_id)
+         streams = [m.groupdict() for m in re.finditer(self._MEDIA_STREAM, html)]
+         if streams is None:
+             raise ExtractorError(u'No media url found.')
++        # s['media_type'] == 'wstreaming' -> use 'Windows Media Player' and mms url
++        # s['media_type'] == 'hstreaming' -> use 'Quicktime' and rtsp url
+         # choose first/default media type and highest quality for now
+         for s in streams:        #find 300 - dsl1000mbit
+             if s['quality'] == '300' and s['media_type'] == 'wstreaming':
+                 stream_=s
+                 break
+         for s in streams:        #find veryhigh - dsl2000mbit
+             if s['quality'] == 'veryhigh' and s['media_type'] == 'wstreaming': # 'hstreaming' - rtsp is not working
+                 stream_=s
+                 break
+         if stream_ is None:
+             raise ExtractorError(u'No stream found.')
+         media_link = self._download_webpage(stream_['video_url'], video_id,'Get stream URL')
+         self.report_extraction(video_id)
+         mobj = re.search(self._TITLE, html)
+         if mobj is None:
+             raise ExtractorError(u'Cannot extract title')
+         title = unescapeHTML(mobj.group('title'))
+         mobj = re.search(self._MMS_STREAM, media_link)
+         if mobj is None:
+             mobj = re.search(self._RTSP_STREAM, media_link)
+             if mobj is None:
+                 raise ExtractorError(u'Cannot extract mms:// or rtsp:// URL')
+         mms_url = mobj.group('video_url')
+         mobj = re.search('(.*)[.](?P<ext>[^.]+)', mms_url)
+         if mobj is None:
+             raise ExtractorError(u'Cannot extract extention')
+         ext = mobj.group('ext')
+         return [{'id': video_id,
+                  'url': mms_url,
+                  'title': title,
+                  'ext': ext
+                  }]
  class TumblrIE(InfoExtractor):
      _VALID_URL = r'http://(?P<blog_name>.*?)\.tumblr\.com/((post)|(video))/(?P<id>\d*)/(.*?)'