[youtube-dl/f14/master] Update to latest release

Till Maas till at fedoraproject.org
Thu Aug 5 14:17:09 UTC 2010


commit 5cb95ac1b8c0cb4b66870ab1cb032ed07cff1ee0
Author: Till Maas <opensource at till.name>
Date:   Thu Aug 5 13:40:16 2010 +0200

    Update to latest release
    
    remove unused index.html

 Home            |   54 +++---
 index.html      |  527 -------------------------------------------------------
 youtube-dl      |  147 ++++++++++------
 youtube-dl.spec |    5 +-
 4 files changed, 123 insertions(+), 610 deletions(-)
---
diff --git a/Home b/Home
index aa132b1..e7bce9a 100644
--- a/Home
+++ b/Home
@@ -53,7 +53,7 @@
 	</script>
 	<![endif]-->
 	
-	<link rel="stylesheet" href="http://bitbucket-assets.s3.amazonaws.com/css/highlight/trac.css" type="text/css" />
+	<link rel="stylesheet" href="http://bitbucket-assets.s3.amazonaws.com/css/highlight/default.css" type="text/css" />
 	<script type="text/javascript">
 		$(document).ready(function() {
 			$('#wiki table:not(.highlighttable)').addClass('wikitable');
@@ -177,7 +177,7 @@
 		
 			
 				<li class="ui-tabs-nav-issues">
-					<a href="/rg3/youtube-dl/issues?status=new&amp;status=open"><span>Issues (17) &raquo;</span></a>
+					<a href="/rg3/youtube-dl/issues?status=new&amp;status=open"><span>Issues (15) &raquo;</span></a>
 					<ul>
 						<li><a href="/rg3/youtube-dl/issues?status=new">New issues</a></li>
 						<li><a href="/rg3/youtube-dl/issues?status=new&amp;status=open">Open issues</a></li>
@@ -196,11 +196,11 @@
 		
 		
 		<li class="tabs-right tabs-far-right">
-			<a href="/rg3/youtube-dl/descendants"><span>Forks/Queues (11)</span></a>
+			<a href="/rg3/youtube-dl/descendants"><span>Forks/Queues (12)</span></a>
 		</li>
 		
 		<li class="tabs-right">
-			<a href="/rg3/youtube-dl/zealots"><span>Followers (78)</span></a>
+			<a href="/rg3/youtube-dl/zealots"><span>Followers (85)</span></a>
 		</li>
 	</ul>
 </div>
@@ -235,9 +235,9 @@
 					<ul>
 						
 						
-							<li><a rel="nofollow" href="/rg3/youtube-dl/get/3c59d266a04b.zip" class="zip">zip</a></li>
-							<li><a rel="nofollow" href="/rg3/youtube-dl/get/3c59d266a04b.gz" class="compressed">gz</a></li>
-							<li><a rel="nofollow" href="/rg3/youtube-dl/get/3c59d266a04b.bz2" class="compressed">bz2</a></li>
+							<li><a rel="nofollow" href="/rg3/youtube-dl/get/2df34df5ff7d.zip" class="zip">zip</a></li>
+							<li><a rel="nofollow" href="/rg3/youtube-dl/get/2df34df5ff7d.gz" class="compressed">gz</a></li>
+							<li><a rel="nofollow" href="/rg3/youtube-dl/get/2df34df5ff7d.bz2" class="compressed">bz2</a></li>
 						
 						
 					</ul>
@@ -253,7 +253,7 @@
 					
 					<ul>
 					
-						<li><a href="/rg3/youtube-dl/src/3c59d266a04b">default</a></li>
+						<li><a href="/rg3/youtube-dl/src/2df34df5ff7d">default</a></li>
 					
 					</ul>
 					
@@ -263,11 +263,13 @@
 					
 					<ul>
 					
-						<li><a href="/rg3/youtube-dl/src/3c59d266a04b">tip</a></li>
+						<li><a href="/rg3/youtube-dl/src/2df34df5ff7d">tip</a></li>
 					
-						<li><a href="/rg3/youtube-dl/src/de50210f6416">2010.07.22</a></li>
+						<li><a href="/rg3/youtube-dl/src/f8e09aa30813">2010.08.04</a></li>
+					
+						<li><a href="/rg3/youtube-dl/src/09a81c91cceb">2010.07.24</a></li>
 					
-						<li><a href="/rg3/youtube-dl/src/ad0c03e54265">2010.07.14</a></li>
+						<li><a href="/rg3/youtube-dl/src/de50210f6416">2010.07.22</a></li>
 					
 						<li><a href="/rg3/youtube-dl/src/ebc3c1a8ea94">2010.06.06</a></li>
 					
@@ -281,8 +283,6 @@
 					
 						<li><a href="/rg3/youtube-dl/src/c69858fd4850">2010.03.07</a></li>
 					
-						<li><a href="/rg3/youtube-dl/src/93ff6dceb3da">2010.02.13</a></li>
-					
 						<li><a href="/rg3/youtube-dl/src/9ade3c8f7a53">2010.01.19</a></li>
 					
 						<li><a href="/rg3/youtube-dl/src/eabc9bc8ab3c">2009.12.26</a></li>
@@ -348,9 +348,9 @@
 					<ul>
 						
 						
-							<li><a rel="nofollow" href="/rg3/youtube-dl/get/3c59d266a04b.zip" class="zip">zip</a></li>
-							<li><a rel="nofollow" href="/rg3/youtube-dl/get/3c59d266a04b.gz" class="compressed">gz</a></li>
-							<li><a rel="nofollow" href="/rg3/youtube-dl/get/3c59d266a04b.bz2" class="compressed">bz2</a></li>
+							<li><a rel="nofollow" href="/rg3/youtube-dl/get/2df34df5ff7d.zip" class="zip">zip</a></li>
+							<li><a rel="nofollow" href="/rg3/youtube-dl/get/2df34df5ff7d.gz" class="compressed">gz</a></li>
+							<li><a rel="nofollow" href="/rg3/youtube-dl/get/2df34df5ff7d.bz2" class="compressed">bz2</a></li>
 						
 						
 					</ul>
@@ -371,7 +371,7 @@
 		
 		<p class="repo-desc-description">youtube-dl is a small command-line program for downloading videos from <a href="http://YouTube.com" rel="nofollow">YouTube.com</a>.</p>
 		
-		<div id="repo-desc-cloneinfo">Clone this repository (size: 296.3 KB): <a href="http://bitbucket.org/rg3/youtube-dl" onclick="$('#clone-url-ssh').hide();$('#clone-url-https').toggle();return(false);"><small>HTTPS</small></a> / <a href="ssh://hg@bitbucket.org/rg3/youtube-dl" onclick="$('#clone-url-https').hide();$('#clone-url-ssh').toggle();return(false);"><small>SSH</small></a><br/>
+		<div id="repo-desc-cloneinfo">Clone this repository (size: 313.2 KB): <a href="http://bitbucket.org/rg3/youtube-dl" onclick="$('#clone-url-ssh').hide();$('#clone-url-https').toggle();return(false);"><small>HTTPS</small></a> / <a href="ssh://hg@bitbucket.org/rg3/youtube-dl" onclick="$('#clone-url-https').hide();$('#clone-url-ssh').toggle();return(false);"><small>SSH</small></a><br/>
 		<pre id="clone-url-https">$ hg clone <a href="http://bitbucket.org/rg3/youtube-dl">http://bitbucket.org/rg3/youtube-dl</a></pre>
 		
 		<pre id="clone-url-ssh" style="display:none;">$ hg clone <a href="ssh://hg@bitbucket.org/rg3/youtube-dl">ssh://hg@bitbucket.org/rg3/youtube-dl</a></pre></div>
@@ -413,7 +413,7 @@
 <h1 id="youtube-dl-download-videos-from-youtubecom">youtube-dl: Download videos from YouTube.com</h1>
 <p>(and more...)</p>
 <h2 id="what-is-it">What is it?</h2>
-<p><em>youtube-dl</em> is a small command-line program to download videos from YouTube.com and a few more sites. It requires the <a href="http://www.python.org/">Python interpreter</a>, version 2.x (x being at least 4), and it's not platform specific. It should work in your Unix box, in Windows or in Mac OS X. The latest version is <strong>2010.07.22</strong>. It's released to the public domain, which means you can modify it, redistribute it or use it however you like.</p>
+<p><em>youtube-dl</em> is a small command-line program to download videos from YouTube.com and a few more sites. It requires the <a href="http://www.python.org/">Python interpreter</a>, version 2.x (x being at least 4), and it's not platform specific. It should work in your Unix box, in Windows or in Mac OS X. The latest version is <strong>2010.08.04</strong>. It's released to the public domain, which means you can modify it, redistribute it or use it however you like.</p>
 <p>I'll try to keep it updated if YouTube.com changes the way you access their videos. After all, it's a simple and short program. However, I can't guarantee anything. If you detect it stops working, check for new versions and/or inform me about the problem, indicating the program version you are using. If the program stops working and I can't solve the problem but you have a solution, I'd like to know it. If that happens and you feel you can maintain the program yourself, tell me. My contact information is at <a href="http://rg03.wordpress.com/contact-me/">rg03.wordpress.com</a>.</p>
 <p>Thanks for all the feedback received so far. I'm glad people find my program useful.</p>
 <h2 id="usage-instructions">Usage instructions</h2>
@@ -423,6 +423,15 @@
 <p>If you try to run the program and you receive an error message containing the keyword <em>SyntaxError</em> near the end, it means your Python interpreter is too old.</p>
 <h2 id="more-usage-tips">More usage tips</h2>
 <p>The program is usually invoked as <em>youtube-dl</em> followed by options and the video URLs. Listing all the options here would make this text too long, so you can run <em>youtube-dl --help</em> and get a summary of them. From that point on you can start experimenting with the different options yourself. The most common ones are -t (or -l) to include the video title in the file name, and either -f or -b to download a high quality version of the video. Also, the -o option can specify the output file name and path. It allows special character sequences that can be used as templates to be replaced. See the "Output template" section for more details.</p>
+<h2 id="download-it">Download it</h2>
+<p>Note that if you directly click on these hyperlinks, your web browser will most likely display the program contents. It's usually better to right-click on it and choose the appropriate option, normally called <em>Save Target As</em> or <em>Save Link As</em>, depending on the web browser you are using.</p>
+<h3 id="httpbitbucketorgrg3youtube-dlraw20100804youtube-dl20100804"><a href="http://bitbucket.org/rg3/youtube-dl/raw/2010.08.04/youtube-dl">2010.08.04</a></h3>
+<ul><li><strong>MD5</strong>: 8b1b8b922b758aae28f6c158e9a1baba
+</li><li><strong>SHA1</strong>: 1497bbaecc3a9b0f343021ab9a1d940315a1003e
+</li><li><strong>SHA256</strong>: 55044a3232a119b82bc8b8b521fba54059b26ec09577606e4a12ce7903732a56
+</li></ul>
+<h2 id="faq">FAQ</h2>
+<p>The <a href="/rg3/youtube-dl/wiki/Frequently_Asked_Questions">Frequently Asked Questions</a> page contains answers to some common questions that pop up in my e-mail and in the issue tracker. Be sure to check it before reporting problems.</p>
 <h2 id="supported-sites">Supported sites</h2>
 <ul><li>YouTube.com.
 </li><li>YouTube.com playlists (playlist URLs in "view_play_list" form).
@@ -436,13 +445,6 @@
 </li><li>Dailymotion.
 </li><li>A generic downloader that works in some sites.
 </li></ul>
-<h2 id="download-it">Download it</h2>
-<p>Note that if you directly click on these hyperlinks, your web browser will most likely display the program contents. It's usually better to right-click on it and choose the appropriate option, normally called <em>Save Target As</em> or <em>Save Link As</em>, depending on the web browser you are using.</p>
-<h3 id="httpbitbucketorgrg3youtube-dlraw20100722youtube-dl20100722"><a href="http://bitbucket.org/rg3/youtube-dl/raw/2010.07.22/youtube-dl">2010.07.22</a></h3>
-<ul><li><strong>MD5</strong>: d3a69eb8211e0aa7b61e0afbfe507d41
-</li><li><strong>SHA1</strong>: bafb1b4716ddaae506f10da3394ce7672d5f4e42
-</li><li><strong>SHA256</strong>: 0307ec6b7b58ef26e66afd9e260aba314ce706831a9cbaef3cb65705a66289cd
-</li></ul>
 <h2 id="proxy-support">Proxy support</h2>
 <p>youtube-dl supports downloading videos through a proxy, by setting the http_proxy environment variable to the proxy URL, as in <code>http://proxy_machine_name:port/</code>.</p>
 <h2 id="youtube-formats">YouTube formats</h2>
@@ -484,7 +486,7 @@
 				<a href="http://bitbucket.org/jespern/django-piston/">Piston 0.2.3rc1</a> / 
 				<a href="http://www.selenic.com/mercurial/">Hg 1.3.1</a> / 
 				<a href="http://www.python.org">Python 2.7.0</a> /
-				r3099| bfg02
+				r3101| bfg02
 			</b></small>
 		</div>
 	</div>
diff --git a/youtube-dl b/youtube-dl
index 5fd331e..d546949 100644
--- 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
@@ -878,7 +887,13 @@ class YoutubeIE(InfoExtractor):
 			if mobj is not None:
 				video_description = mobj.group(1)
 
+		# token
+		video_token = urllib.unquote_plus(video_info['token'][0])
+
 		# Decide which formats to download
+		requested_format = self._downloader.params.get('format', None)
+		get_video_template = 'http://www.youtube.com/get_video?video_id=%s&t=%s&eurl=&el=&ps=&asv=&fmt=%%s' % (video_id, video_token)
+
 		if 'fmt_url_map' in video_info:
 			url_map = dict(tuple(pair.split('|')) for pair in video_info['fmt_url_map'][0].split(','))
 			format_limit = self._downloader.params.get('format_limit', None)
@@ -890,19 +905,17 @@ class YoutubeIE(InfoExtractor):
 			if len(existing_formats) == 0:
 				self._downloader.trouble(u'ERROR: no known formats available for video')
 				return
-			requested_format = self._downloader.params.get('format', None)
 			if requested_format is None:
-				video_url_list = [(existing_formats[0], url_map[existing_formats[0]])] # Best quality
+				video_url_list = [(existing_formats[0], get_video_template % existing_formats[0])] # Best quality
 			elif requested_format == '-1':
-				video_url_list = url_map.items() # All formats
+				video_url_list = [(f, get_video_template % f) for f in existing_formats] # All formats
 			else:
-				if requested_format not in existing_formats:
-					self._downloader.trouble(u'ERROR: format not available for video')
-					return
-				video_url_list = [(requested_format, url_map[requested_format])] # Specific format
+				video_url_list = [(requested_format, get_video_template % requested_format)] # Specific format
+
 		elif 'conn' in video_info and video_info['conn'][0].startswith('rtmp'):
 			self.report_rtmp_download()
 			video_url_list = [(None, video_info['conn'][0])]
+
 		else:
 			self._downloader.trouble(u'ERROR: no fmt_url_map or conn information found in video info')
 			return
@@ -930,7 +943,7 @@ class YoutubeIE(InfoExtractor):
 					'player_url':	player_url,
 				})
 			except UnavailableVideoError, err:
-				self._downloader.trouble(u'ERROR: unable to download video')
+				self._downloader.trouble(u'ERROR: unable to download video (format may not be available)')
 
 
 class MetacafeIE(InfoExtractor):
@@ -1026,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)<title>(.*) - Video</title>', webpage)
 		if mobj is None:
@@ -1928,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
@@ -1983,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
@@ -2064,7 +2087,7 @@ if __name__ == '__main__':
 		# Parse command line
 		parser = optparse.OptionParser(
 			usage='Usage: %prog [options] url...',
-			version='2010.07.22',
+			version='2010.08.04',
 			conflict_handler='resolve',
 		)
 
@@ -2080,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',
@@ -2099,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')
@@ -2151,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:
@@ -2171,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()
@@ -2212,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)
diff --git a/youtube-dl.spec b/youtube-dl.spec
index ac85c2f..0e3e705 100644
--- a/youtube-dl.spec
+++ b/youtube-dl.spec
@@ -1,5 +1,5 @@
 Name:           youtube-dl
-Version:        2010.07.22
+Version:        2010.08.04
 Release:        1%{?dist}
 Summary:        Small command-line program to download videos from YouTube
 Summary(pl):    Tekstowy program do pobierania filmów z youtube.com
@@ -39,6 +39,9 @@ rm -rf $RPM_BUILD_ROOT
 %doc index.html
 
 %changelog
+* Thu Aug 05 2010 Till Maas <opensource at till.name> - 2010.08.04-1
+- Update to latest release
+
 * Fri Jul 23 2010 Till Maas <opensource at till.name> - 2010.07.22-1
 - Update to latest release
 


More information about the scm-commits mailing list