src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
17 17
18 18
19 class GreaseMonkeyDownloader(QObject): 19 class GreaseMonkeyDownloader(QObject):
20 """ 20 """
21 Class implementing the downloader for GreaseMonkey scripts. 21 Class implementing the downloader for GreaseMonkey scripts.
22 22
23 @signal finished(fileName) emitted to indicate the end of a script download 23 @signal finished(fileName) emitted to indicate the end of a script download
24 (str) 24 (str)
25 @signal error() emitted to indicate a script download error 25 @signal error() emitted to indicate a script download error
26 """ 26 """
27
27 finished = pyqtSignal(str) 28 finished = pyqtSignal(str)
28 error = pyqtSignal() 29 error = pyqtSignal()
29 30
30 DownloadMainScript = 1 31 DownloadMainScript = 1
31 DownloadRequireScript = 2 32 DownloadRequireScript = 2
32 33
33 def __init__(self, url, manager, mode): 34 def __init__(self, url, manager, mode):
34 """ 35 """
35 Constructor 36 Constructor
36 37
37 @param url URL to download script from 38 @param url URL to download script from
38 @type QUrl 39 @type QUrl
39 @param manager reference to the GreaseMonkey manager 40 @param manager reference to the GreaseMonkey manager
40 @type GreaseMonkeyManager 41 @type GreaseMonkeyManager
41 @param mode download mode 42 @param mode download mode
42 @type int (one of DownloadMainScript, DownloadRequireScript) 43 @type int (one of DownloadMainScript, DownloadRequireScript)
43 """ 44 """
44 super().__init__() 45 super().__init__()
45 46
46 self.__manager = manager 47 self.__manager = manager
47 48
48 self.__reply = WebBrowserWindow.networkManager().get( 49 self.__reply = WebBrowserWindow.networkManager().get(QNetworkRequest(url))
49 QNetworkRequest(url))
50 if mode == GreaseMonkeyDownloader.DownloadMainScript: 50 if mode == GreaseMonkeyDownloader.DownloadMainScript:
51 self.__reply.finished.connect(self.__scriptDownloaded) 51 self.__reply.finished.connect(self.__scriptDownloaded)
52 else: 52 else:
53 self.__reply.finished.connect(self.__requireDownloaded) 53 self.__reply.finished.connect(self.__requireDownloaded)
54 54
55 self.__fileName = "" 55 self.__fileName = ""
56 56
57 def updateScript(self, fileName): 57 def updateScript(self, fileName):
58 """ 58 """
59 Public method to set the file name for the script to be downloaded. 59 Public method to set the file name for the script to be downloaded.
60 60
61 @param fileName file name for the script 61 @param fileName file name for the script
62 @type str 62 @type str
63 """ 63 """
64 self.__fileName = fileName 64 self.__fileName = fileName
65 65
66 @pyqtSlot() 66 @pyqtSlot()
67 def __scriptDownloaded(self): 67 def __scriptDownloaded(self):
68 """ 68 """
69 Private slot to handle the finished download of a script. 69 Private slot to handle the finished download of a script.
70 """ 70 """
71 self.deleteLater() 71 self.deleteLater()
72 self.__reply.deleteLater() 72 self.__reply.deleteLater()
73 73
74 if self.__reply.error() != QNetworkReply.NetworkError.NoError: 74 if self.__reply.error() != QNetworkReply.NetworkError.NoError:
75 self.error.emit() 75 self.error.emit()
76 return 76 return
77 77
78 response = bytes(self.__reply.readAll()).decode() 78 response = bytes(self.__reply.readAll()).decode()
79 79
80 if "// ==UserScript==" not in response: 80 if "// ==UserScript==" not in response:
81 self.error.emit() 81 self.error.emit()
82 return 82 return
83 83
84 if not self.__fileName: 84 if not self.__fileName:
85 from WebBrowser.Tools import WebBrowserTools 85 from WebBrowser.Tools import WebBrowserTools
86
86 filePath = os.path.join( 87 filePath = os.path.join(
87 self.__manager.scriptsDirectory(), 88 self.__manager.scriptsDirectory(),
88 WebBrowserTools.getFileNameFromUrl(self.__reply.url())) 89 WebBrowserTools.getFileNameFromUrl(self.__reply.url()),
90 )
89 self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath) 91 self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath)
90 92
91 try: 93 try:
92 with open(self.__fileName, "w", encoding="utf-8") as f: 94 with open(self.__fileName, "w", encoding="utf-8") as f:
93 f.write(response) 95 f.write(response)
94 except OSError: 96 except OSError:
95 self.error.emit() 97 self.error.emit()
96 return 98 return
97 99
98 self.finished.emit(self.__fileName) 100 self.finished.emit(self.__fileName)
99 101
100 @pyqtSlot() 102 @pyqtSlot()
101 def __requireDownloaded(self): 103 def __requireDownloaded(self):
102 """ 104 """
103 Private slot to handle the finished download of a required script. 105 Private slot to handle the finished download of a required script.
104 """ 106 """
105 self.deleteLater() 107 self.deleteLater()
106 self.__reply.deleteLater() 108 self.__reply.deleteLater()
107 109
108 if self.__reply.error() != QNetworkReply.NetworkError.NoError: 110 if self.__reply.error() != QNetworkReply.NetworkError.NoError:
109 self.error.emit() 111 self.error.emit()
110 return 112 return
111 113
112 response = bytes(self.__reply.readAll()).decode() 114 response = bytes(self.__reply.readAll()).decode()
113 115
114 if not response: 116 if not response:
115 self.error.emit() 117 self.error.emit()
116 return 118 return
117 119
118 settings = QSettings( 120 settings = QSettings(
119 os.path.join(self.__manager.requireScriptsDirectory(), 121 os.path.join(self.__manager.requireScriptsDirectory(), "requires.ini"),
120 "requires.ini"), 122 QSettings.Format.IniFormat,
121 QSettings.Format.IniFormat) 123 )
122 settings.beginGroup("Files") 124 settings.beginGroup("Files")
123 125
124 if not self.__fileName: 126 if not self.__fileName:
125 self.__fileName = settings.value( 127 self.__fileName = settings.value(self.__reply.request().url().toString())
126 self.__reply.request().url().toString())
127 if not self.__fileName: 128 if not self.__fileName:
128 name = ( 129 name = pathlib.Path(self.__reply.request().url().path()).name
129 pathlib.Path(self.__reply.request().url().path()).name
130 )
131 if not name: 130 if not name:
132 name = "require.js" 131 name = "require.js"
133 elif not name.endswith(".js"): 132 elif not name.endswith(".js"):
134 name += ".js" 133 name += ".js"
135 filePath = os.path.join( 134 filePath = os.path.join(self.__manager.requireScriptsDirectory(), name)
136 self.__manager.requireScriptsDirectory(), name)
137 from WebBrowser.Tools import WebBrowserTools 135 from WebBrowser.Tools import WebBrowserTools
138 self.__fileName = WebBrowserTools.ensureUniqueFilename( 136
139 filePath, "{0}") 137 self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath, "{0}")
140 if not pathlib.Path(self.__fileName).is_absolute(): 138 if not pathlib.Path(self.__fileName).is_absolute():
141 self.__fileName = os.path.join( 139 self.__fileName = os.path.join(
142 self.__manager.requireScriptsDirectory(), 140 self.__manager.requireScriptsDirectory(), self.__fileName
143 self.__fileName) 141 )
144 142
145 try: 143 try:
146 with open(self.__fileName, "w", encoding="utf-8") as f: 144 with open(self.__fileName, "w", encoding="utf-8") as f:
147 f.write(response) 145 f.write(response)
148 except OSError: 146 except OSError:
149 self.error.emit() 147 self.error.emit()
150 return 148 return
151 149
152 settings.setValue(self.__reply.request().url().toString(), 150 settings.setValue(
153 pathlib.Path(self.__fileName).name) 151 self.__reply.request().url().toString(), pathlib.Path(self.__fileName).name
154 152 )
153
155 self.finished.emit(self.__fileName) 154 self.finished.emit(self.__fileName)

eric ide

mercurial