Report download progress of rtmpdump
This commit is contained in:
		
							parent
							
								
									79b3f61228
								
							
						
					
					
						commit
						4894fe8c5b
					
				| @ -268,6 +268,61 @@ class FileDownloader(object): | |||||||
|                 (clear_line, data_len_str, self.format_seconds(tot_time))) |                 (clear_line, data_len_str, self.format_seconds(tot_time))) | ||||||
| 
 | 
 | ||||||
|     def _download_with_rtmpdump(self, filename, url, player_url, page_url, play_path, tc_url): |     def _download_with_rtmpdump(self, filename, url, player_url, page_url, play_path, tc_url): | ||||||
|  |         def run_rtmpdump(args): | ||||||
|  |             start = time.time() | ||||||
|  |             resume_percent = None | ||||||
|  |             resume_downloaded_data_len = None | ||||||
|  |             proc = subprocess.Popen(args, stderr=subprocess.PIPE) | ||||||
|  |             cursor_in_new_line = True | ||||||
|  |             proc_stderr_closed = False | ||||||
|  |             while not proc_stderr_closed: | ||||||
|  |                 # read line from stderr | ||||||
|  |                 line = u'' | ||||||
|  |                 while True: | ||||||
|  |                     char = proc.stderr.read(1) | ||||||
|  |                     if not char: | ||||||
|  |                         proc_stderr_closed = True | ||||||
|  |                         break | ||||||
|  |                     if char in [b'\r', b'\n']: | ||||||
|  |                         break | ||||||
|  |                     line += char.decode('ascii', 'replace') | ||||||
|  |                 if not line: | ||||||
|  |                     # proc_stderr_closed is True | ||||||
|  |                     continue | ||||||
|  |                 mobj = re.search(r'([0-9]+\.[0-9]{3}) kB / [0-9]+\.[0-9]{2} sec \(([0-9]{1,2}\.[0-9])%\)', line) | ||||||
|  |                 if mobj: | ||||||
|  |                     downloaded_data_len = int(float(mobj.group(1))*1024) | ||||||
|  |                     percent = float(mobj.group(2)) | ||||||
|  |                     if not resume_percent: | ||||||
|  |                         resume_percent = percent | ||||||
|  |                         resume_downloaded_data_len = downloaded_data_len | ||||||
|  |                     eta = self.calc_eta(start, time.time(), 100-resume_percent, percent-resume_percent) | ||||||
|  |                     speed = self.calc_speed(start, time.time(), downloaded_data_len-resume_downloaded_data_len) | ||||||
|  |                     data_len = None | ||||||
|  |                     if percent > 0: | ||||||
|  |                         data_len = int(downloaded_data_len * 100 / percent) | ||||||
|  |                     data_len_str = u'~'+self.format_bytes(data_len) | ||||||
|  |                     self.report_progress(percent, data_len_str, speed, eta) | ||||||
|  |                     cursor_in_new_line = False | ||||||
|  |                     self._hook_progress({ | ||||||
|  |                         'downloaded_bytes': downloaded_data_len, | ||||||
|  |                         'total_bytes': data_len, | ||||||
|  |                         'tmpfilename': tmpfilename, | ||||||
|  |                         'filename': filename, | ||||||
|  |                         'status': 'downloading', | ||||||
|  |                         'eta': eta, | ||||||
|  |                         'speed': speed, | ||||||
|  |                     }) | ||||||
|  |                 elif self.params.get('verbose', False): | ||||||
|  |                     if not cursor_in_new_line: | ||||||
|  |                         self.to_screen(u'') | ||||||
|  |                     cursor_in_new_line = True | ||||||
|  |                     self.to_screen(u'[rtmpdump] '+line) | ||||||
|  |             proc.wait() | ||||||
|  |             if not cursor_in_new_line: | ||||||
|  |                 self.to_screen(u'') | ||||||
|  |             return proc.returncode | ||||||
|  | 
 | ||||||
|         self.report_destination(filename) |         self.report_destination(filename) | ||||||
|         tmpfilename = self.temp_name(filename) |         tmpfilename = self.temp_name(filename) | ||||||
|         test = self.params.get('test', False) |         test = self.params.get('test', False) | ||||||
| @ -278,12 +333,11 @@ class FileDownloader(object): | |||||||
|         except (OSError, IOError): |         except (OSError, IOError): | ||||||
|             self.report_error(u'RTMP download detected but "rtmpdump" could not be run') |             self.report_error(u'RTMP download detected but "rtmpdump" could not be run') | ||||||
|             return False |             return False | ||||||
|         verbosity_option = '--verbose' if self.params.get('verbose', False) else '--quiet' |  | ||||||
| 
 | 
 | ||||||
|         # Download using rtmpdump. rtmpdump returns exit code 2 when |         # Download using rtmpdump. rtmpdump returns exit code 2 when | ||||||
|         # the connection was interrumpted and resuming appears to be |         # the connection was interrumpted and resuming appears to be | ||||||
|         # possible. This is part of rtmpdump's normal usage, AFAIK. |         # possible. This is part of rtmpdump's normal usage, AFAIK. | ||||||
|         basic_args = ['rtmpdump', verbosity_option, '-r', url, '-o', tmpfilename] |         basic_args = ['rtmpdump', '--verbose', '-r', url, '-o', tmpfilename] | ||||||
|         if player_url is not None: |         if player_url is not None: | ||||||
|             basic_args += ['--swfVfy', player_url] |             basic_args += ['--swfVfy', player_url] | ||||||
|         if page_url is not None: |         if page_url is not None: | ||||||
| @ -302,23 +356,25 @@ class FileDownloader(object): | |||||||
|             except ImportError: |             except ImportError: | ||||||
|                 shell_quote = repr |                 shell_quote = repr | ||||||
|             self.to_screen(u'[debug] rtmpdump command line: ' + shell_quote(args)) |             self.to_screen(u'[debug] rtmpdump command line: ' + shell_quote(args)) | ||||||
|         retval = subprocess.call(args) | 
 | ||||||
|  |         retval = run_rtmpdump(args) | ||||||
|  | 
 | ||||||
|         while (retval == 2 or retval == 1) and not test: |         while (retval == 2 or retval == 1) and not test: | ||||||
|             prevsize = os.path.getsize(encodeFilename(tmpfilename)) |             prevsize = os.path.getsize(encodeFilename(tmpfilename)) | ||||||
|             self.to_screen(u'\r[rtmpdump] %s bytes' % prevsize, skip_eol=True) |             self.to_screen(u'[rtmpdump] %s bytes' % prevsize) | ||||||
|             time.sleep(5.0) # This seems to be needed |             time.sleep(5.0) # This seems to be needed | ||||||
|             retval = subprocess.call(basic_args + ['-e'] + [[], ['-k', '1']][retval == 1]) |             retval = run_rtmpdump(basic_args + ['-e'] + [[], ['-k', '1']][retval == 1]) | ||||||
|             cursize = os.path.getsize(encodeFilename(tmpfilename)) |             cursize = os.path.getsize(encodeFilename(tmpfilename)) | ||||||
|             if prevsize == cursize and retval == 1: |             if prevsize == cursize and retval == 1: | ||||||
|                 break |                 break | ||||||
|              # Some rtmp streams seem abort after ~ 99.8%. Don't complain for those |              # Some rtmp streams seem abort after ~ 99.8%. Don't complain for those | ||||||
|             if prevsize == cursize and retval == 2 and cursize > 1024: |             if prevsize == cursize and retval == 2 and cursize > 1024: | ||||||
|                 self.to_screen(u'\r[rtmpdump] Could not download the whole video. This can happen for some advertisements.') |                 self.to_screen(u'[rtmpdump] Could not download the whole video. This can happen for some advertisements.') | ||||||
|                 retval = 0 |                 retval = 0 | ||||||
|                 break |                 break | ||||||
|         if retval == 0 or (test and retval == 2): |         if retval == 0 or (test and retval == 2): | ||||||
|             fsize = os.path.getsize(encodeFilename(tmpfilename)) |             fsize = os.path.getsize(encodeFilename(tmpfilename)) | ||||||
|             self.to_screen(u'\r[rtmpdump] %s bytes' % fsize) |             self.to_screen(u'[rtmpdump] %s bytes' % fsize) | ||||||
|             self.try_rename(tmpfilename, filename) |             self.try_rename(tmpfilename, filename) | ||||||
|             self._hook_progress({ |             self._hook_progress({ | ||||||
|                 'downloaded_bytes': fsize, |                 'downloaded_bytes': fsize, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user