From: Rogério Brito Date: Mon, 9 Aug 2010 17:27:41 +0000 (-0400) Subject: Imported Debian patch 2010.08.04-1 X-Git-Url: https://git.rapsys.eu/youtubedl/commitdiff_plain/e7458a16b7276e81849ba40edb6b672c41aa23e2?hp=46ef599ac108f9d54c9d505ef1ac1c62dde6bbbe Imported Debian patch 2010.08.04-1 --- diff --git a/.hg_archival.txt b/.hg_archival.txt index 9cc3795..904d8f4 100644 --- a/.hg_archival.txt +++ b/.hg_archival.txt @@ -1,2 +1,2 @@ repo: f87cf8f2527c4adda57b14bd79a354f815164a41 -node: 09a81c91ccebf3d9539c171e43e6e45e1dfbe6b8 +node: f8e09aa30813cd4a737893d5b6ede028ffa7fb75 diff --git a/.hgtags b/.hgtags index ee712c1..dd5e775 100644 --- a/.hgtags +++ b/.hgtags @@ -51,3 +51,4 @@ a44566779488ca70b9e1e7cf163e623744139a28 2010.07.14 0000000000000000000000000000000000000000 2010.07.14 ad0c03e542656d8831c4ed3acda7de11d1c3f1c6 2010.07.14 de50210f6416533d848b341642ad0c8193e22213 2010.07.22 +09a81c91ccebf3d9539c171e43e6e45e1dfbe6b8 2010.07.24 diff --git a/LATEST_VERSION b/LATEST_VERSION index 9603881..a4b357a 100644 --- a/LATEST_VERSION +++ b/LATEST_VERSION @@ -1 +1 @@ -2010.07.24 +2010.08.04 diff --git a/debian/changelog b/debian/changelog index 550e862..bb70b7c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,23 @@ +youtube-dl (2010.08.04-1) unstable; urgency=low + + * New upstream release: + + Fix metacafe.com code not working due to gdaKey again + + Add option (--playlist-start) to specify the initial video for playlists + + Put back -b option as a placeholder with a warning message + + Consider the file downloaded if the size differs in less than 100 bytes + + Reorganize request code to make it a bit more robust + + Properly detect YouTube error messages to print them on screen + * debian/control: + + Remove suggests on gst-p-b (>= 0.10.18.3-2) + + The package complies with Policy 3.9.1 without any other changes. + * debian/watch: + + Remove commented lines. + * debian/youtube-dl.pod: + + Update the manpage to include newer options. + + Don't mention removed options anymore. Closes: #590825, #592368. + + -- Rogério Brito Mon, 09 Aug 2010 13:27:41 -0400 + youtube-dl (2010.07.24-1) unstable; urgency=medium * Urgency medium due to changes in the site that broke earlier versions. diff --git a/debian/control b/debian/control index 1912b3e..161edd0 100644 --- a/debian/control +++ b/debian/control @@ -3,14 +3,14 @@ Section: web Priority: extra Maintainer: Rogério Brito Build-Depends: debhelper (>= 7) -Standards-Version: 3.9.0 +Standards-Version: 3.9.1 DM-Upload-Allowed: yes Homepage: http://bitbucket.org/rg3/youtube-dl/ Package: youtube-dl Architecture: all Depends: python (>= 2.4), ${misc:Depends} -Suggests: rtmpdump, gstreamer0.10-plugins-bad (>= 0.10.18.3-2) +Suggests: rtmpdump Description: download videos from youtube youtube-dl is a small command-line program to download videos from YouTube.com and other sites that don't provide direct links to the diff --git a/debian/watch b/debian/watch index 68c1d1e..d0c3659 100644 --- a/debian/watch +++ b/debian/watch @@ -1,6 +1,2 @@ version=3 -# -#http://bitbucket.org/rg3/youtube-dl/wiki/Home http://bitbucket.org/rg3/youtube-dl/raw/(.*)/youtube-dl -#http://bitbucket.org/rg3/youtube-dl/get/(.*).gz -# http://bitbucket.org/rg3/youtube-dl/downloads/ (?:.*/)?(\d+\.\d+\.\d+)\.tar\.gz diff --git a/debian/youtube-dl.1 b/debian/youtube-dl.1 index 13af732..7d8657a 100644 --- a/debian/youtube-dl.1 +++ b/debian/youtube-dl.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "YOUTUBE-DL 1" -.TH YOUTUBE-DL 1 "2009-11-19" "perl v5.10.1" "User Commands" +.TH YOUTUBE-DL 1 "2010-08-09" "youtube-dl" "User Commands" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -163,12 +163,18 @@ Print help text and exit. .IP "\-v, \-\-version" 4 .IX Item "-v, --version" Print program version and exit. +.IP "\-U, \-\-update" 4 +.IX Item "-U, --update" +Update this program to the latest stable version. .IP "\-i, \-\-ignore\-errors" 4 .IX Item "-i, --ignore-errors" Ignore errors during download and continue processing. .IP "\-r \fBL\fR, \-\-rate\-limit=\fBL\fR" 4 .IX Item "-r L, --rate-limit=L" Limit the download speed to the specified maximum \fBL\fR (e.g., 50k or 44.6m). +.IP "\-R \fBR\fR, \-\-retries=\fBR\fR" 4 +.IX Item "-R R, --retries=R" +Number \fBR\fR of retries for a given download (default is 10). .IP "\-u \fB\s-1UN\s0\fR, \-\-username=\fB\s-1UN\s0\fR" 4 .IX Item "-u UN, --username=UN" Specify the youtube account username \fB\s-1UN\s0\fR. Some videos require an @@ -180,23 +186,25 @@ Like the username, specifies the account password to be \fB\s-1PW\s0\fR. .IP "\-n, \-\-netrc" 4 .IX Item "-n, --netrc" Get authentication data from the standard unix .netrc file on the user's -home directory. The machine name is youtube in regarding this usage. -.IP "\-f \s-1FMT\s0, \-\-format=FMT" 4 +home directory. The machine name is youtube regarding this usage. +.IP "\-f \fB\s-1FMT\s0\fR, \-\-format=\fB\s-1FMT\s0\fR" 4 .IX Item "-f FMT, --format=FMT" Specify the video format (quality) in which to download the video. Note that not all videos are available in all formats. .IP "\-b, \-\-best\-quality" 4 .IX Item "-b, --best-quality" -Download the best video quality available for the video(s) specified by -the user. +This option is deprecated, does nothing currently, and is expected to be +removed in a next release, as it is the current behavior of youtube-dl. .IP "\-m, \-\-mobile\-version" 4 .IX Item "-m, --mobile-version" Synonymous to the option \*(L"\-f 17\*(R", to download videos playable on some mobile phones. -.IP "\-d, \-\-high\-def" 4 -.IX Item "-d, --high-def" -Synonymous to the option \*(L"\-f 37\*(R", to download videos in \s-1HD\s0 quality -(1080p). +.IP "\-\-all\-formats" 4 +.IX Item "--all-formats" +Downloads all formats for which a video may be available. +.IP "\-\-max\-quality=\fB\s-1FMT\s0\fR" 4 +.IX Item "--max-quality=FMT" +Limit the maximum quality of the videos to downloads to \fB\s-1FMT\s0\fR. .IP "\-q, \-\-quiet" 4 .IX Item "-q, --quiet" Activates quiet mode, avoiding many messages being written to the @@ -214,6 +222,17 @@ wget or aria2c. .IX Item "-e, --get-title" Simulate the operation, like quiet mode, but show the title of the video that would be downloaded. +.IP "\-\-get\-thumbnail" 4 +.IX Item "--get-thumbnail" +Simulate the operation, like quiet mode, but print the \s-1URL\s0 of of the video's +thumbnail. +.IP "\-\-get\-description" 4 +.IX Item "--get-description" +Simulate the operation, like quiet mode, but print the description of the +video. +.IP "\-\-no\-progress" 4 +.IX Item "--no-progress" +Do not print the progress bar during downloads. .IP "\-t, \-\-title" 4 .IX Item "-t, --title" Use the title of the video in the file name used to download the video. @@ -281,5 +300,5 @@ like \f(CW\*(C`%(title)s\-%(id)s.%(ext)s\*(C'\fR. You can specify your own. .SH "AUTHOR" .IX Header "AUTHOR" youtube-dl was written by Ricardo Garcia Gonzalez and many contributors -from all around the internet. This manpage was written by RogA\*~Xrio Brito +from all around the internet. This manpage was written by Rogerio Brito . diff --git a/debian/youtube-dl.pod b/debian/youtube-dl.pod index db8eb67..e8588f0 100644 --- a/debian/youtube-dl.pod +++ b/debian/youtube-dl.pod @@ -38,6 +38,10 @@ Print help text and exit. Print program version and exit. +=item -U, --update + +Update this program to the latest stable version. + =item -i, --ignore-errors Ignore errors during download and continue processing. @@ -46,6 +50,10 @@ Ignore errors during download and continue processing. Limit the download speed to the specified maximum B (e.g., 50k or 44.6m). +=item -R B, --retries=B + +Number B of retries for a given download (default is 10). + =item -u B, --username=B Specify the youtube account username B. Some videos require an @@ -59,27 +67,30 @@ Like the username, specifies the account password to be B. =item -n, --netrc Get authentication data from the standard unix .netrc file on the user's -home directory. The machine name is youtube in regarding this usage. +home directory. The machine name is youtube regarding this usage. -=item -f FMT, --format=FMT +=item -f B, --format=B Specify the video format (quality) in which to download the video. Note that not all videos are available in all formats. =item -b, --best-quality -Download the best video quality available for the video(s) specified by -the user. +This option is deprecated, does nothing currently, and is expected to be +removed in a next release, as it is the current behavior of youtube-dl. =item -m, --mobile-version Synonymous to the option "-f 17", to download videos playable on some mobile phones. -=item -d, --high-def +=item --all-formats + +Downloads all formats for which a video may be available. + +=item --max-quality=B -Synonymous to the option "-f 37", to download videos in HD quality -(1080p). +Limit the maximum quality of the videos to downloads to B. =item -q, --quiet @@ -102,6 +113,20 @@ wget or aria2c. Simulate the operation, like quiet mode, but show the title of the video that would be downloaded. +=item --get-thumbnail + +Simulate the operation, like quiet mode, but print the URL of of the video's +thumbnail. + +=item --get-description + +Simulate the operation, like quiet mode, but print the description of the +video. + +=item --no-progress + +Do not print the progress bar during downloads. + =item -t, --title Use the title of the video in the file name used to download the video. @@ -189,7 +214,7 @@ like C<%(title)s-%(id)s.%(ext)s>. You can specify your own. =head1 AUTHOR youtube-dl was written by Ricardo Garcia Gonzalez and many contributors -from all around the internet. This manpage was written by Rogério Brito +from all around the internet. This manpage was written by Rogerio Brito . =cut diff --git a/youtube-dl b/youtube-dl index 48c13b7..d546949 100755 --- a/youtube-dl +++ b/youtube-dl @@ -27,7 +27,7 @@ except ImportError: from cgi import parse_qs std_headers = { - 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100720 Firefox/3.6.7', + 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100723 Firefox/3.6.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5', @@ -287,16 +287,6 @@ class FileDownloader(object): multiplier = 1024.0 ** 'bkmgtpezy'.index(matchobj.group(2).lower()) return long(round(number * multiplier)) - @staticmethod - def verify_url(url): - """Verify a URL is valid and data could be downloaded. Return real data URL.""" - request = urllib2.Request(url, None, std_headers) - data = urllib2.urlopen(request) - data.read(1) - url = data.geturl() - data.close() - return url - def add_info_extractor(self, ie): """Add an InfoExtractor object to the end of the list.""" self._ies.append(ie) @@ -396,13 +386,6 @@ class FileDownloader(object): """Process a single dictionary returned by an InfoExtractor.""" # Do nothing else if in simulate mode if self.params.get('simulate', False): - # Verify URL if it's an HTTP one - if info_dict['url'].startswith('http'): - try: - self.verify_url(info_dict['url'].encode('utf-8')).decode('utf-8') - except (OSError, IOError, urllib2.URLError, httplib.HTTPException, socket.error), err: - raise UnavailableVideoError - # Forced printings if self.params.get('forcetitle', False): print info_dict['title'].encode(preferredencoding(), 'xmlcharrefreplace') @@ -539,32 +522,50 @@ class FileDownloader(object): count = 0 retries = self.params.get('retries', 0) - while True: + while count <= retries: # Establish connection try: data = urllib2.urlopen(request) break except (urllib2.HTTPError, ), err: - if err.code == 503: - # Retry in case of HTTP error 503 - count += 1 - if count <= retries: - self.report_retry(count, retries) - continue - if err.code != 416: # 416 is 'Requested range not satisfiable' + if err.code != 503 and err.code != 416: + # Unexpected HTTP error raise - # Unable to resume - data = urllib2.urlopen(basic_request) - content_length = data.info()['Content-Length'] - - if content_length is not None and long(content_length) == resume_len: - # Because the file had already been fully downloaded - self.report_file_already_downloaded(filename) - return True - else: - # Because the server didn't let us - self.report_unable_to_resume() - open_mode = 'wb' + elif err.code == 416: + # Unable to resume (requested range not satisfiable) + try: + # Open the connection again without the range header + data = urllib2.urlopen(basic_request) + content_length = data.info()['Content-Length'] + except (urllib2.HTTPError, ), err: + if err.code != 503: + raise + else: + # Examine the reported length + if (content_length is not None and + (resume_len - 100 < long(content_length) < resume_len + 100)): + # The file had already been fully downloaded. + # Explanation to the above condition: in issue #175 it was revealed that + # YouTube sometimes adds or removes a few bytes from the end of the file, + # changing the file size slightly and causing problems for some users. So + # I decided to implement a suggested change and consider the file + # completely downloaded if the file size differs less than 100 bytes from + # the one in the hard drive. + self.report_file_already_downloaded(filename) + return True + else: + # The length does not match, we start the download over + self.report_unable_to_resume() + open_mode = 'wb' + break + # Retry + count += 1 + if count <= retries: + self.report_retry(count, retries) + + if count > retries: + self.trouble(u'ERROR: giving up after %s retries' % retries) + return False data_len = data.info().get('Content-length', None) data_len_str = self.format_bytes(data_len) @@ -844,6 +845,14 @@ class YoutubeIE(InfoExtractor): except (urllib2.URLError, httplib.HTTPException, socket.error), err: self._downloader.trouble(u'ERROR: unable to download video info webpage: %s' % str(err)) return + if 'token' not in video_info: + if 'reason' in video_info: + self._downloader.trouble(u'ERROR: YouTube said: %s' % video_info['reason'][0]) + else: + self._downloader.trouble(u'ERROR: "token" parameter not in video info for unknown reason') + return + + # Start extracting information self.report_information_extraction(video_id) # uploader @@ -1030,15 +1039,15 @@ class MetacafeIE(InfoExtractor): return mediaURL = urllib.unquote(mobj.group(1)) - #mobj = re.search(r'(?m)&gdaKey=(.*?)&', webpage) - #if mobj is None: - # self._downloader.trouble(u'ERROR: unable to extract gdaKey') - # return - #gdaKey = mobj.group(1) - # - #video_url = '%s?__gda__=%s' % (mediaURL, gdaKey) - - video_url = mediaURL + # 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 + else: + gdaKey = mobj.group(1) + video_url = '%s?__gda__=%s' % (mediaURL, gdaKey) mobj = re.search(r'(?im)(.*) - Video', webpage) if mobj is None: @@ -1932,6 +1941,11 @@ class YoutubePlaylistIE(InfoExtractor): break pagenum = pagenum + 1 + playliststart = self._downloader.params.get('playliststart', 1) + playliststart -= 1 #our arrays are zero-based but the playlist is 1-based + if playliststart > 0: + video_ids = video_ids[playliststart:] + for id in video_ids: self._youtube_ie.extract('http://www.youtube.com/watch?v=%s' % id) return @@ -1987,6 +2001,11 @@ class YoutubeUserIE(InfoExtractor): ids_in_page.append(mobj.group(1)) video_ids.extend(ids_in_page) + playliststart = self._downloader.params.get('playliststart', 1) + playliststart = playliststart-1 #our arrays are zero-based but the playlist is 1-based + if playliststart > 0: + video_ids = video_ids[playliststart:] + for id in video_ids: self._youtube_ie.extract('http://www.youtube.com/watch?v=%s' % id) return @@ -2068,7 +2087,7 @@ if __name__ == '__main__': # Parse command line parser = optparse.OptionParser( usage='Usage: %prog [options] url...', - version='2010.07.24', + version='2010.08.04', conflict_handler='resolve', ) @@ -2084,6 +2103,8 @@ if __name__ == '__main__': dest='ratelimit', metavar='LIMIT', help='download rate limit (e.g. 50k or 44.6m)') parser.add_option('-R', '--retries', dest='retries', metavar='RETRIES', help='number of retries (default is 10)', default=10) + parser.add_option('--playlist-start', + dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is 1)', default=1) authentication = optparse.OptionGroup(parser, 'Authentication Options') authentication.add_option('-u', '--username', @@ -2103,6 +2124,8 @@ if __name__ == '__main__': action='store_const', dest='format', help='download all available video formats', const='-1') video_format.add_option('--max-quality', action='store', dest='format_limit', metavar='FORMAT', help='highest quality format to download') + video_format.add_option('-b', '--best-quality', + action='store_true', dest='bestquality', help='download the best video quality (DEPRECATED)') parser.add_option_group(video_format) verbosity = optparse.OptionGroup(parser, 'Verbosity / Simulation Options') @@ -2155,6 +2178,8 @@ if __name__ == '__main__': all_urls = batchurls + args # Conflicting, missing and erroneous options + if opts.bestquality: + print >>sys.stderr, u'\nWARNING: -b/--best-quality IS DEPRECATED AS IT IS THE DEFAULT BEHAVIOR NOW\n' if opts.usenetrc and (opts.username is not None or opts.password is not None): parser.error(u'using .netrc conflicts with giving username/password') if opts.password is not None and opts.username is None: @@ -2175,6 +2200,11 @@ if __name__ == '__main__': opts.retries = long(opts.retries) except (TypeError, ValueError), err: parser.error(u'invalid retry count specified') + if opts.playliststart is not None: + try: + opts.playliststart = long(opts.playliststart) + except (TypeError, ValueError), err: + parser.error(u'invalid playlist page specified') # Information extractors youtube_ie = YoutubeIE() @@ -2216,6 +2246,7 @@ if __name__ == '__main__': 'retries': opts.retries, 'continuedl': opts.continue_dl, 'noprogress': opts.noprogress, + 'playliststart': opts.playliststart, }) fd.add_info_extractor(youtube_search_ie) fd.add_info_extractor(youtube_pl_ie)