|
|
@ -84,8 +84,6 @@ class FileDownloader(object): |
|
|
|
else: |
|
|
|
exponent = long(math.log(float(bytes), 1024.0)) |
|
|
|
suffix = 'bkMGTPEZY'[exponent] |
|
|
|
if exponent == 0: |
|
|
|
return '%s%s' % (bytes, suffix) |
|
|
|
converted = float(bytes) / float(1024**exponent) |
|
|
|
return '%.2f%s' % (converted, suffix) |
|
|
|
|
|
|
@ -113,7 +111,7 @@ class FileDownloader(object): |
|
|
|
def calc_speed(start, now, bytes): |
|
|
|
dif = now - start |
|
|
|
if bytes == 0 or dif < 0.001: # One millisecond |
|
|
|
return '%9s' % 'N/A b/s' |
|
|
|
return '%10s' % '---b/s' |
|
|
|
return '%10s' % ('%s/s' % FileDownloader.format_bytes(float(bytes) / dif)) |
|
|
|
|
|
|
|
@staticmethod |
|
|
@ -144,6 +142,12 @@ class FileDownloader(object): |
|
|
|
self._ies.append(ie) |
|
|
|
ie.set_downloader(self) |
|
|
|
|
|
|
|
def to_stdout(self, message, skip_eol=False): |
|
|
|
"""Print message to stdout if not in quiet mode.""" |
|
|
|
if not self._params.get('quiet', False): |
|
|
|
sys.stdout.write('%s%s' % (message, ['\n', ''][skip_eol])) |
|
|
|
sys.stdout.flush() |
|
|
|
|
|
|
|
def download(self, url_list): |
|
|
|
"""Download a given list of URLs.""" |
|
|
|
for url in url_list: |
|
|
@ -199,11 +203,8 @@ class FileDownloader(object): |
|
|
|
percent_str = self.calc_percent(byte_counter, data_len) |
|
|
|
eta_str = self.calc_eta(start, time.time(), data_len, byte_counter) |
|
|
|
speed_str = self.calc_speed(start, time.time(), byte_counter) |
|
|
|
|
|
|
|
if not self._params.get('quiet', False): |
|
|
|
sys.stdout.write('\r[download] %s of %s at %s ETA %s' % |
|
|
|
(percent_str, data_len_str, speed_str, eta_str)) |
|
|
|
sys.stdout.flush() |
|
|
|
self.to_stdout('\r[download] %s of %s at %s ETA %s' % |
|
|
|
(percent_str, data_len_str, speed_str, eta_str), skip_eol=True) |
|
|
|
|
|
|
|
before = time.time() |
|
|
|
data_block = data.read(block_size) |
|
|
@ -215,9 +216,7 @@ class FileDownloader(object): |
|
|
|
stream.write(data_block) |
|
|
|
block_size = self.best_block_size(after - before, data_block_len) |
|
|
|
|
|
|
|
if not self._params.get('quiet', False): |
|
|
|
print |
|
|
|
|
|
|
|
self.to_stdout('') |
|
|
|
if data_len is not None and str(byte_counter) != data_len: |
|
|
|
raise ValueError('Content too short: %s/%s bytes' % (byte_counter, data_len)) |
|
|
|
|
|
|
@ -323,11 +322,13 @@ class YoutubeIE(InfoExtractor): |
|
|
|
return |
|
|
|
|
|
|
|
# Log in |
|
|
|
login_form = { 'current_form': 'loginForm', |
|
|
|
login_form = { |
|
|
|
'current_form': 'loginForm', |
|
|
|
'next': '/', |
|
|
|
'action_login': 'Log In', |
|
|
|
'username': username, |
|
|
|
'password': password, } |
|
|
|
'password': password, |
|
|
|
} |
|
|
|
request = urllib2.Request(self._LOGIN_URL, urllib.urlencode(login_form), std_headers) |
|
|
|
try: |
|
|
|
self.to_stdout('[youtube] Logging in') |
|
|
@ -340,8 +341,10 @@ class YoutubeIE(InfoExtractor): |
|
|
|
return |
|
|
|
|
|
|
|
# Confirm age |
|
|
|
age_form = { 'next_url': '/', |
|
|
|
'action_confirm': 'Confirm', } |
|
|
|
age_form = { |
|
|
|
'next_url': '/', |
|
|
|
'action_confirm': 'Confirm', |
|
|
|
} |
|
|
|
request = urllib2.Request(self._AGE_URL, urllib.urlencode(age_form), std_headers) |
|
|
|
try: |
|
|
|
self.to_stdout('[youtube] Confirming age') |
|
|
@ -386,6 +389,7 @@ class YoutubeIE(InfoExtractor): |
|
|
|
video_real_url = 'http://www.youtube.com/get_video?video_id=%s&t=%s' % (video_id, mobj.group(1)) |
|
|
|
if format_param is not None: |
|
|
|
video_real_url = '%s&fmt=%s' % (video_real_url, format_param) |
|
|
|
self.to_stdout('[youtube] %s: URL: %s' % (video_id, video_real_url)) |
|
|
|
|
|
|
|
# uploader |
|
|
|
mobj = re.search(r'More From: ([^<]*)<', video_webpage) |
|
|
@ -407,13 +411,14 @@ class YoutubeIE(InfoExtractor): |
|
|
|
simple_title = simple_title.strip(u'_') |
|
|
|
|
|
|
|
# Return information |
|
|
|
return [{ 'id': video_id, |
|
|
|
'url': video_real_url, |
|
|
|
'uploader': video_uploader, |
|
|
|
'title': video_title, |
|
|
|
'stitle': simple_title, |
|
|
|
'ext': video_extension, |
|
|
|
}] |
|
|
|
return [{ |
|
|
|
'id': video_id, |
|
|
|
'url': video_real_url, |
|
|
|
'uploader': video_uploader, |
|
|
|
'title': video_title, |
|
|
|
'stitle': simple_title, |
|
|
|
'ext': video_extension, |
|
|
|
}] |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
try: |
|
|
@ -425,17 +430,20 @@ if __name__ == '__main__': |
|
|
|
youtube_ie = YoutubeIE() |
|
|
|
|
|
|
|
# File downloader |
|
|
|
fd = FileDownloader({ 'usenetrc': False, |
|
|
|
'username': None, |
|
|
|
'password': None, |
|
|
|
'quiet': False, |
|
|
|
'format': None, |
|
|
|
'outtmpl': '%(id)s.%(ext)s' |
|
|
|
}) |
|
|
|
fd = FileDownloader({ |
|
|
|
'usenetrc': False, |
|
|
|
'username': None, |
|
|
|
'password': None, |
|
|
|
'quiet': False, |
|
|
|
'format': None, |
|
|
|
'outtmpl': '%(id)s.%(ext)s' |
|
|
|
}) |
|
|
|
fd.add_info_extractor(youtube_ie) |
|
|
|
fd.download([ 'http://www.youtube.com/watch?v=t7qdwI7TVe8', |
|
|
|
'http://www.youtube.com/watch?v=IJyn3pRcy_Q', |
|
|
|
'http://www.youtube.com/watch?v=DZRXe1wtC-M', ]) |
|
|
|
fd.download([ |
|
|
|
'http://www.youtube.com/watch?v=t7qdwI7TVe8', |
|
|
|
'http://www.youtube.com/watch?v=IJyn3pRcy_Q', |
|
|
|
'http://www.youtube.com/watch?v=DZRXe1wtC-M', |
|
|
|
]) |
|
|
|
|
|
|
|
except KeyboardInterrupt: |
|
|
|
sys.exit('\nERROR: Interrupted by user') |