From: Rogério Brito Date: Thu, 14 Oct 2010 04:58:24 +0000 (-0700) Subject: Imported Debian patch 2010.10.03-1 X-Git-Url: https://git.rapsys.eu/.gitweb.cgi/youtubedl/commitdiff_plain/d3379076f5a45504e2d1a17d4ebed629f2da1b9f?hp=e7458a16b7276e81849ba40edb6b672c41aa23e2 Imported Debian patch 2010.10.03-1 --- diff --git a/.hg_archival.txt b/.hg_archival.txt index 904d8f4..6f2bddf 100644 --- a/.hg_archival.txt +++ b/.hg_archival.txt @@ -1,2 +1,5 @@ repo: f87cf8f2527c4adda57b14bd79a354f815164a41 -node: f8e09aa30813cd4a737893d5b6ede028ffa7fb75 +node: 190d2d0fd729eecabaf246813801f5228050e0ad +branch: default +latesttag: 2010.10.03 +latesttagdistance: 1 diff --git a/.hgtags b/.hgtags index dd5e775..865c0b6 100644 --- a/.hgtags +++ b/.hgtags @@ -52,3 +52,5 @@ a44566779488ca70b9e1e7cf163e623744139a28 2010.07.14 ad0c03e542656d8831c4ed3acda7de11d1c3f1c6 2010.07.14 de50210f6416533d848b341642ad0c8193e22213 2010.07.22 09a81c91ccebf3d9539c171e43e6e45e1dfbe6b8 2010.07.24 +f8e09aa30813cd4a737893d5b6ede028ffa7fb75 2010.08.04 +3e9eb7881930db0dd1fb52ff16ab79c402621fe4 2010.10.03 diff --git a/LATEST_VERSION b/LATEST_VERSION index a4b357a..92947da 100644 --- a/LATEST_VERSION +++ b/LATEST_VERSION @@ -1 +1 @@ -2010.08.04 +2010.10.03 diff --git a/debian/changelog b/debian/changelog index bb70b7c..63bdb92 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,24 @@ +youtube-dl (2010.10.03-1) unstable; urgency=low + + * The "upload from sunny California" release + * New upstream release: + + Downloading manually the release 2010.10.03 corresponding to + http://bitbucket.org/rg3/youtube-dl/changeset/190d2d0fd729 + + Abort downloads that can't be written to the disk + + Fix downloading some videos from metacafe.com + + Try to discover the video extension from metacafe.com + + Allow #! in youtube urls + + Fix extraction of uploader nickname on dailymotion + + Support downloads from youtube-nocookie.com urls + + Code improvements in general + + Retry that fail with codes 5xx on youtube + * debian/patches/*: + + rename 01-add-support-to-webm.patch to 01-prefer-open-formats.patch + + update the patch to apply to new versions of youtube-dl + + re-enable the patch to give preference to webm videos + + -- Rogério Brito Wed, 13 Oct 2010 21:58:24 -0700 + youtube-dl (2010.08.04-1) unstable; urgency=low * New upstream release: diff --git a/debian/patches/01-add-support-to-webm.patch b/debian/patches/01-prefer-open-formats.patch similarity index 72% rename from debian/patches/01-add-support-to-webm.patch rename to debian/patches/01-prefer-open-formats.patch index 6ff4ac7..06b8020 100644 --- a/debian/patches/01-add-support-to-webm.patch +++ b/debian/patches/01-prefer-open-formats.patch @@ -1,16 +1,16 @@ Description: Give preference to open video formats Author: Rogério Brito Forwarded: no -Last-Update: 2010-07-14 +Last-Update: 2010-10-13 --- a/youtube-dl +++ b/youtube-dl -@@ -689,7 +689,7 @@ +@@ -692,7 +692,7 @@ _AGE_URL = 'http://www.youtube.com/verify_age?next_url=/&gl=US&hl=en' _NETRC_MACHINE = 'youtube' - # Listed in order of priority for the -b option -- _available_formats = ['38', '37', '22', '45', '35', '34', '43', '18', '6', '5', '17', '13', None] -+ _available_formats = ['38', '37', '45', '22', '43', '35', '34', '18', '6', '5', '17', '13', None] + # Listed in order of quality +- _available_formats = ['38', '37', '22', '45', '35', '34', '43', '18', '6', '5', '17', '13'] ++ _available_formats = ['38', '37', '45', '22', '43', '35', '34', '18', '6', '5', '17', '13'] _video_extensions = { '13': '3gp', '17': 'mp4', diff --git a/debian/patches/series b/debian/patches/series index 4c4b914..b8d50b5 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1 @@ -#01-add-support-to-webm.patch +01-prefer-open-formats.patch diff --git a/youtube-dl b/youtube-dl index d546949..51344f2 100755 --- a/youtube-dl +++ b/youtube-dl @@ -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. - 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. """ @@ -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): - """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): - """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.""" @@ -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: - 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): - 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: - self.trouble('ERROR: unable to create directories: %s' % str(err)) + self.trouble(u'ERROR: unable to create directories: %s' % str(err)) return try: @@ -420,17 +421,17 @@ class FileDownloader(object): 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: - 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: - self.trouble('ERROR: postprocessing: %s' % str(err)) + self.trouble(u'ERROR: postprocessing: %s' % str(err)) return def download(self, url_list): @@ -455,7 +456,7 @@ class FileDownloader(object): 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 @@ -495,7 +496,7 @@ class FileDownloader(object): 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): @@ -528,7 +529,7 @@ class FileDownloader(object): 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: @@ -538,7 +539,7 @@ class FileDownloader(object): 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 @@ -588,12 +589,13 @@ class FileDownloader(object): (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: - 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 @@ -684,7 +686,7 @@ class InfoExtractor(object): 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' @@ -847,7 +849,7 @@ class YoutubeIE(InfoExtractor): 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 @@ -1020,7 +1022,6 @@ class MetacafeIE(InfoExtractor): 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) @@ -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) - 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: - 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)(.*) - Video', 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) - mobj = re.search(r'(?im)', webpage) + mobj = re.search(r'(?im)
.*?(.+?)', webpage) 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...', - version='2010.08.04', + version='2010.10.03', conflict_handler='resolve', )