]> Raphaël G. Git Repositories - youtubedl/commitdiff
Imported Upstream version 2010.10.03
authorRogério Brito <rbrito@ime.usp.br>
Sat, 18 Jun 2011 05:16:58 +0000 (02:16 -0300)
committerRogério Brito <rbrito@ime.usp.br>
Sat, 18 Jun 2011 05:16:58 +0000 (02:16 -0300)
.hg_archival.txt
.hgtags
LATEST_VERSION
youtube-dl

index 904d8f4aaf1d55833f53ac3b464f0c443c99943f..6f2bddf837683221769ebe96390885b59398c041 100644 (file)
@@ -1,2 +1,5 @@
 repo: f87cf8f2527c4adda57b14bd79a354f815164a41
 repo: f87cf8f2527c4adda57b14bd79a354f815164a41
-node: f8e09aa30813cd4a737893d5b6ede028ffa7fb75
+node: 190d2d0fd729eecabaf246813801f5228050e0ad
+branch: default
+latesttag: 2010.10.03
+latesttagdistance: 1
diff --git a/.hgtags b/.hgtags
index dd5e775863cde985cdcb7d84a5ae1358f484dce1..865c0b6a8dbaaa1798a18474226597296113559f 100644 (file)
--- a/.hgtags
+++ b/.hgtags
@@ -52,3 +52,5 @@ a44566779488ca70b9e1e7cf163e623744139a28 2010.07.14
 ad0c03e542656d8831c4ed3acda7de11d1c3f1c6 2010.07.14
 de50210f6416533d848b341642ad0c8193e22213 2010.07.22
 09a81c91ccebf3d9539c171e43e6e45e1dfbe6b8 2010.07.24
 ad0c03e542656d8831c4ed3acda7de11d1c3f1c6 2010.07.14
 de50210f6416533d848b341642ad0c8193e22213 2010.07.22
 09a81c91ccebf3d9539c171e43e6e45e1dfbe6b8 2010.07.24
+f8e09aa30813cd4a737893d5b6ede028ffa7fb75 2010.08.04
+3e9eb7881930db0dd1fb52ff16ab79c402621fe4 2010.10.03
index a4b357ab014cef9799090dfa3acc2486f9331447..92947daa5e956bbc4fa9f73ca09b38d41f0b6505 100644 (file)
@@ -1 +1 @@
-2010.08.04
+2010.10.03
index d5469495404ca1ca9640a0a619628c511edf4f59..51344f27be8932102674821016fb30506c155691 100755 (executable)
@@ -194,7 +194,7 @@ class FileDownloader(object):
        ignoreerrors:   Do not stop on download errors.
        ratelimit:      Download speed limit, in bytes/sec.
        nooverwrites:   Prevent overwriting files.
        ignoreerrors:   Do not stop on download errors.
        ratelimit:      Download speed limit, in bytes/sec.
        nooverwrites:   Prevent overwriting files.
-       retries:        Number of times to retry for HTTP error 503
+       retries:        Number of times to retry for HTTP error 5xx
        continuedl:     Try to continue downloads if possible.
        noprogress:     Do not print the progress bar.
        """
        continuedl:     Try to continue downloads if possible.
        noprogress:     Do not print the progress bar.
        """
@@ -353,12 +353,12 @@ class FileDownloader(object):
                                (percent_str, data_len_str, speed_str, eta_str), skip_eol=True)
 
        def report_resuming_byte(self, resume_len):
                                (percent_str, data_len_str, speed_str, eta_str), skip_eol=True)
 
        def report_resuming_byte(self, resume_len):
-               """Report attemtp to resume at given byte."""
+               """Report attempt to resume at given byte."""
                self.to_stdout(u'[download] Resuming download at byte %s' % resume_len)
        
        def report_retry(self, count, retries):
                self.to_stdout(u'[download] Resuming download at byte %s' % resume_len)
        
        def report_retry(self, count, retries):
-               """Report retry in case of HTTP error 503"""
-               self.to_stdout(u'[download] Got HTTP error 503. Retrying (attempt %d of %d)...' % (count, retries))
+               """Report retry in case of HTTP error 5xx"""
+               self.to_stdout(u'[download] Got server HTTP error. Retrying (attempt %d of %d)...' % (count, retries))
        
        def report_file_already_downloaded(self, file_name):
                """Report file has already been fully downloaded."""
        
        def report_file_already_downloaded(self, file_name):
                """Report file has already been fully downloaded."""
@@ -404,15 +404,16 @@ class FileDownloader(object):
                        template_dict['ord'] = unicode('%05d' % self._num_downloads)
                        filename = self.params['outtmpl'] % template_dict
                except (ValueError, KeyError), err:
                        template_dict['ord'] = unicode('%05d' % self._num_downloads)
                        filename = self.params['outtmpl'] % template_dict
                except (ValueError, KeyError), err:
-                       self.trouble('ERROR: invalid output template or system charset: %s' % str(err))
+                       self.trouble(u'ERROR: invalid system charset or erroneous output template')
+                       return
                if self.params.get('nooverwrites', False) and os.path.exists(filename):
                if self.params.get('nooverwrites', False) and os.path.exists(filename):
-                       self.to_stderr(u'WARNING: file exists: %s; skipping' % filename)
+                       self.to_stderr(u'WARNING: file exists and will be skipped')
                        return
 
                try:
                        self.pmkdir(filename)
                except (OSError, IOError), err:
                        return
 
                try:
                        self.pmkdir(filename)
                except (OSError, IOError), err:
-                       self.trouble('ERROR: unable to create directories: %s' % str(err))
+                       self.trouble(u'ERROR: unable to create directories: %s' % str(err))
                        return
 
                try:
                        return
 
                try:
@@ -420,17 +421,17 @@ class FileDownloader(object):
                except (OSError, IOError), err:
                        raise UnavailableVideoError
                except (urllib2.URLError, httplib.HTTPException, socket.error), err:
                except (OSError, IOError), err:
                        raise UnavailableVideoError
                except (urllib2.URLError, httplib.HTTPException, socket.error), err:
-                       self.trouble('ERROR: unable to download video data: %s' % str(err))
+                       self.trouble(u'ERROR: unable to download video data: %s' % str(err))
                        return
                except (ContentTooShortError, ), err:
                        return
                except (ContentTooShortError, ), err:
-                       self.trouble('ERROR: content too short (expected %s bytes and served %s)' % (err.expected, err.downloaded))
+                       self.trouble(u'ERROR: content too short (expected %s bytes and served %s)' % (err.expected, err.downloaded))
                        return
 
                if success:
                        try:
                                self.post_process(filename, info_dict)
                        except (PostProcessingError), err:
                        return
 
                if success:
                        try:
                                self.post_process(filename, info_dict)
                        except (PostProcessingError), err:
-                               self.trouble('ERROR: postprocessing: %s' % str(err))
+                               self.trouble(u'ERROR: postprocessing: %s' % str(err))
                                return
 
        def download(self, url_list):
                                return
 
        def download(self, url_list):
@@ -455,7 +456,7 @@ class FileDownloader(object):
                                break
 
                        if not suitable_found:
                                break
 
                        if not suitable_found:
-                               self.trouble('ERROR: no suitable InfoExtractor: %s' % url)
+                               self.trouble(u'ERROR: no suitable InfoExtractor: %s' % url)
 
                return self._download_retcode
 
 
                return self._download_retcode
 
@@ -495,7 +496,7 @@ class FileDownloader(object):
                        self.to_stdout(u'\r[rtmpdump] %s bytes' % os.path.getsize(filename))
                        return True
                else:
                        self.to_stdout(u'\r[rtmpdump] %s bytes' % os.path.getsize(filename))
                        return True
                else:
-                       self.trouble('\nERROR: rtmpdump exited with code %d' % retval)
+                       self.trouble(u'\nERROR: rtmpdump exited with code %d' % retval)
                        return False
 
        def _do_download(self, filename, url, player_url):
                        return False
 
        def _do_download(self, filename, url, player_url):
@@ -528,7 +529,7 @@ class FileDownloader(object):
                                data = urllib2.urlopen(request)
                                break
                        except (urllib2.HTTPError, ), err:
                                data = urllib2.urlopen(request)
                                break
                        except (urllib2.HTTPError, ), err:
-                               if err.code != 503 and err.code != 416:
+                               if (err.code < 500 or err.code >= 600) and err.code != 416:
                                        # Unexpected HTTP error
                                        raise
                                elif err.code == 416:
                                        # Unexpected HTTP error
                                        raise
                                elif err.code == 416:
@@ -538,7 +539,7 @@ class FileDownloader(object):
                                                data = urllib2.urlopen(basic_request)
                                                content_length = data.info()['Content-Length']
                                        except (urllib2.HTTPError, ), err:
                                                data = urllib2.urlopen(basic_request)
                                                content_length = data.info()['Content-Length']
                                        except (urllib2.HTTPError, ), err:
-                                               if err.code != 503:
+                                               if err.code < 500 or err.code >= 600:
                                                        raise
                                        else:
                                                # Examine the reported length
                                                        raise
                                        else:
                                                # Examine the reported length
@@ -588,12 +589,13 @@ class FileDownloader(object):
                                        (stream, filename) = sanitize_open(filename, open_mode)
                                        self.report_destination(filename)
                                except (OSError, IOError), err:
                                        (stream, filename) = sanitize_open(filename, open_mode)
                                        self.report_destination(filename)
                                except (OSError, IOError), err:
-                                       self.trouble('ERROR: unable to open for writing: %s' % str(err))
+                                       self.trouble(u'ERROR: unable to open for writing: %s' % str(err))
                                        return False
                        try:
                                stream.write(data_block)
                        except (IOError, OSError), err:
                                        return False
                        try:
                                stream.write(data_block)
                        except (IOError, OSError), err:
-                               self.trouble('\nERROR: unable to write data: %s' % str(err))
+                               self.trouble(u'\nERROR: unable to write data: %s' % str(err))
+                               return False
                        block_size = self.best_block_size(after - before, data_block_len)
 
                        # Progress message
                        block_size = self.best_block_size(after - before, data_block_len)
 
                        # Progress message
@@ -684,7 +686,7 @@ class InfoExtractor(object):
 class YoutubeIE(InfoExtractor):
        """Information extractor for youtube.com."""
 
 class YoutubeIE(InfoExtractor):
        """Information extractor for youtube.com."""
 
-       _VALID_URL = r'^((?:http://)?(?:youtu\.be/|(?:\w+\.)?youtube\.com/(?:(?:v/)|(?:(?:watch(?:_popup)?(?:\.php)?)?[\?#](?:.+&)?v=))))?([0-9A-Za-z_-]+)(?(1).+)?$'
+       _VALID_URL = r'^((?:http://)?(?:youtu\.be/|(?:\w+\.)?youtube(?:-nocookie)?\.com/(?:(?:v/)|(?:(?:watch(?:_popup)?(?:\.php)?)?(?:\?|#!?)(?:.+&)?v=))))?([0-9A-Za-z_-]+)(?(1).+)?$'
        _LANG_URL = r'http://www.youtube.com/?hl=en&persist_hl=1&gl=US&persist_gl=1&opt_out_ackd=1'
        _LOGIN_URL = 'http://www.youtube.com/signup?next=/&gl=US&hl=en'
        _AGE_URL = 'http://www.youtube.com/verify_age?next_url=/&gl=US&hl=en'
        _LANG_URL = r'http://www.youtube.com/?hl=en&persist_hl=1&gl=US&persist_gl=1&opt_out_ackd=1'
        _LOGIN_URL = 'http://www.youtube.com/signup?next=/&gl=US&hl=en'
        _AGE_URL = 'http://www.youtube.com/verify_age?next_url=/&gl=US&hl=en'
@@ -847,7 +849,7 @@ class YoutubeIE(InfoExtractor):
                                return
                if 'token' not in video_info:
                        if 'reason' in video_info:
                                return
                if 'token' not in video_info:
                        if 'reason' in video_info:
-                               self._downloader.trouble(u'ERROR: YouTube said: %s' % video_info['reason'][0])
+                               self._downloader.trouble(u'ERROR: YouTube said: %s' % video_info['reason'][0].decode('utf-8'))
                        else:
                                self._downloader.trouble(u'ERROR: "token" parameter not in video info for unknown reason')
                        return
                        else:
                                self._downloader.trouble(u'ERROR: "token" parameter not in video info for unknown reason')
                        return
@@ -1020,7 +1022,6 @@ class MetacafeIE(InfoExtractor):
                self._downloader.increment_downloads()
 
                simple_title = mobj.group(2).decode('utf-8')
                self._downloader.increment_downloads()
 
                simple_title = mobj.group(2).decode('utf-8')
-               video_extension = 'flv'
 
                # Retrieve video webpage to extract further information
                request = urllib2.Request('http://www.metacafe.com/watch/%s/' % video_id)
 
                # Retrieve video webpage to extract further information
                request = urllib2.Request('http://www.metacafe.com/watch/%s/' % video_id)
@@ -1034,20 +1035,33 @@ class MetacafeIE(InfoExtractor):
                # Extract URL, uploader and title from webpage
                self.report_extraction(video_id)
                mobj = re.search(r'(?m)&mediaURL=([^&]+)', webpage)
                # Extract URL, uploader and title from webpage
                self.report_extraction(video_id)
                mobj = re.search(r'(?m)&mediaURL=([^&]+)', webpage)
-               if mobj is None:
-                       self._downloader.trouble(u'ERROR: unable to extract media URL')
-                       return
-               mediaURL = urllib.unquote(mobj.group(1))
-
-               # Extract gdaKey if available
-               mobj = re.search(r'(?m)&gdaKey=(.*?)&', webpage)
-               if mobj is None:
-                       video_url = mediaURL
-                       #self._downloader.trouble(u'ERROR: unable to extract gdaKey')
-                       #return
+               if mobj is not None:
+                       mediaURL = urllib.unquote(mobj.group(1))
+                       video_extension = mediaURL[-3:]
+                       
+                       # Extract gdaKey if available
+                       mobj = re.search(r'(?m)&gdaKey=(.*?)&', webpage)
+                       if mobj is None:
+                               video_url = mediaURL
+                       else:
+                               gdaKey = mobj.group(1)
+                               video_url = '%s?__gda__=%s' % (mediaURL, gdaKey)
                else:
                else:
-                       gdaKey = mobj.group(1)
-                       video_url = '%s?__gda__=%s' % (mediaURL, gdaKey)
+                       mobj = re.search(r' name="flashvars" value="(.*?)"', webpage)
+                       if mobj is None:
+                               self._downloader.trouble(u'ERROR: unable to extract media URL')
+                               return
+                       vardict = parse_qs(mobj.group(1))
+                       if 'mediaData' not in vardict:
+                               self._downloader.trouble(u'ERROR: unable to extract media URL')
+                               return
+                       mobj = re.search(r'"mediaURL":"(http.*?)","key":"(.*?)"', vardict['mediaData'][0])
+                       if mobj is None:
+                               self._downloader.trouble(u'ERROR: unable to extract media URL')
+                               return
+                       mediaURL = mobj.group(1).replace('\\/', '/')
+                       video_extension = mediaURL[-3:]
+                       video_url = '%s?__gda__=%s' % (mediaURL, mobj.group(2))
 
                mobj = re.search(r'(?im)<title>(.*) - Video</title>', webpage)
                if mobj is None:
 
                mobj = re.search(r'(?im)<title>(.*) - Video</title>', webpage)
                if mobj is None:
@@ -1144,7 +1158,7 @@ class DailymotionIE(InfoExtractor):
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
 
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
 
-               mobj = re.search(r'(?im)<div class="dmco_html owner">.*?<a class="name" href="/.+?">(.+?)</a></div>', webpage)
+               mobj = re.search(r'(?im)<div class="dmco_html owner">.*?<a class="name" href="/.+?">(.+?)</a>', webpage)
                if mobj is None:
                        self._downloader.trouble(u'ERROR: unable to extract uploader nickname')
                        return
                if mobj is None:
                        self._downloader.trouble(u'ERROR: unable to extract uploader nickname')
                        return
@@ -2087,7 +2101,7 @@ if __name__ == '__main__':
                # Parse command line
                parser = optparse.OptionParser(
                        usage='Usage: %prog [options] url...',
                # Parse command line
                parser = optparse.OptionParser(
                        usage='Usage: %prog [options] url...',
-                       version='2010.08.04',
+                       version='2010.10.03',
                        conflict_handler='resolve',
                )
 
                        conflict_handler='resolve',
                )