Add files via upload
[PyWWW-Get.git] / pywwwget.py
blob9c65b8f2b9553aa53d1f4a5d03a681a646315402
1 #!/usr/bin/env python
3 '''
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the Revised BSD License.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 Revised BSD License for more details.
12 Copyright 2016-2023 Game Maker 2k - https://github.com/GameMaker2k
13 Copyright 2016-2023 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
15 $FileInfo: pywwwget.py - Last Update: 9/15/2023 Ver. 0.9.0 RC 1 - Author: cooldude2k $
16 '''
18 from __future__ import division, absolute_import, print_function;
19 import re, os, sys, hashlib, shutil, platform, tempfile, urllib, gzip, time, argparse, cgi, subprocess, socket;
20 import logging as log;
21 from ftplib import FTP, FTP_TLS;
22 from base64 import b64encode;
23 haverequests = False;
24 try:
25 import requests;
26 haverequests = True;
27 except ImportError:
28 haverequests = False;
29 havemechanize = False;
30 try:
31 import mechanize;
32 havemechanize = True;
33 except ImportError:
34 havemechanize = False;
35 haveparamiko = False;
36 try:
37 import paramiko;
38 haveparamiko = True;
39 except ImportError:
40 haveparamiko = False;
41 haveurllib3 = False;
42 try:
43 import urllib3;
44 haveurllib3 = True;
45 except ImportError:
46 haveurllib3 = False;
47 havehttplib2 = False;
48 try:
49 from httplib2 import HTTPConnectionWithTimeout, HTTPSConnectionWithTimeout;
50 havehttplib2 = True;
51 except ImportError:
52 havehttplib2 = False;
53 havebrotli = False;
54 try:
55 import brotli;
56 havebrotli = True;
57 except ImportError:
58 havebrotli = False;
59 if(sys.version[0]=="2"):
60 try:
61 from cStringIO import StringIO;
62 except ImportError:
63 from StringIO import StringIO;
64 # From http://python-future.org/compatible_idioms.html
65 from urlparse import urlparse, urlunparse, urlsplit, urlunsplit, urljoin;
66 from urllib import urlencode;
67 from urllib import urlopen as urlopenalt;
68 from urllib2 import urlopen, Request, install_opener, HTTPError, URLError, build_opener, HTTPCookieProcessor;
69 import urlparse, cookielib;
70 from httplib import HTTPConnection, HTTPSConnection;
71 if(sys.version[0]>="3"):
72 from io import StringIO, BytesIO;
73 # From http://python-future.org/compatible_idioms.html
74 from urllib.parse import urlparse, urlunparse, urlsplit, urlunsplit, urljoin, urlencode;
75 from urllib.request import urlopen, Request, install_opener, build_opener, HTTPCookieProcessor;
76 from urllib.error import HTTPError, URLError;
77 import urllib.parse as urlparse;
78 import http.cookiejar as cookielib;
79 from http.client import HTTPConnection, HTTPSConnection;
81 __program_name__ = "PyWWW-Get";
82 __program_alt_name__ = "PyWWWGet";
83 __program_small_name__ = "wwwget";
84 __project__ = __program_name__;
85 __project_url__ = "https://github.com/GameMaker2k/PyWWW-Get";
86 __version_info__ = (0, 9, 0, "RC 1", 1);
87 __version_date_info__ = (2023, 9, 15, "RC 1", 1);
88 __version_date__ = str(__version_date_info__[0])+"."+str(__version_date_info__[1]).zfill(2)+"."+str(__version_date_info__[2]).zfill(2);
89 __revision__ = __version_info__[3];
90 __revision_id__ = "$Id$";
91 if(__version_info__[4] is not None):
92 __version_date_plusrc__ = __version_date__+"-"+str(__version_date_info__[4]);
93 if(__version_info__[4] is None):
94 __version_date_plusrc__ = __version_date__;
95 if(__version_info__[3] is not None):
96 __version__ = str(__version_info__[0])+"."+str(__version_info__[1])+"."+str(__version_info__[2])+" "+str(__version_info__[3]);
97 if(__version_info__[3] is None):
98 __version__ = str(__version_info__[0])+"."+str(__version_info__[1])+"."+str(__version_info__[2]);
100 tmpfileprefix = "py"+str(sys.version_info[0])+__program_small_name__+str(__version_info__[0])+"-";
101 tmpfilesuffix = "-";
102 pytempdir = tempfile.gettempdir();
104 compression_supported = "gzip, deflate";
105 if(havebrotli):
106 compression_supported = "gzip, deflate, br";
107 else:
108 compression_supported = "gzip, deflate";
110 geturls_cj = cookielib.CookieJar();
111 windowsNT4_ua_string = "Windows NT 4.0";
112 windowsNT4_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "4.0.0"};
113 windows2k_ua_string = "Windows NT 5.0";
114 windows2k_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "5.0.0"};
115 windowsXP_ua_string = "Windows NT 5.1";
116 windowsXP_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "5.1.0"};
117 windowsXP64_ua_string = "Windows NT 5.2; Win64; x64";
118 windowsXP64_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "5.1.0"};
119 windows7_ua_string = "Windows NT 6.1; Win64; x64";
120 windows7_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "6.1.0"};
121 windows8_ua_string = "Windows NT 6.2; Win64; x64";
122 windows8_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "6.2.0"};
123 windows81_ua_string = "Windows NT 6.3; Win64; x64";
124 windows81_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "6.3.0"};
125 windows10_ua_string = "Windows NT 10.0; Win64; x64";
126 windows10_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "10.0.0"};
127 windows11_ua_string = "Windows NT 11.0; Win64; x64";
128 windows11_ua_addon = {'SEC-CH-UA-PLATFORM': "Windows", 'SEC-CH-UA-ARCH': "x86", 'SEC-CH-UA-PLATFORM': "11.0.0"};
129 geturls_ua_firefox_windows7 = "Mozilla/5.0 ("+windows7_ua_string+"; rv:109.0) Gecko/20100101 Firefox/117.0";
130 geturls_ua_seamonkey_windows7 = "Mozilla/5.0 ("+windows7_ua_string+"; rv:91.0) Gecko/20100101 Firefox/91.0 SeaMonkey/2.53.17";
131 geturls_ua_chrome_windows7 = "Mozilla/5.0 ("+windows7_ua_string+") AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36";
132 geturls_ua_chromium_windows7 = "Mozilla/5.0 ("+windows7_ua_string+") AppleWebKit/537.36 (KHTML, like Gecko) Chromium/117.0.0.0 Chrome/117.0.0.0 Safari/537.36";
133 geturls_ua_palemoon_windows7 = "Mozilla/5.0 ("+windows7_ua_string+"; rv:102.0) Gecko/20100101 Goanna/6.3 Firefox/102.0 PaleMoon/32.4.0.1";
134 geturls_ua_opera_windows7 = "Mozilla/5.0 ("+windows7_ua_string+") AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 OPR/102.0.0.0";
135 geturls_ua_vivaldi_windows7 = "Mozilla/5.0 ("+windows7_ua_string+") AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Vivaldi/6.2.3105.48";
136 geturls_ua_internet_explorer_windows7 = "Mozilla/5.0 ("+windows7_ua_string+"; Trident/7.0; rv:11.0) like Gecko";
137 geturls_ua_microsoft_edge_windows7 = "Mozilla/5.0 ("+windows7_ua_string+") AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.31";
138 geturls_ua_pywwwget_python = "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname=__project__, prover=__version__, prourl=__project_url__);
139 if(platform.python_implementation()!=""):
140 py_implementation = platform.python_implementation();
141 if(platform.python_implementation()==""):
142 py_implementation = "Python";
143 geturls_ua_pywwwget_python_alt = "Mozilla/5.0 ({osver}; {archtype}; +{prourl}) {pyimp}/{pyver} (KHTML, like Gecko) {proname}/{prover}".format(osver=platform.system()+" "+platform.release(), archtype=platform.machine(), prourl=__project_url__, pyimp=py_implementation, pyver=platform.python_version(), proname=__project__, prover=__version__);
144 geturls_ua_googlebot_google = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
145 geturls_ua_googlebot_google_old = "Googlebot/2.1 (+http://www.google.com/bot.html)";
146 geturls_ua = geturls_ua_firefox_windows7;
147 geturls_headers_firefox_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_firefox_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
148 geturls_headers_seamonkey_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_seamonkey_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
149 geturls_headers_chrome_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_chrome_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", 'SEC-CH-UA-FULL-VERSION': "117.0.5938.63"};
150 geturls_headers_chrome_windows7.update(windows7_ua_addon);
151 geturls_headers_chromium_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_chromium_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\"Chromium\";v=\"117\", \"Not;A=Brand\";v=\"24\"", 'SEC-CH-UA-FULL-VERSION': "117.0.5938.63"};
152 geturls_headers_chromium_windows7.update(windows7_ua_addon);
153 geturls_headers_palemoon_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_palemoon_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
154 geturls_headers_opera_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_opera_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\"Chromium\";v=\"116\", \"Not;A=Brand\";v=\"8\", \"Opera\";v=\"102\"", 'SEC-CH-UA-FULL-VERSION': "102.0.4880.56"};
155 geturls_headers_opera_windows7.update(windows7_ua_addon);
156 geturls_headers_vivaldi_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_vivaldi_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Vivaldi\";v=\"6.2\"", 'SEC-CH-UA-FULL-VERSION': "6.2.3105.48"};
157 geturls_headers_vivaldi_windows7.update(windows7_ua_addon);;
158 geturls_headers_internet_explorer_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_internet_explorer_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
159 geturls_headers_microsoft_edge_windows7 = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_microsoft_edge_windows7, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\"Microsoft Edge\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", 'SEC-CH-UA-FULL-VERSION': "117.0.2045.31"}
160 geturls_headers_microsoft_edge_windows7.update(windows7_ua_addon);
161 geturls_headers_pywwwget_python = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_pywwwget_python, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\""+__project__+"\";v=\""+str(__version__)+"\", \"Not;A=Brand\";v=\"8\", \""+py_implementation+"\";v=\""+str(platform.release())+"\"", 'SEC-CH-UA-FULL-VERSION': str(__version__), 'SEC-CH-UA-PLATFORM': ""+py_implementation+"", 'SEC-CH-UA-ARCH': ""+platform.machine()+"", 'SEC-CH-UA-PLATFORM': str(__version__)};
162 geturls_headers_pywwwget_python_alt = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_pywwwget_python_alt, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\""+__project__+"\";v=\""+str(__version__)+"\", \"Not;A=Brand\";v=\"8\", \""+py_implementation+"\";v=\""+str(platform.release())+"\"", 'SEC-CH-UA-FULL-VERSION': str(__version__), 'SEC-CH-UA-PLATFORM': ""+py_implementation+"", 'SEC-CH-UA-ARCH': ""+platform.machine()+"", 'SEC-CH-UA-PLATFORM': str(__version__)};
163 geturls_headers_googlebot_google = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_googlebot_google, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
164 geturls_headers_googlebot_google_old = {'Referer': "http://google.com/", 'User-Agent': geturls_ua_googlebot_google_old, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
165 geturls_headers = geturls_headers_firefox_windows7;
166 geturls_download_sleep = 0;
168 def verbose_printout(dbgtxt, outtype="log", dbgenable=True, dgblevel=20):
169 if(outtype=="print" and dbgenable):
170 print(dbgtxt);
171 return True;
172 elif(outtype=="log" and dbgenable):
173 logging.info(dbgtxt);
174 return True;
175 elif(outtype=="warning" and dbgenable):
176 logging.warning(dbgtxt);
177 return True;
178 elif(outtype=="error" and dbgenable):
179 logging.error(dbgtxt);
180 return True;
181 elif(outtype=="critical" and dbgenable):
182 logging.critical(dbgtxt);
183 return True;
184 elif(outtype=="exception" and dbgenable):
185 logging.exception(dbgtxt);
186 return True;
187 elif(outtype=="logalt" and dbgenable):
188 logging.log(dgblevel, dbgtxt);
189 return True;
190 elif(outtype=="debug" and dbgenable):
191 logging.debug(dbgtxt);
192 return True;
193 elif(not dbgenable):
194 return True;
195 else:
196 return False;
197 return False;
199 def verbose_printout_return(dbgtxt, outtype="log", dbgenable=True, dgblevel=20):
200 verbose_printout(dbgtxt, outtype, dbgenable, dgblevel);
201 return dbgtxt;
203 def add_url_param(url, **params):
204 n=3;
205 parts = list(urlparse.urlsplit(url));
206 d = dict(cgi.parse_qsl(parts[n])); # use cgi.parse_qs for list values
207 d.update(params);
208 parts[n]=urlencode(d);
209 return urlparse.urlunsplit(parts);
211 os.environ["PATH"] = os.environ["PATH"] + os.pathsep + os.path.dirname(os.path.realpath(__file__)) + os.pathsep + os.getcwd();
212 def which_exec(execfile):
213 for path in os.environ["PATH"].split(":"):
214 if os.path.exists(path + "/" + execfile):
215 return path + "/" + execfile;
217 def listize(varlist):
218 il = 0;
219 ix = len(varlist);
220 ilx = 1;
221 newlistreg = {};
222 newlistrev = {};
223 newlistfull = {};
224 while(il < ix):
225 newlistreg.update({ilx: varlist[il]});
226 newlistrev.update({varlist[il]: ilx});
227 ilx = ilx + 1;
228 il = il + 1;
229 newlistfull = {1: newlistreg, 2: newlistrev, 'reg': newlistreg, 'rev': newlistrev};
230 return newlistfull;
232 def twolistize(varlist):
233 il = 0;
234 ix = len(varlist);
235 ilx = 1;
236 newlistnamereg = {};
237 newlistnamerev = {};
238 newlistdescreg = {};
239 newlistdescrev = {};
240 newlistfull = {};
241 while(il < ix):
242 newlistnamereg.update({ilx: varlist[il][0].strip()});
243 newlistnamerev.update({varlist[il][0].strip(): ilx});
244 newlistdescreg.update({ilx: varlist[il][1].strip()});
245 newlistdescrev.update({varlist[il][1].strip(): ilx});
246 ilx = ilx + 1;
247 il = il + 1;
248 newlistnametmp = {1: newlistnamereg, 2: newlistnamerev, 'reg': newlistnamereg, 'rev': newlistnamerev};
249 newlistdesctmp = {1: newlistdescreg, 2: newlistdescrev, 'reg': newlistdescreg, 'rev': newlistdescrev};
250 newlistfull = {1: newlistnametmp, 2: newlistdesctmp, 'name': newlistnametmp, 'desc': newlistdesctmp}
251 return newlistfull;
253 def arglistize(proexec, *varlist):
254 il = 0;
255 ix = len(varlist);
256 ilx = 1;
257 newarglist = [proexec];
258 while(il < ix):
259 if varlist[il][0] is not None:
260 newarglist.append(varlist[il][0]);
261 if varlist[il][1] is not None:
262 newarglist.append(varlist[il][1]);
263 il = il + 1;
264 return newarglist;
266 # hms_string by ArcGIS Python Recipes
267 # https://arcpy.wordpress.com/2012/04/20/146/
268 def hms_string(sec_elapsed):
269 h = int(sec_elapsed / (60 * 60));
270 m = int((sec_elapsed % (60 * 60)) / 60);
271 s = sec_elapsed % 60.0;
272 return "{}:{:>02}:{:>05.2f}".format(h, m, s);
274 # get_readable_size by Lipis
275 # http://stackoverflow.com/posts/14998888/revisions
276 def get_readable_size(bytes, precision=1, unit="IEC"):
277 unit = unit.upper();
278 if(unit!="IEC" and unit!="SI"):
279 unit = "IEC";
280 if(unit=="IEC"):
281 units = [" B"," KiB"," MiB"," GiB"," TiB"," PiB"," EiB"," ZiB"];
282 unitswos = ["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB"];
283 unitsize = 1024.0;
284 if(unit=="SI"):
285 units = [" B"," kB"," MB"," GB"," TB"," PB"," EB"," ZB"];
286 unitswos = ["B","kB","MB","GB","TB","PB","EB","ZB"];
287 unitsize = 1000.0;
288 return_val = {};
289 orgbytes = bytes;
290 for unit in units:
291 if abs(bytes) < unitsize:
292 strformat = "%3."+str(precision)+"f%s";
293 pre_return_val = (strformat % (bytes, unit));
294 pre_return_val = re.sub(r"([0]+) ([A-Za-z]+)", r" \2", pre_return_val);
295 pre_return_val = re.sub(r"\. ([A-Za-z]+)", r" \1", pre_return_val);
296 alt_return_val = pre_return_val.split();
297 return_val = {'Bytes': orgbytes, 'ReadableWithSuffix': pre_return_val, 'ReadableWithoutSuffix': alt_return_val[0], 'ReadableSuffix': alt_return_val[1]}
298 return return_val;
299 bytes /= unitsize;
300 strformat = "%."+str(precision)+"f%s";
301 pre_return_val = (strformat % (bytes, "YiB"));
302 pre_return_val = re.sub(r"([0]+) ([A-Za-z]+)", r" \2", pre_return_val);
303 pre_return_val = re.sub(r"\. ([A-Za-z]+)", r" \1", pre_return_val);
304 alt_return_val = pre_return_val.split();
305 return_val = {'Bytes': orgbytes, 'ReadableWithSuffix': pre_return_val, 'ReadableWithoutSuffix': alt_return_val[0], 'ReadableSuffix': alt_return_val[1]}
306 return return_val;
308 def get_readable_size_from_file(infile, precision=1, unit="IEC", usehashes=False, usehashtypes="md5,sha1"):
309 unit = unit.upper();
310 usehashtypes = usehashtypes.lower();
311 getfilesize = os.path.getsize(infile);
312 return_val = get_readable_size(getfilesize, precision, unit);
313 if(usehashes):
314 hashtypelist = usehashtypes.split(",");
315 openfile = open(infile, "rb");
316 filecontents = openfile.read();
317 openfile.close();
318 listnumcount = 0;
319 listnumend = len(hashtypelist);
320 while(listnumcount < listnumend):
321 hashtypelistlow = hashtypelist[listnumcount].strip();
322 hashtypelistup = hashtypelistlow.upper();
323 filehash = hashlib.new(hashtypelistup);
324 filehash.update(filecontents);
325 filegethash = filehash.hexdigest();
326 return_val.update({hashtypelistup: filegethash});
327 listnumcount += 1;
328 return return_val;
330 def get_readable_size_from_string(instring, precision=1, unit="IEC", usehashes=False, usehashtypes="md5,sha1"):
331 unit = unit.upper();
332 usehashtypes = usehashtypes.lower();
333 getfilesize = len(instring);
334 return_val = get_readable_size(getfilesize, precision, unit);
335 if(usehashes):
336 hashtypelist = usehashtypes.split(",");
337 listnumcount = 0;
338 listnumend = len(hashtypelist);
339 while(listnumcount < listnumend):
340 hashtypelistlow = hashtypelist[listnumcount].strip();
341 hashtypelistup = hashtypelistlow.upper();
342 filehash = hashlib.new(hashtypelistup);
343 if(sys.version[0]=="2"):
344 filehash.update(instring);
345 if(sys.version[0]>="3"):
346 filehash.update(instring.encode('utf-8'));
347 filegethash = filehash.hexdigest();
348 return_val.update({hashtypelistup: filegethash});
349 listnumcount += 1;
350 return return_val;
352 def make_http_headers_from_dict_to_list(headers={'Referer': "http://google.com/", 'User-Agent': geturls_ua, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"}):
353 if isinstance(headers, dict):
354 returnval = [];
355 if(sys.version[0]=="2"):
356 for headkey, headvalue in headers.iteritems():
357 returnval.append((headkey, headvalue));
358 if(sys.version[0]>="3"):
359 for headkey, headvalue in headers.items():
360 returnval.append((headkey, headvalue));
361 elif isinstance(headers, list):
362 returnval = headers;
363 else:
364 returnval = False;
365 return returnval;
367 def make_http_headers_from_dict_to_pycurl(headers={'Referer': "http://google.com/", 'User-Agent': geturls_ua, 'Accept-Encoding': compression_supported, 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"}):
368 if isinstance(headers, dict):
369 returnval = [];
370 if(sys.version[0]=="2"):
371 for headkey, headvalue in headers.iteritems():
372 returnval.append(headkey+": "+headvalue);
373 if(sys.version[0]>="3"):
374 for headkey, headvalue in headers.items():
375 returnval.append(headkey+": "+headvalue);
376 elif isinstance(headers, list):
377 returnval = headers;
378 else:
379 returnval = False;
380 return returnval;
382 def make_http_headers_from_list_to_dict(headers=[("Referer", "http://google.com/"), ("User-Agent", geturls_ua), ("Accept-Encoding", compression_supported), ("Accept-Language", "en-US,en;q=0.8,en-CA,en-GB;q=0.6"), ("Accept-Charset", "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7"), ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), ("Connection", "close")]):
383 if isinstance(headers, list):
384 returnval = {};
385 mli = 0;
386 mlil = len(headers);
387 while(mli<mlil):
388 returnval.update({headers[mli][0]: headers[mli][1]});
389 mli = mli + 1;
390 elif isinstance(headers, dict):
391 returnval = headers;
392 else:
393 returnval = False;
394 return returnval;
396 def get_httplib_support(checkvalue=None):
397 global haverequests, havemechanize;
398 returnval = [];
399 returnval.append("httplib");
400 if(havehttplib2):
401 returnval.append("httplib2");
402 returnval.append("urllib");
403 if(haveurllib3):
404 returnval.append("urllib3");
405 returnval.append("request3");
406 returnval.append("request");
407 if(haverequests):
408 returnval.append("requests");
409 if(havemechanize):
410 returnval.append("mechanize");
411 if(not checkvalue is None):
412 if(checkvalue=="urllib1" or checkvalue=="urllib2"):
413 checkvalue = "urllib";
414 if(checkvalue=="httplib1"):
415 checkvalue = "httplib";
416 if(checkvalue in returnval):
417 returnval = True;
418 else:
419 returnval = False;
420 return returnval;
422 def check_httplib_support(checkvalue="urllib"):
423 if(checkvalue=="urllib1" or checkvalue=="urllib2"):
424 checkvalue = "urllib";
425 if(checkvalue=="httplib1"):
426 checkvalue = "httplib";
427 returnval = get_httplib_support(checkvalue);
428 return returnval;
430 def get_httplib_support_list():
431 returnval = get_httplib_support(None);
432 return returnval;
434 def download_from_url(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, httplibuse="urllib", sleep=-1):
435 global geturls_download_sleep, haverequests, havemechanize;
436 if(sleep<0):
437 sleep = geturls_download_sleep;
438 if(httplibuse=="urllib1" or httplibuse=="urllib2"):
439 httplibuse = "urllib";
440 if(httplibuse=="httplib1"):
441 httplibuse = "httplib";
442 if(not haverequests and httplibuse=="requests"):
443 httplibuse = "urllib";
444 if(not havemechanize and httplibuse=="mechanize"):
445 httplibuse = "urllib";
446 if(not havehttplib2 and httplibuse=="httplib2"):
447 httplibuse = "httplib";
448 if(httplibuse=="urllib"):
449 returnval = download_from_url_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
450 elif(httplibuse=="request"):
451 returnval = download_from_url_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
452 elif(httplibuse=="request3"):
453 returnval = download_from_url_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
454 elif(httplibuse=="httplib"):
455 returnval = download_from_url_with_httplib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
456 elif(httplibuse=="httplib2"):
457 returnval = download_from_url_with_httplib2(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
458 elif(httplibuse=="urllib3"):
459 returnval = download_from_url_with_urllib3(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
460 elif(httplibuse=="requests"):
461 returnval = download_from_url_with_requests(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
462 elif(httplibuse=="mechanize"):
463 returnval = download_from_url_with_mechanize(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep);
464 else:
465 returnval = False;
466 return returnval;
468 def download_from_url_file(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, httplibuse="urllib", buffersize=524288, sleep=-1):
469 global geturls_download_sleep, haverequests, havemechanize;
470 if(sleep<0):
471 sleep = geturls_download_sleep;
472 if(httplibuse=="urllib1" or httplibuse=="urllib2"):
473 httplibuse = "urllib";
474 if(httplibuse=="httplib1"):
475 httplibuse = "httplib";
476 if(not haverequests and httplibuse=="requests"):
477 httplibuse = "urllib";
478 if(not havemechanize and httplibuse=="mechanize"):
479 httplibuse = "urllib";
480 if(not havehttplib2 and httplibuse=="httplib2"):
481 httplibuse = "httplib";
482 if(httplibuse=="urllib"):
483 returnval = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
484 elif(httplibuse=="request"):
485 returnval = download_from_url_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
486 elif(httplibuse=="request3"):
487 returnval = download_from_url_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
488 elif(httplibuse=="httplib"):
489 returnval = download_from_url_file_with_httplib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
490 elif(httplibuse=="httplib2"):
491 returnval = download_from_url_file_with_httplib2(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
492 elif(httplibuse=="urllib3"):
493 returnval = download_from_url_file_with_urllib3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
494 elif(httplibuse=="requests"):
495 returnval = download_from_url_file_with_requests(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
496 elif(httplibuse=="mechanize"):
497 returnval = download_from_url_file_with_mechanize(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep);
498 else:
499 returnval = False;
500 return returnval;
502 def download_from_url_to_file(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, httplibuse="urllib", outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
503 global geturls_download_sleep, haverequests, havemechanize;
504 if(sleep<0):
505 sleep = geturls_download_sleep;
506 if(httplibuse=="urllib1" or httplibuse=="urllib2"):
507 httplibuse = "urllib";
508 if(httplibuse=="httplib1"):
509 httplibuse = "httplib";
510 if(not haverequests and httplibuse=="requests"):
511 httplibuse = "urllib";
512 if(not havemechanize and httplibuse=="mechanize"):
513 httplibuse = "urllib";
514 if(not havehttplib2 and httplibuse=="httplib2"):
515 httplibuse = "httplib";
516 if(httplibuse=="urllib"):
517 returnval = download_from_url_to_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
518 elif(httplibuse=="request"):
519 returnval = download_from_url_to_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
520 elif(httplibuse=="request3"):
521 returnval = download_from_url_to_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
522 elif(httplibuse=="httplib"):
523 returnval = download_from_url_to_file_with_httplib(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
524 elif(httplibuse=="httplib2"):
525 returnval = download_from_url_to_file_with_httplib2(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
526 elif(httplibuse=="urllib3"):
527 returnval = download_from_url_to_file_with_urllib3(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
528 elif(httplibuse=="requests"):
529 returnval = download_from_url_to_file_with_requests(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
530 elif(httplibuse=="mechanize"):
531 returnval = download_from_url_to_file_with_mechanize(httpurl, httpheaders, httpcookie, httpmethod, postdata, outfile, outpath, buffersize, sleep);
532 else:
533 returnval = False;
534 return returnval;
536 def download_from_url_with_urllib(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
537 global geturls_download_sleep, havebrotli;
538 if(sleep<0):
539 sleep = geturls_download_sleep;
540 urlparts = urlparse.urlparse(httpurl);
541 if(urlparts.username is not None or urlparts.password is not None):
542 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
543 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
544 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
545 if(isinstance(httpheaders, dict)):
546 httpheaders = make_http_headers_from_dict_to_list(httpheaders);
547 geturls_opener.addheaders = httpheaders;
548 time.sleep(sleep);
549 if(postdata is not None and not isinstance(postdata, dict)):
550 postdata = urlencode(postdata);
551 try:
552 if(httpmethod=="GET"):
553 geturls_text = geturls_opener.open(httpurl);
554 elif(httpmethod=="POST"):
555 geturls_text = geturls_opener.open(httpurl, data=postdata);
556 else:
557 geturls_text = geturls_opener.open(httpurl);
558 except HTTPError as geturls_text_error:
559 geturls_text = geturls_text_error;
560 log.info("Error With URL "+httpurl);
561 except URLError:
562 log.info("Error With URL "+httpurl);
563 return False;
564 except socket.timeout:
565 log.info("Error With URL "+httpurl);
566 return False;
567 log.info("Downloading URL "+httpurl);
568 if(geturls_text.info().get("Content-Encoding")=="gzip" or geturls_text.info().get("Content-Encoding")=="deflate"):
569 if(sys.version[0]=="2"):
570 strbuf = StringIO(geturls_text.read());
571 if(sys.version[0]>="3"):
572 strbuf = BytesIO(geturls_text.read());
573 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
574 returnval_content = gzstrbuf.read()[:];
575 if(geturls_text.info().get("Content-Encoding")!="gzip" and geturls_text.info().get("Content-Encoding")!="deflate"):
576 returnval_content = geturls_text.read()[:];
577 if(geturls_text.info().get("Content-Encoding")=="br" and havebrotli):
578 returnval_content = brotli.decompress(returnval_content);
579 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.getcode()};
580 geturls_text.close();
581 return returnval;
583 def download_from_url_file_with_urllib(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
584 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
585 exec_time_start = time.time();
586 myhash = hashlib.new("sha1");
587 if(sys.version[0]=="2"):
588 myhash.update(httpurl);
589 myhash.update(str(buffersize));
590 myhash.update(str(exec_time_start));
591 if(sys.version[0]>="3"):
592 myhash.update(httpurl.encode('utf-8'));
593 myhash.update(str(buffersize).encode('utf-8'));
594 myhash.update(str(exec_time_start).encode('utf-8'));
595 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
596 if(sleep<0):
597 sleep = geturls_download_sleep;
598 urlparts = urlparse.urlparse(httpurl);
599 if(urlparts.username is not None or urlparts.password is not None):
600 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
601 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
602 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
603 if(isinstance(httpheaders, dict)):
604 httpheaders = make_http_headers_from_dict_to_list(httpheaders);
605 geturls_opener.addheaders = httpheaders;
606 time.sleep(sleep);
607 try:
608 if(httpmethod=="GET"):
609 geturls_text = geturls_opener.open(httpurl);
610 elif(httpmethod=="POST"):
611 geturls_text = geturls_opener.open(httpurl, data=postdata);
612 else:
613 geturls_text = geturls_opener.open(httpurl);
614 except HTTPError as geturls_text_error:
615 geturls_text = geturls_text_error;
616 log.info("Error With URL "+httpurl);
617 except URLError:
618 log.info("Error With URL "+httpurl);
619 return False;
620 except socket.timeout:
621 log.info("Error With URL "+httpurl);
622 return False;
623 except socket.timeout:
624 log.info("Error With URL "+httpurl);
625 return False;
626 downloadsize = geturls_text.info().get('Content-Length');
627 if(downloadsize is not None):
628 downloadsize = int(downloadsize);
629 if downloadsize is None: downloadsize = 0;
630 fulldatasize = 0;
631 prevdownsize = 0;
632 log.info("Downloading URL "+httpurl);
633 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
634 tmpfilename = f.name;
635 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.getcode()};
636 while True:
637 databytes = geturls_text.read(buffersize);
638 if not databytes: break;
639 datasize = len(databytes);
640 fulldatasize = datasize + fulldatasize;
641 percentage = "";
642 if(downloadsize>0):
643 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
644 downloaddiff = fulldatasize - prevdownsize;
645 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
646 prevdownsize = fulldatasize;
647 f.write(databytes);
648 f.close();
649 geturls_text.close();
650 exec_time_end = time.time();
651 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
652 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
653 return returnval;
655 def download_from_url_to_file_with_urllib(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
656 global geturls_download_sleep;
657 if(sleep<0):
658 sleep = geturls_download_sleep;
659 if(not outfile=="-"):
660 outpath = outpath.rstrip(os.path.sep);
661 filepath = os.path.realpath(outpath+os.path.sep+outfile);
662 if(not os.path.exists(outpath)):
663 os.makedirs(outpath);
664 if(os.path.exists(outpath) and os.path.isfile(outpath)):
665 return False;
666 if(os.path.exists(filepath) and os.path.isdir(filepath)):
667 return False;
668 pretmpfilename = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
669 if(not pretmpfilename):
670 return False;
671 tmpfilename = pretmpfilename['Filename'];
672 downloadsize = os.path.getsize(tmpfilename);
673 fulldatasize = 0;
674 log.info("Moving file "+tmpfilename+" to "+filepath);
675 exec_time_start = time.time();
676 shutil.move(tmpfilename, filepath);
677 exec_time_end = time.time();
678 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
679 if(os.path.exists(tmpfilename)):
680 os.remove(tmpfilename);
681 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
682 if(outfile=="-" and sys.version[0]=="2"):
683 pretmpfilename = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
684 if(not pretmpfilename):
685 return False;
686 tmpfilename = pretmpfilename['Filename'];
687 downloadsize = os.path.getsize(tmpfilename);
688 fulldatasize = 0;
689 prevdownsize = 0;
690 exec_time_start = time.time();
691 with open(tmpfilename, 'rb') as ft:
692 f = StringIO();
693 while True:
694 databytes = ft.read(buffersize[1]);
695 if not databytes: break;
696 datasize = len(databytes);
697 fulldatasize = datasize + fulldatasize;
698 percentage = "";
699 if(downloadsize>0):
700 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
701 downloaddiff = fulldatasize - prevdownsize;
702 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
703 prevdownsize = fulldatasize;
704 f.write(databytes);
705 f.seek(0);
706 fdata = f.getvalue();
707 f.close();
708 ft.close();
709 os.remove(tmpfilename);
710 exec_time_end = time.time();
711 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
712 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
713 if(outfile=="-" and sys.version[0]>="3"):
714 pretmpfilename = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
715 tmpfilename = pretmpfilename['Filename'];
716 downloadsize = os.path.getsize(tmpfilename);
717 fulldatasize = 0;
718 prevdownsize = 0;
719 exec_time_start = time.time();
720 with open(tmpfilename, 'rb') as ft:
721 f = BytesIO();
722 while True:
723 databytes = ft.read(buffersize[1]);
724 if not databytes: break;
725 datasize = len(databytes);
726 fulldatasize = datasize + fulldatasize;
727 percentage = "";
728 if(downloadsize>0):
729 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
730 downloaddiff = fulldatasize - prevdownsize;
731 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
732 prevdownsize = fulldatasize;
733 f.write(databytes);
734 f.seek(0);
735 fdata = f.getvalue();
736 f.close();
737 ft.close();
738 os.remove(tmpfilename);
739 exec_time_end = time.time();
740 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
741 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
742 return returnval;
744 def download_from_url_with_httplib(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
745 global geturls_download_sleep, havebrotli;
746 if(sleep<0):
747 sleep = geturls_download_sleep;
748 urlparts = urlparse.urlparse(httpurl);
749 if(urlparts.username is not None or urlparts.password is not None):
750 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
751 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
752 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
753 geturls_opener.addheaders = httpheaders;
754 time.sleep(sleep);
755 if(urlparts[0]=="http"):
756 httpconn = HTTPConnection(urlparts[1]);
757 elif(urlparts[0]=="https"):
758 httpconn = HTTPSConnection(urlparts[1]);
759 else:
760 return False;
761 if(postdata is not None and not isinstance(postdata, dict)):
762 postdata = urlencode(postdata);
763 try:
764 if(httpmethod=="GET"):
765 httpconn.request("GET", urlparts[2], headers=httpheaders);
766 elif(httpmethod=="POST"):
767 httpconn.request("GET", urlparts[2], body=postdata, headers=httpheaders);
768 else:
769 httpconn.request("GET", urlparts[2], headers=httpheaders);
770 except socket.timeout:
771 log.info("Error With URL "+httpurl);
772 return False;
773 geturls_text = httpconn.getresponse();
774 log.info("Downloading URL "+httpurl);
775 if(dict(geturls_text.getheaders()).get("Content-Encoding")=="gzip" or dict(geturls_text.getheaders()).get("Content-Encoding")=="deflate"):
776 if(sys.version[0]=="2"):
777 strbuf = StringIO(geturls_text.read());
778 if(sys.version[0]>="3"):
779 strbuf = BytesIO(geturls_text.read());
780 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
781 returnval_content = gzstrbuf.read()[:];
782 if(dict(geturls_text.getheaders()).get("Content-Encoding")!="gzip" and dict(geturls_text.getheaders()).get("Content-Encoding")!="deflate"):
783 returnval_content = geturls_text.read()[:];
784 if(geturls_text.getheaders().get("Content-Encoding")=="br" and havebrotli):
785 returnval_content = brotli.decompress(returnval_content);
786 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.getheaders()), 'URL': httpurl, 'Code': geturls_text.status};
787 geturls_text.close();
788 return returnval;
790 def download_from_url_file_with_httplib(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
791 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
792 exec_time_start = time.time();
793 myhash = hashlib.new("sha1");
794 if(sys.version[0]=="2"):
795 myhash.update(httpurl);
796 myhash.update(str(buffersize));
797 myhash.update(str(exec_time_start));
798 if(sys.version[0]>="3"):
799 myhash.update(httpurl.encode('utf-8'));
800 myhash.update(str(buffersize).encode('utf-8'));
801 myhash.update(str(exec_time_start).encode('utf-8'));
802 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
803 if(sleep<0):
804 sleep = geturls_download_sleep;
805 urlparts = urlparse.urlparse(httpurl);
806 if(urlparts.username is not None or urlparts.password is not None):
807 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
808 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
809 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
810 geturls_opener.addheaders = httpheaders;
811 time.sleep(sleep);
812 if(urlparts[0]=="http"):
813 httpconn = HTTPConnection(urlparts[1]);
814 elif(urlparts[0]=="https"):
815 httpconn = HTTPSConnection(urlparts[1]);
816 else:
817 return False;
818 if(postdata is not None and not isinstance(postdata, dict)):
819 postdata = urlencode(postdata);
820 try:
821 if(httpmethod=="GET"):
822 httpconn.request("GET", urlparts[2], headers=httpheaders);
823 elif(httpmethod=="POST"):
824 httpconn.request("GET", urlparts[2], body=postdata, headers=httpheaders);
825 else:
826 httpconn.request("GET", urlparts[2], headers=httpheaders);
827 except socket.timeout:
828 log.info("Error With URL "+httpurl);
829 return False;
830 geturls_text = httpconn.getresponse();
831 downloadsize = dict(geturls_text.getheaders()).get('Content-Length');
832 if(downloadsize is not None):
833 downloadsize = int(downloadsize);
834 if downloadsize is None: downloadsize = 0;
835 fulldatasize = 0;
836 prevdownsize = 0;
837 log.info("Downloading URL "+httpurl);
838 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
839 tmpfilename = f.name;
840 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(dict(geturls_text.getheaders())), 'URL': httpurl, 'Code': geturls_text.status};
841 while True:
842 databytes = geturls_text.read(buffersize);
843 if not databytes: break;
844 datasize = len(databytes);
845 fulldatasize = datasize + fulldatasize;
846 percentage = "";
847 if(downloadsize>0):
848 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
849 downloaddiff = fulldatasize - prevdownsize;
850 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
851 prevdownsize = fulldatasize;
852 f.write(databytes);
853 f.close();
854 geturls_text.close();
855 exec_time_end = time.time();
856 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
857 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
858 return returnval;
860 def download_from_url_to_file_with_httplib(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
861 global geturls_download_sleep;
862 if(sleep<0):
863 sleep = geturls_download_sleep;
864 if(not outfile=="-"):
865 outpath = outpath.rstrip(os.path.sep);
866 filepath = os.path.realpath(outpath+os.path.sep+outfile);
867 if(not os.path.exists(outpath)):
868 os.makedirs(outpath);
869 if(os.path.exists(outpath) and os.path.isfile(outpath)):
870 return False;
871 if(os.path.exists(filepath) and os.path.isdir(filepath)):
872 return False;
873 pretmpfilename = download_from_url_file_with_httplib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
874 if(not pretmpfilename):
875 return False;
876 tmpfilename = pretmpfilename['Filename'];
877 downloadsize = os.path.getsize(tmpfilename);
878 fulldatasize = 0;
879 log.info("Moving file "+tmpfilename+" to "+filepath);
880 exec_time_start = time.time();
881 shutil.move(tmpfilename, filepath);
882 exec_time_end = time.time();
883 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
884 if(os.path.exists(tmpfilename)):
885 os.remove(tmpfilename);
886 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
887 if(outfile=="-" and sys.version[0]=="2"):
888 pretmpfilename = download_from_url_file_with_httplib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
889 if(not pretmpfilename):
890 return False;
891 tmpfilename = pretmpfilename['Filename'];
892 downloadsize = os.path.getsize(tmpfilename);
893 fulldatasize = 0;
894 prevdownsize = 0;
895 exec_time_start = time.time();
896 with open(tmpfilename, 'rb') as ft:
897 f = StringIO();
898 while True:
899 databytes = ft.read(buffersize[1]);
900 if not databytes: break;
901 datasize = len(databytes);
902 fulldatasize = datasize + fulldatasize;
903 percentage = "";
904 if(downloadsize>0):
905 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
906 downloaddiff = fulldatasize - prevdownsize;
907 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
908 prevdownsize = fulldatasize;
909 f.write(databytes);
910 f.seek(0);
911 fdata = f.getvalue();
912 f.close();
913 ft.close();
914 os.remove(tmpfilename);
915 exec_time_end = time.time();
916 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
917 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
918 if(outfile=="-" and sys.version[0]>="3"):
919 pretmpfilename = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
920 tmpfilename = pretmpfilename['Filename'];
921 downloadsize = os.path.getsize(tmpfilename);
922 fulldatasize = 0;
923 prevdownsize = 0;
924 exec_time_start = time.time();
925 with open(tmpfilename, 'rb') as ft:
926 f = BytesIO();
927 while True:
928 databytes = ft.read(buffersize[1]);
929 if not databytes: break;
930 datasize = len(databytes);
931 fulldatasize = datasize + fulldatasize;
932 percentage = "";
933 if(downloadsize>0):
934 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
935 downloaddiff = fulldatasize - prevdownsize;
936 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
937 prevdownsize = fulldatasize;
938 f.write(databytes);
939 f.seek(0);
940 fdata = f.getvalue();
941 f.close();
942 ft.close();
943 os.remove(tmpfilename);
944 exec_time_end = time.time();
945 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
946 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
947 return returnval;
949 if(havehttplib2):
950 def download_from_url_with_httplib2(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
951 global geturls_download_sleep, havebrotli;
952 if(sleep<0):
953 sleep = geturls_download_sleep;
954 urlparts = urlparse.urlparse(httpurl);
955 if(urlparts.username is not None or urlparts.password is not None):
956 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
957 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
958 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
959 geturls_opener.addheaders = httpheaders;
960 time.sleep(sleep);
961 if(urlparts[0]=="http"):
962 httpconn = HTTPConnectionWithTimeout(urlparts[1]);
963 elif(urlparts[0]=="https"):
964 httpconn = HTTPSConnectionWithTimeout(urlparts[1]);
965 else:
966 return False;
967 if(postdata is not None and not isinstance(postdata, dict)):
968 postdata = urlencode(postdata);
969 try:
970 if(httpmethod=="GET"):
971 httpconn.request("GET", urlparts[2], headers=httpheaders);
972 elif(httpmethod=="POST"):
973 httpconn.request("GET", urlparts[2], body=postdata, headers=httpheaders);
974 else:
975 httpconn.request("GET", urlparts[2], headers=httpheaders);
976 except socket.timeout:
977 log.info("Error With URL "+httpurl);
978 return False;
979 geturls_text = httpconn.getresponse();
980 log.info("Downloading URL "+httpurl);
981 if(dict(geturls_text.getheaders()).get("Content-Encoding")=="gzip" or dict(geturls_text.getheaders()).get("Content-Encoding")=="deflate"):
982 if(sys.version[0]=="2"):
983 strbuf = StringIO(geturls_text.read());
984 if(sys.version[0]>="3"):
985 strbuf = BytesIO(geturls_text.read());
986 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
987 returnval_content = gzstrbuf.read()[:];
988 if(dict(geturls_text.getheaders()).get("Content-Encoding")!="gzip" and dict(geturls_text.getheaders()).get("Content-Encoding")!="deflate"):
989 returnval_content = geturls_text.read()[:];
990 if(geturls_text.getheaders().get("Content-Encoding")=="br" and havebrotli):
991 returnval_content = brotli.decompress(returnval_content);
992 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.getheaders()), 'URL': httpurl, 'Code': geturls_text.status};
993 geturls_text.close();
994 return returnval;
996 if(not havehttplib2):
997 def download_from_url_with_httplib2(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
998 returnval = download_from_url_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep)
999 return returnval;
1001 if(havehttplib2):
1002 def download_from_url_file_with_httplib2(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1003 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
1004 exec_time_start = time.time();
1005 myhash = hashlib.new("sha1");
1006 if(sys.version[0]=="2"):
1007 myhash.update(httpurl);
1008 myhash.update(str(buffersize));
1009 myhash.update(str(exec_time_start));
1010 if(sys.version[0]>="3"):
1011 myhash.update(httpurl.encode('utf-8'));
1012 myhash.update(str(buffersize).encode('utf-8'));
1013 myhash.update(str(exec_time_start).encode('utf-8'));
1014 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
1015 if(sleep<0):
1016 sleep = geturls_download_sleep;
1017 urlparts = urlparse.urlparse(httpurl);
1018 if(urlparts.username is not None or urlparts.password is not None):
1019 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1020 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1021 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
1022 geturls_opener.addheaders = httpheaders;
1023 time.sleep(sleep);
1024 if(urlparts[0]=="http"):
1025 httpconn = HTTPConnectionWithTimeout(urlparts[1]);
1026 elif(urlparts[0]=="https"):
1027 httpconn = HTTPSConnectionWithTimeout(urlparts[1]);
1028 else:
1029 return False;
1030 if(postdata is not None and not isinstance(postdata, dict)):
1031 postdata = urlencode(postdata);
1032 try:
1033 if(httpmethod=="GET"):
1034 httpconn.request("GET", urlparts[2], headers=httpheaders);
1035 elif(httpmethod=="POST"):
1036 httpconn.request("GET", urlparts[2], body=postdata, headers=httpheaders);
1037 else:
1038 httpconn.request("GET", urlparts[2], headers=httpheaders);
1039 except socket.timeout:
1040 log.info("Error With URL "+httpurl);
1041 return False;
1042 geturls_text = httpconn.getresponse();
1043 downloadsize = dict(geturls_text.getheaders()).get('Content-Length');
1044 if(downloadsize is not None):
1045 downloadsize = int(downloadsize);
1046 if downloadsize is None: downloadsize = 0;
1047 fulldatasize = 0;
1048 prevdownsize = 0;
1049 log.info("Downloading URL "+httpurl);
1050 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
1051 tmpfilename = f.name;
1052 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(dict(geturls_text.getheaders())), 'URL': httpurl, 'Code': geturls_text.status};
1053 while True:
1054 databytes = geturls_text.read(buffersize);
1055 if not databytes: break;
1056 datasize = len(databytes);
1057 fulldatasize = datasize + fulldatasize;
1058 percentage = "";
1059 if(downloadsize>0):
1060 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1061 downloaddiff = fulldatasize - prevdownsize;
1062 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1063 prevdownsize = fulldatasize;
1064 f.write(databytes);
1065 f.close();
1066 geturls_text.close();
1067 exec_time_end = time.time();
1068 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
1069 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
1070 return returnval;
1072 if(not havehttplib2):
1073 def download_from_url_file_with_httplib2(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1074 returnval = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep)
1075 return returnval;
1077 if(havehttplib2):
1078 def download_from_url_to_file_with_httplib2(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1079 global geturls_download_sleep;
1080 if(sleep<0):
1081 sleep = geturls_download_sleep;
1082 if(not outfile=="-"):
1083 outpath = outpath.rstrip(os.path.sep);
1084 filepath = os.path.realpath(outpath+os.path.sep+outfile);
1085 if(not os.path.exists(outpath)):
1086 os.makedirs(outpath);
1087 if(os.path.exists(outpath) and os.path.isfile(outpath)):
1088 return False;
1089 if(os.path.exists(filepath) and os.path.isdir(filepath)):
1090 return False;
1091 pretmpfilename = download_from_url_file_with_httplib2(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1092 if(not pretmpfilename):
1093 return False;
1094 tmpfilename = pretmpfilename['Filename'];
1095 downloadsize = os.path.getsize(tmpfilename);
1096 fulldatasize = 0;
1097 log.info("Moving file "+tmpfilename+" to "+filepath);
1098 exec_time_start = time.time();
1099 shutil.move(tmpfilename, filepath);
1100 exec_time_end = time.time();
1101 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
1102 if(os.path.exists(tmpfilename)):
1103 os.remove(tmpfilename);
1104 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1105 if(outfile=="-" and sys.version[0]=="2"):
1106 pretmpfilename = download_from_url_file_with_httplib2(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1107 if(not pretmpfilename):
1108 return False;
1109 tmpfilename = pretmpfilename['Filename'];
1110 downloadsize = os.path.getsize(tmpfilename);
1111 fulldatasize = 0;
1112 prevdownsize = 0;
1113 exec_time_start = time.time();
1114 with open(tmpfilename, 'rb') as ft:
1115 f = StringIO();
1116 while True:
1117 databytes = ft.read(buffersize[1]);
1118 if not databytes: break;
1119 datasize = len(databytes);
1120 fulldatasize = datasize + fulldatasize;
1121 percentage = "";
1122 if(downloadsize>0):
1123 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1124 downloaddiff = fulldatasize - prevdownsize;
1125 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1126 prevdownsize = fulldatasize;
1127 f.write(databytes);
1128 f.seek(0);
1129 fdata = f.getvalue();
1130 f.close();
1131 ft.close();
1132 os.remove(tmpfilename);
1133 exec_time_end = time.time();
1134 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1135 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1136 if(outfile=="-" and sys.version[0]>="3"):
1137 pretmpfilename = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1138 tmpfilename = pretmpfilename['Filename'];
1139 downloadsize = os.path.getsize(tmpfilename);
1140 fulldatasize = 0;
1141 prevdownsize = 0;
1142 exec_time_start = time.time();
1143 with open(tmpfilename, 'rb') as ft:
1144 f = BytesIO();
1145 while True:
1146 databytes = ft.read(buffersize[1]);
1147 if not databytes: break;
1148 datasize = len(databytes);
1149 fulldatasize = datasize + fulldatasize;
1150 percentage = "";
1151 if(downloadsize>0):
1152 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1153 downloaddiff = fulldatasize - prevdownsize;
1154 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1155 prevdownsize = fulldatasize;
1156 f.write(databytes);
1157 f.seek(0);
1158 fdata = f.getvalue();
1159 f.close();
1160 ft.close();
1161 os.remove(tmpfilename);
1162 exec_time_end = time.time();
1163 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1164 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1165 return returnval;
1167 if(not havehttplib2):
1168 def download_from_url_to_file_with_httplib2(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1169 returnval = download_from_url_to_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, outfile, outpath, sleep)
1170 return returnval;
1172 def download_from_url_with_request(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1173 global geturls_download_sleep, havebrotli;
1174 if(sleep<0):
1175 sleep = geturls_download_sleep;
1176 urlparts = urlparse.urlparse(httpurl);
1177 if(urlparts.username is not None or urlparts.password is not None):
1178 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1179 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1180 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
1181 if(isinstance(httpheaders, dict)):
1182 httpheaders = make_http_headers_from_dict_to_list(httpheaders);
1183 geturls_opener.addheaders = httpheaders;
1184 urllib.request.install_opener(geturls_opener);
1185 time.sleep(sleep);
1186 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1187 if(postdata is not None and not isinstance(postdata, dict)):
1188 postdata = urlencode(postdata);
1189 try:
1190 if(httpmethod=="GET"):
1191 geturls_request = Request(httpurl, headers=httpheaders);
1192 geturls_text = urlopen(geturls_request);
1193 elif(httpmethod=="POST"):
1194 geturls_request = Request(httpurl, headers=httpheaders);
1195 geturls_text = urlopen(geturls_request, data=postdata);
1196 else:
1197 geturls_request = Request(httpurl, headers=httpheaders);
1198 geturls_text = urlopen(geturls_request);
1199 except HTTPError as geturls_text_error:
1200 geturls_text = geturls_text_error;
1201 log.info("Error With URL "+httpurl);
1202 except URLError:
1203 log.info("Error With URL "+httpurl);
1204 return False;
1205 except socket.timeout:
1206 log.info("Error With URL "+httpurl);
1207 return False;
1208 log.info("Downloading URL "+httpurl);
1209 if(geturls_text.headers.get("Content-Encoding")=="gzip" or geturls_text.headers.get("Content-Encoding")=="deflate"):
1210 if(sys.version[0]=="2"):
1211 strbuf = StringIO(geturls_text.read());
1212 if(sys.version[0]>="3"):
1213 strbuf = BytesIO(geturls_text.read());
1214 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
1215 returnval_content = gzstrbuf.read()[:];
1216 if(geturls_text.headers.get("Content-Encoding")!="gzip" and geturls_text.headers.get("Content-Encoding")!="deflate"):
1217 returnval_content = geturls_text.read()[:];
1218 if(geturls_text.headers.get("Content-Encoding")=="br" and havebrotli):
1219 returnval_content = brotli.decompress(returnval_content);
1220 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.headers), 'URL': geturls_text.geturl(), 'Code': geturls_text.getcode()};
1221 geturls_text.close();
1222 return returnval;
1224 def download_from_url_file_with_request(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1225 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
1226 exec_time_start = time.time();
1227 myhash = hashlib.new("sha1");
1228 if(sys.version[0]=="2"):
1229 myhash.update(httpurl);
1230 myhash.update(str(buffersize));
1231 myhash.update(str(exec_time_start));
1232 if(sys.version[0]>="3"):
1233 myhash.update(httpurl.encode('utf-8'));
1234 myhash.update(str(buffersize).encode('utf-8'));
1235 myhash.update(str(exec_time_start).encode('utf-8'));
1236 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
1237 if(sleep<0):
1238 sleep = geturls_download_sleep;
1239 urlparts = urlparse.urlparse(httpurl);
1240 if(urlparts.username is not None or urlparts.password is not None):
1241 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1242 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1243 geturls_opener = build_opener(HTTPCookieProcessor(httpcookie));
1244 if(isinstance(httpheaders, dict)):
1245 httpheaders = make_http_headers_from_dict_to_list(httpheaders);
1246 geturls_opener.addheaders = httpheaders;
1247 urllib.request.install_opener(geturls_opener);
1248 time.sleep(sleep);
1249 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1250 if(postdata is not None and not isinstance(postdata, dict)):
1251 postdata = urlencode(postdata);
1252 try:
1253 if(httpmethod=="GET"):
1254 geturls_request = Request(httpurl, headers=httpheaders);
1255 geturls_text = urlopen(geturls_request);
1256 elif(httpmethod=="POST"):
1257 geturls_request = Request(httpurl, headers=httpheaders);
1258 geturls_text = urlopen(geturls_request, data=postdata);
1259 else:
1260 geturls_request = Request(httpurl, headers=httpheaders);
1261 geturls_text = urlopen(geturls_request);
1262 except HTTPError as geturls_text_error:
1263 geturls_text = geturls_text_error;
1264 log.info("Error With URL "+httpurl);
1265 except URLError:
1266 log.info("Error With URL "+httpurl);
1267 return False;
1268 except socket.timeout:
1269 log.info("Error With URL "+httpurl);
1270 return False;
1271 downloadsize = geturls_text.headers.get('Content-Length');
1272 if(downloadsize is not None):
1273 downloadsize = int(downloadsize);
1274 if downloadsize is None: downloadsize = 0;
1275 fulldatasize = 0;
1276 prevdownsize = 0;
1277 log.info("Downloading URL "+httpurl);
1278 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
1279 tmpfilename = f.name;
1280 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(geturls_text.headers), 'URL': geturls_text.geturl(), 'Code': geturls_text.getcode()};
1281 while True:
1282 databytes = geturls_text.read(buffersize);
1283 if not databytes: break;
1284 datasize = len(databytes);
1285 fulldatasize = datasize + fulldatasize;
1286 percentage = "";
1287 if(downloadsize>0):
1288 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1289 downloaddiff = fulldatasize - prevdownsize;
1290 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1291 prevdownsize = fulldatasize;
1292 f.write(databytes);
1293 f.close();
1294 geturls_text.close();
1295 exec_time_end = time.time();
1296 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
1297 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
1298 return returnval;
1300 def download_from_url_to_file_with_request(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1301 global geturls_download_sleep;
1302 if(sleep<0):
1303 sleep = geturls_download_sleep;
1304 if(not outfile=="-"):
1305 outpath = outpath.rstrip(os.path.sep);
1306 filepath = os.path.realpath(outpath+os.path.sep+outfile);
1307 if(not os.path.exists(outpath)):
1308 os.makedirs(outpath);
1309 if(os.path.exists(outpath) and os.path.isfile(outpath)):
1310 return False;
1311 if(os.path.exists(filepath) and os.path.isdir(filepath)):
1312 return False;
1313 pretmpfilename = download_from_url_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1314 if(not pretmpfilename):
1315 return False;
1316 tmpfilename = pretmpfilename['Filename'];
1317 downloadsize = os.path.getsize(tmpfilename);
1318 fulldatasize = 0;
1319 log.info("Moving file "+tmpfilename+" to "+filepath);
1320 exec_time_start = time.time();
1321 shutil.move(tmpfilename, filepath);
1322 exec_time_end = time.time();
1323 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
1324 if(os.path.exists(tmpfilename)):
1325 os.remove(tmpfilename);
1326 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1327 if(outfile=="-" and sys.version[0]=="2"):
1328 pretmpfilename = download_from_url_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1329 if(not pretmpfilename):
1330 return False;
1331 tmpfilename = pretmpfilename['Filename'];
1332 downloadsize = os.path.getsize(tmpfilename);
1333 fulldatasize = 0;
1334 prevdownsize = 0;
1335 exec_time_start = time.time();
1336 with open(tmpfilename, 'rb') as ft:
1337 f = StringIO();
1338 while True:
1339 databytes = ft.read(buffersize[1]);
1340 if not databytes: break;
1341 datasize = len(databytes);
1342 fulldatasize = datasize + fulldatasize;
1343 percentage = "";
1344 if(downloadsize>0):
1345 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1346 downloaddiff = fulldatasize - prevdownsize;
1347 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1348 prevdownsize = fulldatasize;
1349 f.write(databytes);
1350 f.seek(0);
1351 fdata = f.getvalue();
1352 f.close();
1353 ft.close();
1354 os.remove(tmpfilename);
1355 exec_time_end = time.time();
1356 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1357 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1358 if(outfile=="-" and sys.version[0]>="3"):
1359 pretmpfilename = download_from_url_file_with_request(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1360 tmpfilename = pretmpfilename['Filename'];
1361 downloadsize = os.path.getsize(tmpfilename);
1362 fulldatasize = 0;
1363 prevdownsize = 0;
1364 exec_time_start = time.time();
1365 with open(tmpfilename, 'rb') as ft:
1366 f = BytesIO();
1367 while True:
1368 databytes = ft.read(buffersize[1]);
1369 if not databytes: break;
1370 datasize = len(databytes);
1371 fulldatasize = datasize + fulldatasize;
1372 percentage = "";
1373 if(downloadsize>0):
1374 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1375 downloaddiff = fulldatasize - prevdownsize;
1376 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1377 prevdownsize = fulldatasize;
1378 f.write(databytes);
1379 f.seek(0);
1380 fdata = f.getvalue();
1381 f.close();
1382 ft.close();
1383 os.remove(tmpfilename);
1384 exec_time_end = time.time();
1385 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1386 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1387 return returnval;
1389 if(haverequests):
1390 def download_from_url_with_requests(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1391 global geturls_download_sleep, havebrotli;
1392 if(sleep<0):
1393 sleep = geturls_download_sleep;
1394 urlparts = urlparse.urlparse(httpurl);
1395 if(urlparts.username is not None or urlparts.password is not None):
1396 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1397 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1398 if(isinstance(httpheaders, list)):
1399 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1400 time.sleep(sleep);
1401 if(postdata is not None and not isinstance(postdata, dict)):
1402 postdata = urlencode(postdata);
1403 try:
1404 if(httpmethod=="GET"):
1405 geturls_text = requests.get(httpurl, headers=httpheaders, cookies=httpcookie);
1406 elif(httpmethod=="POST"):
1407 geturls_text = requests.post(httpurl, data=postdata, headers=httpheaders, cookies=httpcookie);
1408 else:
1409 geturls_text = requests.get(httpurl, headers=httpheaders, cookies=httpcookie);
1410 except requests.exceptions.ConnectTimeout:
1411 log.info("Error With URL "+httpurl);
1412 return False;
1413 except socket.timeout:
1414 log.info("Error With URL "+httpurl);
1415 return False;
1416 log.info("Downloading URL "+httpurl);
1417 if(geturls_text.headers.get('Content-Type')=="gzip" or geturls_text.headers.get('Content-Type')=="deflate"):
1418 if(sys.version[0]=="2"):
1419 strbuf = StringIO(geturls_text.content);
1420 if(sys.version[0]>="3"):
1421 strbuf = BytesIO(geturls_text.content);
1422 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
1423 returnval_content = gzstrbuf.content[:];
1424 if(geturls_text.headers.get('Content-Type')!="gzip" and geturls_text.headers.get('Content-Type')!="deflate"):
1425 returnval_content = geturls_text.content[:];
1426 if(geturls_text.headers.get("Content-Encoding")=="br" and havebrotli):
1427 returnval_content = brotli.decompress(returnval_content);
1428 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.headers), 'URL': geturls_text.url, 'Code': geturls_text.status_code};
1429 geturls_text.close();
1430 return returnval;
1432 if(not haverequests):
1433 def download_from_url_with_requests(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1434 returnval = download_from_url_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep)
1435 return returnval;
1437 if(haverequests):
1438 def download_from_url_file_with_requests(httpurl, httpheaders, httpcookie, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1439 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
1440 exec_time_start = time.time();
1441 myhash = hashlib.new("sha1");
1442 if(sys.version[0]=="2"):
1443 myhash.update(httpurl);
1444 myhash.update(str(buffersize));
1445 myhash.update(str(exec_time_start));
1446 if(sys.version[0]>="3"):
1447 myhash.update(httpurl.encode('utf-8'));
1448 myhash.update(str(buffersize).encode('utf-8'));
1449 myhash.update(str(exec_time_start).encode('utf-8'));
1450 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
1451 if(sleep<0):
1452 sleep = geturls_download_sleep;
1453 urlparts = urlparse.urlparse(httpurl);
1454 if(urlparts.username is not None or urlparts.password is not None):
1455 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1456 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1457 if(isinstance(httpheaders, list)):
1458 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1459 time.sleep(sleep);
1460 if(postdata is not None and not isinstance(postdata, dict)):
1461 postdata = urlencode(postdata);
1462 try:
1463 if(httpmethod=="GET"):
1464 geturls_text = requests.get(httpurl, headers=httpheaders, cookies=httpcookie);
1465 elif(httpmethod=="POST"):
1466 geturls_text = requests.post(httpurl, data=postdata, headers=httpheaders, cookies=httpcookie);
1467 else:
1468 geturls_text = requests.get(httpurl, headers=httpheaders, cookies=httpcookie);
1469 except requests.exceptions.ConnectTimeout:
1470 log.info("Error With URL "+httpurl);
1471 return False;
1472 except socket.timeout:
1473 log.info("Error With URL "+httpurl);
1474 return False;
1475 downloadsize = int(geturls_text.headers.get('Content-Length'));
1476 if(downloadsize is not None):
1477 downloadsize = int(downloadsize);
1478 if downloadsize is None: downloadsize = 0;
1479 fulldatasize = 0;
1480 prevdownsize = 0;
1481 log.info("Downloading URL "+httpurl);
1482 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
1483 tmpfilename = f.name;
1484 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(geturls_text.headers), 'URL': geturls_text.url, 'Code': geturls_text.status_code};
1485 for databytes in geturls_text.iter_content(chunk_size=buffersize):
1486 datasize = len(databytes);
1487 fulldatasize = datasize + fulldatasize;
1488 percentage = "";
1489 if(downloadsize>0):
1490 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1491 downloaddiff = fulldatasize - prevdownsize;
1492 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1493 prevdownsize = fulldatasize;
1494 f.write(databytes);
1495 f.close();
1496 geturls_text.close();
1497 exec_time_end = time.time();
1498 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
1499 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
1500 return returnval;
1502 if(not haverequests):
1503 def download_from_url_file_with_requests(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1504 returnval = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep)
1505 return returnval;
1507 if(haverequests):
1508 def download_from_url_to_file_with_requests(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1509 global geturls_download_sleep;
1510 if(sleep<0):
1511 sleep = geturls_download_sleep;
1512 if(not outfile=="-"):
1513 outpath = outpath.rstrip(os.path.sep);
1514 filepath = os.path.realpath(outpath+os.path.sep+outfile);
1515 if(not os.path.exists(outpath)):
1516 os.makedirs(outpath);
1517 if(os.path.exists(outpath) and os.path.isfile(outpath)):
1518 return False;
1519 if(os.path.exists(filepath) and os.path.isdir(filepath)):
1520 return False;
1521 pretmpfilename = download_from_url_file_with_requests(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1522 if(not pretmpfilename):
1523 return False;
1524 tmpfilename = pretmpfilename['Filename'];
1525 downloadsize = os.path.getsize(tmpfilename);
1526 fulldatasize = 0;
1527 log.info("Moving file "+tmpfilename+" to "+filepath);
1528 exec_time_start = time.time();
1529 shutil.move(tmpfilename, filepath);
1530 exec_time_end = time.time();
1531 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
1532 if(os.path.exists(tmpfilename)):
1533 os.remove(tmpfilename);
1534 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1535 if(outfile=="-" and sys.version[0]=="2"):
1536 pretmpfilename = download_from_url_file_with_requests(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1537 if(not pretmpfilename):
1538 return False;
1539 tmpfilename = pretmpfilename['Filename'];
1540 downloadsize = os.path.getsize(tmpfilename);
1541 fulldatasize = 0;
1542 prevdownsize = 0;
1543 exec_time_start = time.time();
1544 with open(tmpfilename, 'rb') as ft:
1545 f = StringIO();
1546 while True:
1547 databytes = ft.read(buffersize[1]);
1548 if not databytes: break;
1549 datasize = len(databytes);
1550 fulldatasize = datasize + fulldatasize;
1551 percentage = "";
1552 if(downloadsize>0):
1553 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1554 downloaddiff = fulldatasize - prevdownsize;
1555 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1556 prevdownsize = fulldatasize;
1557 f.write(databytes);
1558 f.seek(0);
1559 fdata = f.getvalue();
1560 f.close();
1561 ft.close();
1562 os.remove(tmpfilename);
1563 exec_time_end = time.time();
1564 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1565 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1566 if(outfile=="-" and sys.version[0]>="3"):
1567 pretmpfilename = download_from_url_file_with_requests(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1568 tmpfilename = pretmpfilename['Filename'];
1569 downloadsize = os.path.getsize(tmpfilename);
1570 fulldatasize = 0;
1571 prevdownsize = 0;
1572 exec_time_start = time.time();
1573 with open(tmpfilename, 'rb') as ft:
1574 f = BytesIO();
1575 while True:
1576 databytes = ft.read(buffersize[1]);
1577 if not databytes: break;
1578 datasize = len(databytes);
1579 fulldatasize = datasize + fulldatasize;
1580 percentage = "";
1581 if(downloadsize>0):
1582 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1583 downloaddiff = fulldatasize - prevdownsize;
1584 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1585 prevdownsize = fulldatasize;
1586 f.write(databytes);
1587 f.seek(0);
1588 fdata = f.getvalue();
1589 f.close();
1590 ft.close();
1591 os.remove(tmpfilename);
1592 exec_time_end = time.time();
1593 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1594 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1595 return returnval;
1597 if(not haverequests):
1598 def download_from_url_to_file_with_requests(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1599 returnval = download_from_url_to_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, outfile, outpath, sleep)
1600 return returnval;
1602 if(haveurllib3):
1603 def download_from_url_with_request3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1604 global geturls_download_sleep, havebrotli;
1605 if(sleep<0):
1606 sleep = geturls_download_sleep;
1607 urlparts = urlparse.urlparse(httpurl);
1608 if(urlparts.username is not None or urlparts.password is not None):
1609 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1610 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1611 if(isinstance(httpheaders, list)):
1612 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1613 time.sleep(sleep);
1614 urllib_pool = urllib3.PoolManager(headers=httpheaders);
1615 if(postdata is not None and not isinstance(postdata, dict)):
1616 postdata = urlencode(postdata);
1617 try:
1618 if(httpmethod=="GET"):
1619 geturls_text = geturls_text = urllib_pool.request("GET", httpurl, headers=httpheaders, preload_content=False);
1620 elif(httpmethod=="POST"):
1621 geturls_text = geturls_text = urllib_pool.request("POST", httpurl, body=postdata, headers=httpheaders, preload_content=False);
1622 else:
1623 geturls_text = geturls_text = urllib_pool.request("GET", httpurl, headers=httpheaders, preload_content=False);
1624 except urllib3.exceptions.ConnectTimeoutError:
1625 log.info("Error With URL "+httpurl);
1626 return False;
1627 except urllib3.exceptions.MaxRetryError:
1628 log.info("Error With URL "+httpurl);
1629 return False;
1630 except socket.timeout:
1631 log.info("Error With URL "+httpurl);
1632 return False;
1633 log.info("Downloading URL "+httpurl);
1634 if(geturls_text.info().get("Content-Encoding")=="gzip" or geturls_text.info().get("Content-Encoding")=="deflate"):
1635 if(sys.version[0]=="2"):
1636 strbuf = StringIO(geturls_text.read());
1637 if(sys.version[0]>="3"):
1638 strbuf = BytesIO(geturls_text.read());
1639 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
1640 returnval_content = gzstrbuf.read()[:];
1641 if(geturls_text.info().get("Content-Encoding")!="gzip" and geturls_text.info().get("Content-Encoding")!="deflate"):
1642 returnval_content = geturls_text.read()[:];
1643 if(geturls_text.info().get("Content-Encoding")=="br" and havebrotli):
1644 returnval_content = brotli.decompress(returnval_content);
1645 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.status};
1646 geturls_text.close();
1647 return returnval;
1649 if(not haveurllib3):
1650 def download_from_url_with_request3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1651 returnval = download_from_url_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep)
1652 return returnval;
1654 if(haveurllib3):
1655 def download_from_url_file_with_request3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1656 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
1657 exec_time_start = time.time();
1658 myhash = hashlib.new("sha1");
1659 if(sys.version[0]=="2"):
1660 myhash.update(httpurl);
1661 myhash.update(str(buffersize));
1662 myhash.update(str(exec_time_start));
1663 if(sys.version[0]>="3"):
1664 myhash.update(httpurl.encode('utf-8'));
1665 myhash.update(str(buffersize).encode('utf-8'));
1666 myhash.update(str(exec_time_start).encode('utf-8'));
1667 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
1668 if(sleep<0):
1669 sleep = geturls_download_sleep;
1670 urlparts = urlparse.urlparse(httpurl);
1671 if(urlparts.username is not None or urlparts.password is not None):
1672 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1673 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1674 if(isinstance(httpheaders, list)):
1675 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1676 time.sleep(sleep);
1677 urllib_pool = urllib3.PoolManager(headers=httpheaders);
1678 if(postdata is not None and not isinstance(postdata, dict)):
1679 postdata = urlencode(postdata);
1680 try:
1681 if(httpmethod=="GET"):
1682 geturls_text = geturls_text = urllib_pool.request("GET", httpurl, headers=httpheaders, preload_content=False);
1683 elif(httpmethod=="POST"):
1684 geturls_text = geturls_text = urllib_pool.request("POST", httpurl, body=postdata, headers=httpheaders, preload_content=False);
1685 else:
1686 geturls_text = geturls_text = urllib_pool.request("GET", httpurl, headers=httpheaders, preload_content=False);
1687 except urllib3.exceptions.ConnectTimeoutError:
1688 log.info("Error With URL "+httpurl);
1689 return False;
1690 except urllib3.exceptions.MaxRetryError:
1691 log.info("Error With URL "+httpurl);
1692 return False;
1693 except socket.timeout:
1694 log.info("Error With URL "+httpurl);
1695 return False;
1696 downloadsize = int(geturls_text.headers.get('Content-Length'));
1697 if(downloadsize is not None):
1698 downloadsize = int(downloadsize);
1699 if downloadsize is None: downloadsize = 0;
1700 fulldatasize = 0;
1701 prevdownsize = 0;
1702 log.info("Downloading URL "+httpurl);
1703 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
1704 tmpfilename = f.name;
1705 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.status};
1706 while True:
1707 databytes = geturls_text.read(buffersize);
1708 if not databytes: break;
1709 datasize = len(databytes);
1710 fulldatasize = datasize + fulldatasize;
1711 percentage = "";
1712 if(downloadsize>0):
1713 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1714 downloaddiff = fulldatasize - prevdownsize;
1715 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1716 prevdownsize = fulldatasize;
1717 f.write(databytes);
1718 f.close();
1719 geturls_text.close();
1720 exec_time_end = time.time();
1721 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
1722 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
1723 return returnval;
1725 if(not haveurllib3):
1726 def download_from_url_file_with_request3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1727 returnval = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep)
1728 return returnval;
1730 if(haveurllib3):
1731 def download_from_url_to_file_with_request3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1732 global geturls_download_sleep;
1733 if(sleep<0):
1734 sleep = geturls_download_sleep;
1735 if(not outfile=="-"):
1736 outpath = outpath.rstrip(os.path.sep);
1737 filepath = os.path.realpath(outpath+os.path.sep+outfile);
1738 if(not os.path.exists(outpath)):
1739 os.makedirs(outpath);
1740 if(os.path.exists(outpath) and os.path.isfile(outpath)):
1741 return False;
1742 if(os.path.exists(filepath) and os.path.isdir(filepath)):
1743 return False;
1744 pretmpfilename = download_from_url_file_with_request3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1745 if(not pretmpfilename):
1746 return False;
1747 tmpfilename = pretmpfilename['Filename'];
1748 downloadsize = os.path.getsize(tmpfilename);
1749 fulldatasize = 0;
1750 log.info("Moving file "+tmpfilename+" to "+filepath);
1751 exec_time_start = time.time();
1752 shutil.move(tmpfilename, filepath);
1753 exec_time_end = time.time();
1754 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
1755 if(os.path.exists(tmpfilename)):
1756 os.remove(tmpfilename);
1757 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1758 if(outfile=="-" and sys.version[0]=="2"):
1759 pretmpfilename = download_from_url_file_with_request3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1760 if(not pretmpfilename):
1761 return False;
1762 tmpfilename = pretmpfilename['Filename'];
1763 downloadsize = os.path.getsize(tmpfilename);
1764 fulldatasize = 0;
1765 prevdownsize = 0;
1766 exec_time_start = time.time();
1767 with open(tmpfilename, 'rb') as ft:
1768 f = StringIO();
1769 while True:
1770 databytes = ft.read(buffersize[1]);
1771 if not databytes: break;
1772 datasize = len(databytes);
1773 fulldatasize = datasize + fulldatasize;
1774 percentage = "";
1775 if(downloadsize>0):
1776 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1777 downloaddiff = fulldatasize - prevdownsize;
1778 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1779 prevdownsize = fulldatasize;
1780 f.write(databytes);
1781 f.seek(0);
1782 fdata = f.getvalue();
1783 f.close();
1784 ft.close();
1785 os.remove(tmpfilename);
1786 exec_time_end = time.time();
1787 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1788 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1789 if(outfile=="-" and sys.version[0]>="3"):
1790 pretmpfilename = download_from_url_file_with_request3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1791 tmpfilename = pretmpfilename['Filename'];
1792 downloadsize = os.path.getsize(tmpfilename);
1793 fulldatasize = 0;
1794 prevdownsize = 0;
1795 exec_time_start = time.time();
1796 with open(tmpfilename, 'rb') as ft:
1797 f = BytesIO();
1798 while True:
1799 databytes = ft.read(buffersize[1]);
1800 if not databytes: break;
1801 datasize = len(databytes);
1802 fulldatasize = datasize + fulldatasize;
1803 percentage = "";
1804 if(downloadsize>0):
1805 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1806 downloaddiff = fulldatasize - prevdownsize;
1807 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1808 prevdownsize = fulldatasize;
1809 f.write(databytes);
1810 f.seek(0);
1811 fdata = f.getvalue();
1812 f.close();
1813 ft.close();
1814 os.remove(tmpfilename);
1815 exec_time_end = time.time();
1816 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
1817 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1818 return returnval;
1820 if(not haveurllib3):
1821 def download_from_url_to_file_with_request3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1822 returnval = download_from_url_to_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, outfile, outpath, sleep)
1823 return returnval;
1825 if(haveurllib3):
1826 def download_from_url_with_urllib3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1827 global geturls_download_sleep, havebrotli;
1828 if(sleep<0):
1829 sleep = geturls_download_sleep;
1830 urlparts = urlparse.urlparse(httpurl);
1831 if(urlparts.username is not None or urlparts.password is not None):
1832 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1833 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1834 if(isinstance(httpheaders, list)):
1835 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1836 time.sleep(sleep);
1837 urllib_pool = urllib3.PoolManager(headers=httpheaders);
1838 if(postdata is not None and not isinstance(postdata, dict)):
1839 postdata = urlencode(postdata);
1840 try:
1841 if(httpmethod=="GET"):
1842 geturls_text = urllib_pool.urlopen("GET", httpurl, headers=httpheaders, preload_content=False);
1843 elif(httpmethod=="POST"):
1844 geturls_text = urllib_pool.urlopen("GET", httpurl, body=postdata, headers=httpheaders, preload_content=False);
1845 else:
1846 geturls_text = urllib_pool.urlopen("GET", httpurl, headers=httpheaders, preload_content=False);
1847 except urllib3.exceptions.ConnectTimeoutError:
1848 log.info("Error With URL "+httpurl);
1849 return False;
1850 except urllib3.exceptions.MaxRetryError:
1851 log.info("Error With URL "+httpurl);
1852 return False;
1853 except socket.timeout:
1854 log.info("Error With URL "+httpurl);
1855 return False;
1856 log.info("Downloading URL "+httpurl);
1857 if(geturls_text.info().get("Content-Encoding")=="gzip" or geturls_text.info().get("Content-Encoding")=="deflate"):
1858 if(sys.version[0]=="2"):
1859 strbuf = StringIO(geturls_text.read());
1860 if(sys.version[0]>="3"):
1861 strbuf = BytesIO(geturls_text.read());
1862 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
1863 returnval_content = gzstrbuf.read()[:];
1864 if(geturls_text.info().get("Content-Encoding")!="gzip" and geturls_text.info().get("Content-Encoding")!="deflate"):
1865 returnval_content = geturls_text.read()[:];
1866 if(geturls_text.info().get("Content-Encoding")=="br" and havebrotli):
1867 returnval_content = brotli.decompress(returnval_content);
1868 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.status};
1869 geturls_text.close();
1870 return returnval;
1872 if(not haveurllib3):
1873 def download_from_url_with_urllib3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
1874 returnval = download_from_url_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep)
1875 return returnval;
1877 if(haveurllib3):
1878 def download_from_url_file_with_urllib3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1879 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
1880 exec_time_start = time.time();
1881 myhash = hashlib.new("sha1");
1882 if(sys.version[0]=="2"):
1883 myhash.update(httpurl);
1884 myhash.update(str(buffersize));
1885 myhash.update(str(exec_time_start));
1886 if(sys.version[0]>="3"):
1887 myhash.update(httpurl.encode('utf-8'));
1888 myhash.update(str(buffersize).encode('utf-8'));
1889 myhash.update(str(exec_time_start).encode('utf-8'));
1890 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
1891 if(sleep<0):
1892 sleep = geturls_download_sleep;
1893 urlparts = urlparse.urlparse(httpurl);
1894 if(urlparts.username is not None or urlparts.password is not None):
1895 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
1896 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
1897 if(isinstance(httpheaders, list)):
1898 httpheaders = make_http_headers_from_list_to_dict(httpheaders);
1899 time.sleep(sleep);
1900 urllib_pool = urllib3.PoolManager(headers=httpheaders);
1901 if(postdata is not None and not isinstance(postdata, dict)):
1902 postdata = urlencode(postdata);
1903 try:
1904 if(httpmethod=="GET"):
1905 geturls_text = urllib_pool.urlopen("GET", httpurl, headers=httpheaders, preload_content=False);
1906 elif(httpmethod=="POST"):
1907 geturls_text = urllib_pool.urlopen("GET", httpurl, body=postdata, headers=httpheaders, preload_content=False);
1908 else:
1909 geturls_text = urllib_pool.urlopen("GET", httpurl, headers=httpheaders, preload_content=False);
1910 except urllib3.exceptions.ConnectTimeoutError:
1911 log.info("Error With URL "+httpurl);
1912 return False;
1913 except urllib3.exceptions.MaxRetryError:
1914 log.info("Error With URL "+httpurl);
1915 return False;
1916 except socket.timeout:
1917 log.info("Error With URL "+httpurl);
1918 return False;
1919 downloadsize = int(geturls_text.headers.get('Content-Length'));
1920 if(downloadsize is not None):
1921 downloadsize = int(downloadsize);
1922 if downloadsize is None: downloadsize = 0;
1923 fulldatasize = 0;
1924 prevdownsize = 0;
1925 log.info("Downloading URL "+httpurl);
1926 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
1927 tmpfilename = f.name;
1928 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.status};
1929 while True:
1930 databytes = geturls_text.read(buffersize);
1931 if not databytes: break;
1932 datasize = len(databytes);
1933 fulldatasize = datasize + fulldatasize;
1934 percentage = "";
1935 if(downloadsize>0):
1936 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
1937 downloaddiff = fulldatasize - prevdownsize;
1938 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
1939 prevdownsize = fulldatasize;
1940 f.write(databytes);
1941 f.close();
1942 geturls_text.close();
1943 exec_time_end = time.time();
1944 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
1945 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
1946 return returnval;
1948 if(not haveurllib3):
1949 def download_from_url_file_with_urllib3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
1950 returnval = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep)
1951 return returnval;
1953 if(haveurllib3):
1954 def download_from_url_to_file_with_urllib3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
1955 global geturls_download_sleep;
1956 if(sleep<0):
1957 sleep = geturls_download_sleep;
1958 if(not outfile=="-"):
1959 outpath = outpath.rstrip(os.path.sep);
1960 filepath = os.path.realpath(outpath+os.path.sep+outfile);
1961 if(not os.path.exists(outpath)):
1962 os.makedirs(outpath);
1963 if(os.path.exists(outpath) and os.path.isfile(outpath)):
1964 return False;
1965 if(os.path.exists(filepath) and os.path.isdir(filepath)):
1966 return False;
1967 pretmpfilename = download_from_url_file_with_urllib3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1968 if(not pretmpfilename):
1969 return False;
1970 tmpfilename = pretmpfilename['Filename'];
1971 downloadsize = os.path.getsize(tmpfilename);
1972 fulldatasize = 0;
1973 log.info("Moving file "+tmpfilename+" to "+filepath);
1974 exec_time_start = time.time();
1975 shutil.move(tmpfilename, filepath);
1976 exec_time_end = time.time();
1977 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
1978 if(os.path.exists(tmpfilename)):
1979 os.remove(tmpfilename);
1980 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
1981 if(outfile=="-" and sys.version[0]=="2"):
1982 pretmpfilename = download_from_url_file_with_urllib3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
1983 if(not pretmpfilename):
1984 return False;
1985 tmpfilename = pretmpfilename['Filename'];
1986 downloadsize = os.path.getsize(tmpfilename);
1987 fulldatasize = 0;
1988 prevdownsize = 0;
1989 exec_time_start = time.time();
1990 with open(tmpfilename, 'rb') as ft:
1991 f = StringIO();
1992 while True:
1993 databytes = ft.read(buffersize[1]);
1994 if not databytes: break;
1995 datasize = len(databytes);
1996 fulldatasize = datasize + fulldatasize;
1997 percentage = "";
1998 if(downloadsize>0):
1999 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
2000 downloaddiff = fulldatasize - prevdownsize;
2001 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
2002 prevdownsize = fulldatasize;
2003 f.write(databytes);
2004 f.seek(0);
2005 fdata = f.getvalue();
2006 f.close();
2007 ft.close();
2008 os.remove(tmpfilename);
2009 exec_time_end = time.time();
2010 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
2011 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
2012 if(outfile=="-" and sys.version[0]>="3"):
2013 pretmpfilename = download_from_url_file_with_urllib3(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
2014 tmpfilename = pretmpfilename['Filename'];
2015 downloadsize = os.path.getsize(tmpfilename);
2016 fulldatasize = 0;
2017 prevdownsize = 0;
2018 exec_time_start = time.time();
2019 with open(tmpfilename, 'rb') as ft:
2020 f = BytesIO();
2021 while True:
2022 databytes = ft.read(buffersize[1]);
2023 if not databytes: break;
2024 datasize = len(databytes);
2025 fulldatasize = datasize + fulldatasize;
2026 percentage = "";
2027 if(downloadsize>0):
2028 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
2029 downloaddiff = fulldatasize - prevdownsize;
2030 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
2031 prevdownsize = fulldatasize;
2032 f.write(databytes);
2033 f.seek(0);
2034 fdata = f.getvalue();
2035 f.close();
2036 ft.close();
2037 os.remove(tmpfilename);
2038 exec_time_end = time.time();
2039 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
2040 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
2041 return returnval;
2043 if(not haveurllib3):
2044 def download_from_url_to_file_with_urllib3(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
2045 returnval = download_from_url_to_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, outfile, outpath, sleep)
2046 return returnval;
2048 if(havemechanize):
2049 def download_from_url_with_mechanize(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
2050 global geturls_download_sleep, havebrotli;
2051 if(sleep<0):
2052 sleep = geturls_download_sleep;
2053 urlparts = urlparse.urlparse(httpurl);
2054 if(urlparts.username is not None or urlparts.password is not None):
2055 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
2056 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
2057 geturls_opener = mechanize.Browser();
2058 if(isinstance(httpheaders, dict)):
2059 httpheaders = make_http_headers_from_dict_to_list(httpheaders);
2060 time.sleep(sleep);
2061 geturls_opener.addheaders = httpheaders;
2062 geturls_opener.set_cookiejar(httpcookie);
2063 geturls_opener.set_handle_robots(False);
2064 if(postdata is not None and not isinstance(postdata, dict)):
2065 postdata = urlencode(postdata);
2066 try:
2067 if(httpmethod=="GET"):
2068 geturls_text = geturls_opener.open(httpurl);
2069 elif(httpmethod=="POST"):
2070 geturls_text = geturls_opener.open(httpurl, data=postdata);
2071 else:
2072 geturls_text = geturls_opener.open(httpurl);
2073 except mechanize.HTTPError as geturls_text_error:
2074 geturls_text = geturls_text_error;
2075 log.info("Error With URL "+httpurl);
2076 except URLError:
2077 log.info("Error With URL "+httpurl);
2078 return False;
2079 except socket.timeout:
2080 log.info("Error With URL "+httpurl);
2081 return False;
2082 log.info("Downloading URL "+httpurl);
2083 if(geturls_text.info().get("Content-Encoding")=="gzip" or geturls_text.info().get("Content-Encoding")=="deflate"):
2084 if(sys.version[0]=="2"):
2085 strbuf = StringIO(geturls_text.read());
2086 if(sys.version[0]>="3"):
2087 strbuf = BytesIO(geturls_text.read());
2088 gzstrbuf = gzip.GzipFile(fileobj=strbuf);
2089 returnval_content = gzstrbuf.read()[:];
2090 if(geturls_text.info().get("Content-Encoding")!="gzip" and geturls_text.info().get("Content-Encoding")!="deflate"):
2091 returnval_content = geturls_text.read()[:];
2092 if(geturls_text.info().get("Content-Encoding")=="br" and havebrotli):
2093 returnval_content = brotli.decompress(returnval_content);
2094 returnval = {'Type': "Content", 'Content': returnval_content, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.code};
2095 geturls_text.close();
2096 return returnval;
2098 if(not havemechanize):
2099 def download_from_url_with_mechanize(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, sleep=-1):
2100 returnval = download_from_url_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, sleep)
2101 return returnval;
2103 if(havemechanize):
2104 def download_from_url_file_with_mechanize(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
2105 global geturls_download_sleep, tmpfileprefix, tmpfilesuffix;
2106 exec_time_start = time.time();
2107 myhash = hashlib.new("sha1");
2108 if(sys.version[0]=="2"):
2109 myhash.update(httpurl);
2110 myhash.update(str(buffersize));
2111 myhash.update(str(exec_time_start));
2112 if(sys.version[0]>="3"):
2113 myhash.update(httpurl.encode('utf-8'));
2114 myhash.update(str(buffersize).encode('utf-8'));
2115 myhash.update(str(exec_time_start).encode('utf-8'));
2116 newtmpfilesuffix = tmpfilesuffix + str(myhash.hexdigest());
2117 if(sleep<0):
2118 sleep = geturls_download_sleep;
2119 urlparts = urlparse.urlparse(httpurl);
2120 if(urlparts.username is not None or urlparts.password is not None):
2121 inurlencode = b64encode(str(urlparts.username+":"+urlparts.password).encode()).decode("UTF-8");
2122 httpheaders.update( { 'Authorization': "Basic "+inurlencode } );
2123 geturls_opener = mechanize.Browser();
2124 if(isinstance(httpheaders, dict)):
2125 httpheaders = make_http_headers_from_dict_to_list(httpheaders);
2126 time.sleep(sleep);
2127 geturls_opener.addheaders = httpheaders;
2128 geturls_opener.set_cookiejar(httpcookie);
2129 geturls_opener.set_handle_robots(False);
2130 if(postdata is not None and not isinstance(postdata, dict)):
2131 postdata = urlencode(postdata);
2132 try:
2133 if(httpmethod=="GET"):
2134 geturls_text = geturls_opener.open(httpurl);
2135 elif(httpmethod=="POST"):
2136 geturls_text = geturls_opener.open(httpurl, data=postdata);
2137 else:
2138 geturls_text = geturls_opener.open(httpurl);
2139 except mechanize.HTTPError as geturls_text_error:
2140 geturls_text = geturls_text_error;
2141 log.info("Error With URL "+httpurl);
2142 except URLError:
2143 log.info("Error With URL "+httpurl);
2144 return False;
2145 except socket.timeout:
2146 log.info("Error With URL "+httpurl);
2147 return False;
2148 downloadsize = int(geturls_text.info().get('Content-Length'));
2149 if(downloadsize is not None):
2150 downloadsize = int(downloadsize);
2151 if downloadsize is None: downloadsize = 0;
2152 fulldatasize = 0;
2153 prevdownsize = 0;
2154 log.info("Downloading URL "+httpurl);
2155 with tempfile.NamedTemporaryFile('wb+', prefix=tmpfileprefix, suffix=newtmpfilesuffix, delete=False) as f:
2156 tmpfilename = f.name;
2157 returnval = {'Type': "File", 'Filename': tmpfilename, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'Headers': dict(geturls_text.info()), 'URL': geturls_text.geturl(), 'Code': geturls_text.code};
2158 while True:
2159 databytes = geturls_text.read(buffersize);
2160 if not databytes: break;
2161 datasize = len(databytes);
2162 fulldatasize = datasize + fulldatasize;
2163 percentage = "";
2164 if(downloadsize>0):
2165 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
2166 downloaddiff = fulldatasize - prevdownsize;
2167 log.info("Downloading "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Downloaded "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
2168 prevdownsize = fulldatasize;
2169 f.write(databytes);
2170 f.close();
2171 geturls_text.close();
2172 exec_time_end = time.time();
2173 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to download file.");
2174 returnval.update({'Filesize': os.path.getsize(tmpfilename), 'DownloadTime': float(exec_time_start - exec_time_end), 'DownloadTimeReadable': hms_string(exec_time_start - exec_time_end)});
2175 return returnval;
2177 if(not havemechanize):
2178 def download_from_url_file_with_mechanize(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, buffersize=524288, sleep=-1):
2179 returnval = download_from_url_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, sleep)
2180 return returnval;
2182 if(havemechanize):
2183 def download_from_url_to_file_with_mechanize(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
2184 global geturls_download_sleep;
2185 if(sleep<0):
2186 sleep = geturls_download_sleep;
2187 if(not outfile=="-"):
2188 outpath = outpath.rstrip(os.path.sep);
2189 filepath = os.path.realpath(outpath+os.path.sep+outfile);
2190 if(not os.path.exists(outpath)):
2191 os.makedirs(outpath);
2192 if(os.path.exists(outpath) and os.path.isfile(outpath)):
2193 return False;
2194 if(os.path.exists(filepath) and os.path.isdir(filepath)):
2195 return False;
2196 pretmpfilename = download_from_url_file_with_mechanize(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
2197 if(not pretmpfilename):
2198 return False;
2199 tmpfilename = pretmpfilename['Filename'];
2200 downloadsize = os.path.getsize(tmpfilename);
2201 fulldatasize = 0;
2202 log.info("Moving file "+tmpfilename+" to "+filepath);
2203 exec_time_start = time.time();
2204 shutil.move(tmpfilename, filepath);
2205 exec_time_end = time.time();
2206 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to move file.");
2207 if(os.path.exists(tmpfilename)):
2208 os.remove(tmpfilename);
2209 returnval = {'Type': "File", 'Filename': filepath, 'Filesize': downloadsize, 'FilesizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
2210 if(outfile=="-" and sys.version[0]=="2"):
2211 pretmpfilename = download_from_url_file_with_mechanize(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
2212 if(not pretmpfilename):
2213 return False;
2214 tmpfilename = pretmpfilename['Filename'];
2215 downloadsize = os.path.getsize(tmpfilename);
2216 fulldatasize = 0;
2217 prevdownsize = 0;
2218 exec_time_start = time.time();
2219 with open(tmpfilename, 'rb') as ft:
2220 f = StringIO();
2221 while True:
2222 databytes = ft.read(buffersize[1]);
2223 if not databytes: break;
2224 datasize = len(databytes);
2225 fulldatasize = datasize + fulldatasize;
2226 percentage = "";
2227 if(downloadsize>0):
2228 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
2229 downloaddiff = fulldatasize - prevdownsize;
2230 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
2231 prevdownsize = fulldatasize;
2232 f.write(databytes);
2233 f.seek(0);
2234 fdata = f.getvalue();
2235 f.close();
2236 ft.close();
2237 os.remove(tmpfilename);
2238 exec_time_end = time.time();
2239 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
2240 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
2241 if(outfile=="-" and sys.version[0]>="3"):
2242 pretmpfilename = download_from_url_file_with_mechanize(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize[0], sleep);
2243 tmpfilename = pretmpfilename['Filename'];
2244 downloadsize = os.path.getsize(tmpfilename);
2245 fulldatasize = 0;
2246 prevdownsize = 0;
2247 exec_time_start = time.time();
2248 with open(tmpfilename, 'rb') as ft:
2249 f = BytesIO();
2250 while True:
2251 databytes = ft.read(buffersize[1]);
2252 if not databytes: break;
2253 datasize = len(databytes);
2254 fulldatasize = datasize + fulldatasize;
2255 percentage = "";
2256 if(downloadsize>0):
2257 percentage = str("{0:.2f}".format(float(float(fulldatasize / downloadsize) * 100))).rstrip('0').rstrip('.')+"%";
2258 downloaddiff = fulldatasize - prevdownsize;
2259 log.info("Copying "+get_readable_size(fulldatasize, 2, "SI")['ReadableWithSuffix']+" / "+get_readable_size(downloadsize, 2, "SI")['ReadableWithSuffix']+" "+str(percentage)+" / Copied "+get_readable_size(downloaddiff, 2, "IEC")['ReadableWithSuffix']);
2260 prevdownsize = fulldatasize;
2261 f.write(databytes);
2262 f.seek(0);
2263 fdata = f.getvalue();
2264 f.close();
2265 ft.close();
2266 os.remove(tmpfilename);
2267 exec_time_end = time.time();
2268 log.info("It took "+hms_string(exec_time_start - exec_time_end)+" to copy file.");
2269 returnval = {'Type': "Content", 'Content': fdata, 'Contentsize': downloadsize, 'ContentsizeAlt': {'IEC': get_readable_size(downloadsize, 2, "IEC"), 'SI': get_readable_size(downloadsize, 2, "SI")}, 'DownloadTime': pretmpfilename['DownloadTime'], 'DownloadTimeReadable': pretmpfilename['DownloadTimeReadable'], 'MoveFileTime': float(exec_time_start - exec_time_end), 'MoveFileTimeReadable': hms_string(exec_time_start - exec_time_end), 'Headers': pretmpfilename['Headers'], 'URL': pretmpfilename['URL'], 'Code': pretmpfilename['Code']};
2270 return returnval;
2272 if(not havemechanize):
2273 def download_from_url_to_file_with_mechanize(httpurl, httpheaders=geturls_headers, httpcookie=geturls_cj, httpmethod="GET", postdata=None, outfile="-", outpath=os.getcwd(), buffersize=[524288, 524288], sleep=-1):
2274 returnval = download_from_url_to_file_with_urllib(httpurl, httpheaders, httpcookie, httpmethod, postdata, buffersize, outfile, outpath, sleep)
2275 return returnval;
2277 def download_file_from_ftp_file(url):
2278 urlparts = urlparse.urlparse(url);
2279 file_name = os.path.basename(urlparts.path);
2280 file_dir = os.path.dirname(urlparts.path);
2281 if(urlparts.username is not None):
2282 ftp_username = urlparts.username;
2283 else:
2284 ftp_username = "anonymous";
2285 if(urlparts.password is not None):
2286 ftp_password = urlparts.password;
2287 elif(urlparts.password is None and urlparts.username=="anonymous"):
2288 ftp_password = "anonymous";
2289 else:
2290 ftp_password = "";
2291 if(urlparts.scheme=="ftp"):
2292 ftp = FTP();
2293 elif(urlparts.scheme=="ftps"):
2294 ftp = FTP_TLS();
2295 else:
2296 return False;
2297 ftp.connect(urlparts.hostname, urlparts.port);
2298 ftp.login(urlparts.username, urlparts.password);
2299 if(urlparts.scheme=="ftps"):
2300 ftp.prot_p();
2301 ftpfile = BytesIO();
2302 ftp.retrbinary("RETR "+urlparts.path, ftpfile.write);
2303 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
2304 ftp.close();
2305 ftpfile.seek(0, 0);
2306 return ftpfile;
2308 def download_file_from_ftp_string(url):
2309 ftpfile = download_file_from_ftp_file(url);
2310 return ftpfile.read();
2312 def upload_file_to_ftp_file(ftpfile, url):
2313 urlparts = urlparse.urlparse(url);
2314 file_name = os.path.basename(urlparts.path);
2315 file_dir = os.path.dirname(urlparts.path);
2316 if(urlparts.username is not None):
2317 ftp_username = urlparts.username;
2318 else:
2319 ftp_username = "anonymous";
2320 if(urlparts.password is not None):
2321 ftp_password = urlparts.password;
2322 elif(urlparts.password is None and urlparts.username=="anonymous"):
2323 ftp_password = "anonymous";
2324 else:
2325 ftp_password = "";
2326 if(urlparts.scheme=="ftp"):
2327 ftp = FTP();
2328 elif(urlparts.scheme=="ftps"):
2329 ftp = FTP_TLS();
2330 else:
2331 return False;
2332 ftp.connect(urlparts.hostname, urlparts.port);
2333 ftp.login(urlparts.username, urlparts.password);
2334 if(urlparts.scheme=="ftps"):
2335 ftp.prot_p();
2336 ftp.storbinary("STOR "+urlparts.path, ftpfile);
2337 ftp.close();
2338 ftpfile.seek(0, 0);
2339 return ftpfile;
2341 def upload_file_to_ftp_string(ftpstring, url):
2342 ftpfileo = BytesIO(ftpstring);
2343 ftpfile = upload_file_to_ftp_file(ftpfileo, url);
2344 ftpfileo.close();
2345 return ftpfile;
2347 if(haveparamiko):
2348 def download_file_from_sftp_file(url):
2349 urlparts = urlparse.urlparse(url);
2350 file_name = os.path.basename(urlparts.path);
2351 file_dir = os.path.dirname(urlparts.path);
2352 sftp_port = urlparts.port;
2353 if(urlparts.port is None):
2354 sftp_port = 22;
2355 else:
2356 sftp_port = urlparts.port;
2357 if(urlparts.username is not None):
2358 sftp_username = urlparts.username;
2359 else:
2360 sftp_username = "anonymous";
2361 if(urlparts.password is not None):
2362 sftp_password = urlparts.password;
2363 elif(urlparts.password is None and urlparts.username=="anonymous"):
2364 sftp_password = "anonymous";
2365 else:
2366 sftp_password = "";
2367 if(urlparts.scheme!="sftp"):
2368 return False;
2369 ssh = paramiko.SSHClient();
2370 ssh.load_system_host_keys();
2371 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy());
2372 try:
2373 ssh.connect(urlparts.hostname, port=sftp_port, username=urlparts.username, password=urlparts.password);
2374 except paramiko.ssh_exception.SSHException:
2375 return False;
2376 sftp = ssh.open_sftp();
2377 sftpfile = BytesIO();
2378 sftp.getfo(urlparts.path, sftpfile);
2379 sftp.close();
2380 ssh.close();
2381 sftpfile.seek(0, 0);
2382 return sftpfile;
2383 else:
2384 def download_file_from_sftp_file(url):
2385 return False;
2387 if(haveparamiko):
2388 def download_file_from_sftp_string(url):
2389 sftpfile = download_file_from_sftp_file(url);
2390 return sftpfile.read();
2391 else:
2392 def download_file_from_ftp_string(url):
2393 return False;
2395 if(haveparamiko):
2396 def upload_file_to_sftp_file(sftpfile, url):
2397 urlparts = urlparse.urlparse(url);
2398 file_name = os.path.basename(urlparts.path);
2399 file_dir = os.path.dirname(urlparts.path);
2400 sftp_port = urlparts.port;
2401 if(urlparts.port is None):
2402 sftp_port = 22;
2403 else:
2404 sftp_port = urlparts.port;
2405 if(urlparts.username is not None):
2406 sftp_username = urlparts.username;
2407 else:
2408 sftp_username = "anonymous";
2409 if(urlparts.password is not None):
2410 sftp_password = urlparts.password;
2411 elif(urlparts.password is None and urlparts.username=="anonymous"):
2412 sftp_password = "anonymous";
2413 else:
2414 sftp_password = "";
2415 if(urlparts.scheme!="sftp"):
2416 return False;
2417 ssh = paramiko.SSHClient();
2418 ssh.load_system_host_keys();
2419 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy());
2420 try:
2421 ssh.connect(urlparts.hostname, port=sftp_port, username=urlparts.username, password=urlparts.password);
2422 except paramiko.ssh_exception.SSHException:
2423 return False;
2424 sftp = ssh.open_sftp();
2425 sftp.putfo(sftpfile, urlparts.path);
2426 sftp.close();
2427 ssh.close();
2428 sftpfile.seek(0, 0);
2429 return sftpfile;
2430 else:
2431 def upload_file_to_sftp_file(sftpfile, url):
2432 return False;
2434 if(haveparamiko):
2435 def upload_file_to_sftp_string(sftpstring, url):
2436 sftpfileo = BytesIO(sftpstring);
2437 sftpfile = upload_file_to_sftp_files(ftpfileo, url);
2438 sftpfileo.close();
2439 return sftpfile;
2440 else:
2441 def upload_file_to_sftp_string(url):
2442 return False;