22import traceback
33import threading
44import os
5- import tarfile
5+ import tarfile , zipfile
66import urllib
77import json
8+ import shutil
89import node_variables
910from animation_loader import AnimationLoader
1011from repeated_timer import RepeatedTimer
1314class DownloadNodeJS (object ):
1415 def __init__ (self , node_version ):
1516 self .NODE_JS_VERSION = node_version
16- self .NODE_JS_BINARY_URL = "https://nodejs.org/dist/" + self .NODE_JS_VERSION + "/node-" + self .NODE_JS_VERSION + "-" + node_variables .NODE_JS_OS + "-" + node_variables .NODE_JS_ARCHITECTURE + ".tar.gz"
17+ self .NODE_JS_TAR_EXTENSION = ".zip" if node_variables .NODE_JS_OS == "win" else ".tar.gz"
18+ self .NODE_JS_BINARY_URL = "https://nodejs.org/dist/" + self .NODE_JS_VERSION + "/node-" + self .NODE_JS_VERSION + "-" + node_variables .NODE_JS_OS + "-" + node_variables .NODE_JS_ARCHITECTURE + self .NODE_JS_TAR_EXTENSION
1719 self .NODE_JS_BINARY_TARFILE_NAME = self .NODE_JS_BINARY_URL .split ('/' )[- 1 ]
1820 self .NODE_JS_BINARY_TARFILE_FULL_PATH = os .path .join (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM , self .NODE_JS_BINARY_TARFILE_NAME )
1921 self .animation_loader = AnimationLoader (["[= ]" , "[ = ]" , "[ = ]" , "[ = ]" , "[ =]" , "[ = ]" , "[ = ]" , "[ = ]" ], 0.067 , "Downloading: " + self .NODE_JS_BINARY_URL + " " )
@@ -23,7 +25,10 @@ def __init__(self, node_version):
2325 os .makedirs (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
2426 def download (self ):
2527 try :
26- urllib .request .urlretrieve (self .NODE_JS_BINARY_URL , self .NODE_JS_BINARY_TARFILE_FULL_PATH )
28+ request = urllib .request .Request (self .NODE_JS_BINARY_URL )
29+ request .add_header ('User-agent' , r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1' )
30+ with urllib .request .urlopen (request ) as response , open (self .NODE_JS_BINARY_TARFILE_FULL_PATH , 'wb' ) as out_file :
31+ shutil .copyfileobj (response , out_file )
2732 except Exception as err :
2833 traceback .print_exc ()
2934 self .on_error (err )
@@ -37,12 +42,22 @@ def start(self):
3742 if self .animation_loader :
3843 self .interval_animation = RepeatedTimer (self .animation_loader .sec , self .animation_loader .animate )
3944 def extract (self ):
40- with tarfile .open (self .NODE_JS_BINARY_TARFILE_FULL_PATH , "r:gz" ) as tar :
41- for member in tar .getmembers () :
42- if (member .name .endswith ("/bin/node" )) :
43- member .name = node_variables .NODE_JS_PATH_EXECUTABLE
44- tar .extract (member , node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
45- break
45+ if self .NODE_JS_TAR_EXTENSION != ".zip" :
46+ with tarfile .open (self .NODE_JS_BINARY_TARFILE_FULL_PATH , "r:gz" ) as tar :
47+ for member in tar .getmembers () :
48+ if member .name .endswith ("/bin/node" ) :
49+ member .name = node_variables .NODE_JS_PATH_EXECUTABLE
50+ tar .extract (member , node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
51+ break
52+ else :
53+ with zipfile .ZipFile (self .NODE_JS_BINARY_TARFILE_FULL_PATH , "r" ) as zip_file :
54+ for member in zip_file .namelist () :
55+ if member .endswith ("/node.exe" ) :
56+ with zip_file .open (member ) as node_file :
57+ with open (os .path .join (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM , "node.exe" ), "wb" ) as target :
58+ shutil .copyfileobj (node_file , target )
59+ break
60+
4661 def on_error (self , err ):
4762 self .animation_loader .on_complete ()
4863 self .interval_animation .stop ()
@@ -93,9 +108,10 @@ def install(node_version=""):
93108 if node_version != node_js .getCurrentNodeJSVersion () :
94109 DownloadNodeJS ( node_version ).start ()
95110
96- for thread in threading .enumerate () :
97- if thread .getName () == "checkUpgradeNodeJS" and thread .is_alive () :
98- return
99- thread = threading .Thread (target = checkUpgrade , name = "checkUpgradeNodeJS" )
100- thread .setDaemon (True )
101- thread .start ()
111+ if nodejs_already_installed :
112+ for thread in threading .enumerate () :
113+ if thread .getName () == "checkUpgradeNodeJS" and thread .is_alive () :
114+ return
115+ thread = threading .Thread (target = checkUpgrade , name = "checkUpgradeNodeJS" )
116+ thread .setDaemon (True )
117+ thread .start ()
0 commit comments