Handle file open mode correctly (fixes issue #76)
authorRicardo Garcia <sarbalap+freshmeat@gmail.com>
Mon, 21 Dec 2009 20:43:15 +0000 (21:43 +0100)
committerRicardo Garcia <sarbalap+freshmeat@gmail.com>
Sun, 31 Oct 2010 10:24:56 +0000 (11:24 +0100)
youtube-dl

index ea6245e9d7219e80872da89740cd11cf8ce0e219..5f23814485d79fbe6a448e3694aafc671edb5c00 100755 (executable)
@@ -392,19 +392,21 @@ class FileDownloader(object):
        
        def _do_download(self, filename, url):
                stream = None
-               open_mode = 'ab'
-
+               open_mode = 'wb'
                basic_request = urllib2.Request(url, None, std_headers)
                request = urllib2.Request(url, None, std_headers)
 
-               # Attempt to resume download with "continuedl" option
+               # Establish possible resume length
                if os.path.isfile(filename):
                        resume_len = os.path.getsize(filename)
                else:
                        resume_len = 0
+
+               # Request parameters in case of being able to resume
                if self.params.get('continuedl', False) and resume_len != 0:
                        self.report_resuming_byte(resume_len)
                        request.add_header('Range','bytes=%d-' % resume_len)
+                       open_mode = 'ab'
 
                # Establish connection
                try:
@@ -412,12 +414,16 @@ class FileDownloader(object):
                except (urllib2.HTTPError, ), err:
                        if err.code != 416: #  416 is 'Requested range not satisfiable'
                                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'