Enable customizing the save statistics time interval
[qBittorrent.git] / src / webui / www / private / views / preferences.html
blobfefb1e00c3fd08bfe9c72bd9e4627cf4f85c2f6d
1 <div id="BehaviorTab" class="PrefTab">
2 <fieldset class="settings">
3 <legend>QBT_TR(Language)QBT_TR[CONTEXT=OptionsDialog]</legend>
4 <label for="locale_select">QBT_TR(User interface language:)QBT_TR[CONTEXT=OptionsDialog]</label>
5 <select id="locale_select">
6 ${LANGUAGE_OPTIONS}
7 </select>
8 </fieldset>
10 <fieldset class="settings">
11 <legend>QBT_TR(Transfer list)QBT_TR[CONTEXT=OptionsDialog]</legend>
12 <div class="formRow" style="margin-bottom: 3px;" title="QBT_TR(Shows a confirmation dialog upon torrent deletion)QBT_TR[CONTEXT=OptionsDialog]">
13 <input type="checkbox" id="confirmTorrentDeletion">
14 <label for="confirmTorrentDeletion">QBT_TR(Confirm when deleting torrents)QBT_TR[CONTEXT=OptionsDialog]</label>
15 </div>
16 <div class="formRow" style="margin-bottom: 3px;">
17 <input type="checkbox" id="useAltRowColorsInput">
18 <label for="useAltRowColorsInput">QBT_TR(Use alternating row colors)QBT_TR[CONTEXT=OptionsDialog]</label>
19 </div>
20 <fieldset class="settings">
21 <legend>QBT_TR(Action on double-click)QBT_TR[CONTEXT=OptionsDialog]</legend>
22 <table>
23 <tbody>
24 <tr>
25 <td><label for="dblclickDownloadSelect">QBT_TR(Downloading torrents:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
26 <td>
27 <select id="dblclickDownloadSelect">
28 <option value="1" selected>QBT_TR(Start / stop torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
29 <option value="0">QBT_TR(No action)QBT_TR[CONTEXT=OptionsDialog]</option>
30 </select>
31 </td>
32 </tr>
33 <tr>
34 <td><label for="dblclickCompleteSelect">QBT_TR(Completed torrents:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
35 <td>
36 <select id="dblclickCompleteSelect">
37 <option value="1" selected>QBT_TR(Start / stop torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
38 <option value="0">QBT_TR(No action)QBT_TR[CONTEXT=OptionsDialog]</option>
39 </select>
40 </td>
41 </tr>
42 </tbody>
43 </table>
44 </fieldset>
45 <div class="formRow" style="margin-bottom: 3px;">
46 <input type="checkbox" id="hideZeroFiltersCheckbox">
47 <label for="hideZeroFiltersCheckbox">QBT_TR(Auto hide zero status filters)QBT_TR[CONTEXT=OptionsDialog]</label>
48 </div>
49 </fieldset>
51 <fieldset class="settings">
52 <legend>
53 <input type="checkbox" id="filelog_checkbox" onclick="qBittorrent.Preferences.updateFileLogEnabled();">
54 <label for="filelog_checkbox">QBT_TR(Log Files)QBT_TR[CONTEXT=OptionsDialog]</label>
55 </legend>
56 <div class="formRow">
57 <label for="filelog_save_path_input">QBT_TR(Save path:)QBT_TR[CONTEXT=OptionsDialog]</label>
58 <input type="text" id="filelog_save_path_input" class="pathDirectory">
59 </div>
60 <table>
61 <tbody>
62 <tr>
63 <td><input type="checkbox" id="filelog_backup_checkbox" onclick="qBittorrent.Preferences.updateFileLogBackupEnabled();"></td>
64 <td><label id="filelogMaxSizeLabel" for="filelog_backup_checkbox">QBT_TR(Backup the log file after:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
65 <td><input id="filelog_max_size_input" type="number" min="1" max="1024000" value="65" onchange="qBittorrent.Preferences.numberInputLimiter(this);" aria-labelledby="filelogMaxSizeLabel">QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]</td>
66 </tr>
67 <tr>
68 <td><input type="checkbox" id="filelog_delete_old_checkbox" onclick="qBittorrent.Preferences.updateFileLogDeleteEnabled();"></td>
69 <td><label id="filelogDeleteOldLabel" for="filelog_delete_old_checkbox">QBT_TR(Delete backup logs older than:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
70 <td>
71 <input type="number" min="1" max="365" value="6" id="filelog_age_input" onchange="qBittorrent.Preferences.numberInputLimiter(this);" aria-labelledby="filelogDeleteOldLabel">
72 <select id="filelog_age_type_select" aria-labelledby="filelogDeleteOldLabel">
73 <option value="0">QBT_TR(days)QBT_TR[CONTEXT=OptionsDialog]</option>
74 <option value="1" selected>QBT_TR(months)QBT_TR[CONTEXT=OptionsDialog]</option>
75 <option value="2">QBT_TR(years)QBT_TR[CONTEXT=OptionsDialog]</option>
76 </select>
77 </td>
78 </tr>
79 </tbody>
80 </table>
81 </fieldset>
83 <div class="formRow" style="margin-bottom: 5px;">
84 <input type="checkbox" id="performanceWarning">
85 <label for="performanceWarning">QBT_TR(Log performance warnings)QBT_TR[CONTEXT=OptionsDialog]</label>
86 </div>
88 <fieldset class="settings">
89 <legend title="QBT_TR(Following settings are WebUI only)QBT_TR[CONTEXT=OptionsDialog]">QBT_TR(Custom WebUI settings)QBT_TR[CONTEXT=OptionsDialog]</legend>
90 <div class="formRow" style="margin-bottom: 3px;">
91 <input type="checkbox" id="displayFullURLTrackerColumn">
92 <label for="displayFullURLTrackerColumn">QBT_TR(Display full announce URL in the Tracker column)QBT_TR[CONTEXT=OptionsDialog]</label>
93 </div>
94 </fieldset>
95 </div>
97 <div id="DownloadsTab" class="PrefTab invisible">
98 <fieldset class="settings">
99 <legend>QBT_TR(When adding a torrent)QBT_TR[CONTEXT=OptionsDialog]</legend>
100 <div class="formRow">
101 <label for="contentlayout_select">QBT_TR(Torrent content layout:)QBT_TR[CONTEXT=OptionsDialog]</label>
102 <select id="contentlayout_select">
103 <option value="Original">QBT_TR(Original)QBT_TR[CONTEXT=OptionsDialog]</option>
104 <option value="Subfolder">QBT_TR(Create subfolder)QBT_TR[CONTEXT=OptionsDialog]</option>
105 <option value="NoSubfolder">QBT_TR(Don't create subfolder)QBT_TR[CONTEXT=OptionsDialog]</option>
106 </select>
107 </div>
108 <div class="formRow">
109 <input type="checkbox" id="addToTopOfQueueCheckbox">
110 <label for="addToTopOfQueueCheckbox">QBT_TR(Add to top of queue)QBT_TR[CONTEXT=OptionsDialog]</label>
111 </div>
112 <div class="formRow">
113 <input type="checkbox" id="dontstartdownloads_checkbox">
114 <label for="dontstartdownloads_checkbox">QBT_TR(Do not start the download automatically)QBT_TR[CONTEXT=OptionsDialog]</label>
115 </div>
116 <div class="formRow">
117 <label for="stopConditionSelect">QBT_TR(Torrent stop condition:)QBT_TR[CONTEXT=OptionsDialog]</label>
118 <select id="stopConditionSelect">
119 <option value="None">QBT_TR(None)QBT_TR[CONTEXT=OptionsDialog]</option>
120 <option value="MetadataReceived">QBT_TR(Metadata received)QBT_TR[CONTEXT=OptionsDialog]</option>
121 <option value="FilesChecked">QBT_TR(Files checked)QBT_TR[CONTEXT=OptionsDialog]</option>
122 </select>
123 </div>
124 <fieldset class="settings">
125 <legend>QBT_TR(When duplicate torrent is being added)QBT_TR[CONTEXT=OptionsDialog]</legend>
126 <div class="formRow">
127 <input type="checkbox" id="mergeTrackersInput">
128 <label for="mergeTrackersInput">QBT_TR(Merge trackers to existing torrent)QBT_TR[CONTEXT=OptionsDialog]</label>
129 </div>
130 </fieldset>
131 <div class="formRow">
132 <input type="checkbox" id="deletetorrentfileafter_checkbox">
133 <label for="deletetorrentfileafter_checkbox">QBT_TR(Delete .torrent files afterwards)QBT_TR[CONTEXT=OptionsDialog]</label>
134 </div>
135 </fieldset>
137 <div class="formRow">
138 <input type="checkbox" id="preallocateall_checkbox">
139 <label for="preallocateall_checkbox">QBT_TR(Pre-allocate disk space for all files)QBT_TR[CONTEXT=OptionsDialog]</label>
140 </div>
141 <div class="formRow">
142 <span id="appendexttr">
143 <input type="checkbox" id="appendext_checkbox">
144 <label for="appendext_checkbox">QBT_TR(Append .!qB extension to incomplete files)QBT_TR[CONTEXT=OptionsDialog]</label>
145 </span>
146 </div>
147 <div class="formRow">
148 <span id="unwantedfoldertr">
149 <input type="checkbox" id="unwantedfolder_checkbox">
150 <label for="unwantedfolder_checkbox">QBT_TR(Keep unselected files in ".unwanted" folder)QBT_TR[CONTEXT=OptionsDialog]</label>
151 </span>
152 </div>
154 <fieldset class="settings">
155 <legend>QBT_TR(Saving Management)QBT_TR[CONTEXT=HttpServer]</legend>
156 <table>
157 <tbody>
158 <tr>
159 <td>
160 <label for="default_tmm_combobox">QBT_TR(Default Torrent Management Mode:)QBT_TR[CONTEXT=OptionsDialog]</label>
161 </td>
162 <td>
163 <select id="default_tmm_combobox">
164 <option value="false" selected>QBT_TR(Manual)QBT_TR[CONTEXT=OptionsDialog]</option>
165 <option value="true">QBT_TR(Automatic)QBT_TR[CONTEXT=OptionsDialog]</option>
166 </select>
167 </td>
168 </tr>
169 <tr>
170 <td>
171 <label for="torrent_changed_tmm_combobox">QBT_TR(When Torrent Category changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
172 </td>
173 <td>
174 <select id="torrent_changed_tmm_combobox">
175 <option value="true">QBT_TR(Relocate torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
176 <option value="false" selected>QBT_TR(Switch torrent to Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</option>
177 </select>
178 </td>
179 </tr>
180 <tr>
181 <td>
182 <label for="save_path_changed_tmm_combobox">QBT_TR(When Default Save Path changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
183 </td>
184 <td>
185 <select id="save_path_changed_tmm_combobox">
186 <option value="true">QBT_TR(Relocate affected torrents)QBT_TR[CONTEXT=OptionsDialog]</option>
187 <option value="false" selected>QBT_TR(Switch affected torrents to Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</option>
188 </select>
189 </td>
190 </tr>
191 <tr>
192 <td>
193 <label for="category_changed_tmm_combobox">QBT_TR(When Category Save Path changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
194 </td>
195 <td>
196 <select id="category_changed_tmm_combobox">
197 <option value="true">QBT_TR(Relocate affected torrents)QBT_TR[CONTEXT=OptionsDialog]</option>
198 <option value="false" selected>QBT_TR(Switch affected torrents to Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</option>
199 </select>
200 </td>
201 </tr>
202 </tbody>
203 </table>
204 <div class="formRow">
205 <input type="checkbox" id="use_subcategories_checkbox">
206 <label for="use_subcategories_checkbox">QBT_TR(Use Subcategories)QBT_TR[CONTEXT=OptionsDialog]</label>
207 </div>
208 <div class="formRow">
209 <input type="checkbox" id="categoryPathsManualModeCheckbox" title="QBT_TR(Resolve relative Save Path against appropriate Category path instead of Default one)QBT_TR[CONTEXT=OptionsDialog]">
210 <label for="categoryPathsManualModeCheckbox">QBT_TR(Use Category paths in Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</label>
211 </div>
212 <table>
213 <tbody>
214 <tr>
215 <td>
216 <label for="savepath_text">QBT_TR(Default Save Path:)QBT_TR[CONTEXT=OptionsDialog]</label>
217 </td>
218 <td>
219 <input type="text" id="savepath_text" class="pathDirectory" autocorrect="off" autocapitalize="none">
220 </td>
221 </tr>
222 <tr>
223 <td>
224 <input type="checkbox" id="temppath_checkbox" onclick="qBittorrent.Preferences.updateTempDirEnabled();">
225 <label id="tempPathLabel" for="temppath_checkbox">QBT_TR(Keep incomplete torrents in:)QBT_TR[CONTEXT=OptionsDialog]</label>
226 </td>
227 <td>
228 <input type="text" id="temppath_text" class="pathDirectory" autocorrect="off" autocapitalize="none" aria-labelledby="tempPathLabel">
229 </td>
230 </tr>
231 <tr>
232 <td>
233 <input type="checkbox" id="exportdir_checkbox" onclick="qBittorrent.Preferences.updateExportDirEnabled();">
234 <label id="exportDirLabel" for="exportdir_checkbox">QBT_TR(Copy .torrent files to:)QBT_TR[CONTEXT=OptionsDialog]</label>
235 </td>
236 <td>
237 <input type="text" id="exportdir_text" class="pathDirectory" autocorrect="off" autocapitalize="none" aria-labelledby="exportDirLabel">
238 </td>
239 </tr>
240 <tr>
241 <td>
242 <input type="checkbox" id="exportdirfin_checkbox" onclick="qBittorrent.Preferences.updateExportDirFinEnabled();">
243 <label id="exportDirFinLabel" for="exportdirfin_checkbox">QBT_TR(Copy .torrent files for finished downloads to:)QBT_TR[CONTEXT=OptionsDialog]</label>
244 </td>
245 <td>
246 <input type="text" id="exportdirfin_text" class="pathDirectory" autocorrect="off" autocapitalize="none" aria-labelledby="exportDirFinLabel">
247 </td>
248 </tr>
249 </tbody>
250 </table>
251 </fieldset>
253 <fieldset class="settings">
254 <legend>QBT_TR(Automatically add torrents from:)QBT_TR[CONTEXT=OptionsDialog]</legend>
255 <table id="watched_folders_tab" style="border: 1px solid black;">
256 <thead>
257 <tr>
258 <th scope="col">QBT_TR(Monitored Folder)QBT_TR[CONTEXT=ScanFoldersModel]</th>
259 <th scope="col">QBT_TR(Override Save Location)QBT_TR[CONTEXT=ScanFoldersModel]</th>
260 </tr>
261 </thead>
262 <tbody></tbody>
263 </table>
264 </fieldset>
266 <fieldset class="settings">
267 <legend>
268 <input type="checkbox" id="excludedFileNamesCheckbox" onclick="qBittorrent.Preferences.updateExcludedFileNamesEnabled();">
269 <label id="excludedFileNamesLabel" for="excludedFileNamesCheckbox">QBT_TR(Excluded file names)QBT_TR[CONTEXT=OptionsDialog]</label>
270 </legend>
271 <textarea id="excludedFileNamesTextarea" rows="6" cols="70" aria-labelledby="excludedFileNamesLabel"></textarea>
272 </fieldset>
274 <fieldset class="settings">
275 <legend>
276 <input type="checkbox" id="mail_notification_checkbox" onclick="qBittorrent.Preferences.updateMailNotification();">
277 <label for="mail_notification_checkbox">QBT_TR(Email notification upon download completion)QBT_TR[CONTEXT=OptionsDialog]</label>
278 </legend>
279 <table>
280 <tbody>
281 <tr>
282 <td>
283 <label for="src_email_txt">QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog]</label>
284 </td>
285 <td>
286 <input type="text" id="src_email_txt">
287 </td>
288 </tr>
289 <tr>
290 <td>
291 <label for="dest_email_txt">QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog]</label>
292 </td>
293 <td>
294 <input type="text" id="dest_email_txt">
295 </td>
296 </tr>
297 <tr>
298 <td>
299 <label for="smtp_server_txt">QBT_TR(SMTP server:)QBT_TR[CONTEXT=OptionsDialog]</label>
300 </td>
301 <td>
302 <input type="text" id="smtp_server_txt">
303 </td>
304 </tr>
305 </tbody>
306 </table>
307 <div class="formRow">
308 <input type="checkbox" id="mail_ssl_checkbox"><label for="mail_ssl_checkbox">QBT_TR(This server requires a secure connection (SSL))QBT_TR[CONTEXT=OptionsDialog]</label>
309 </div>
310 <fieldset class="settings">
311 <legend>
312 <input type="checkbox" id="mail_auth_checkbox" onclick="qBittorrent.Preferences.updateMailAuthSettings();">
313 <label for="mail_auth_checkbox">QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog]</label>
314 </legend>
315 <table>
316 <tbody>
317 <tr>
318 <td>
319 <label for="mail_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
320 </td>
321 <td>
322 <input type="text" id="mail_username_text">
323 </td>
324 </tr>
325 <tr>
326 <td>
327 <label for="mail_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
328 </td>
329 <td>
330 <input type="password" id="mail_password_text">
331 </td>
332 </tr>
333 </tbody>
334 </table>
335 </fieldset>
336 <div class="formRow">
337 <input type="button" id="mail_test_button" value="QBT_TR(Send test email)QBT_TR[CONTEXT=OptionsDialog]" onclick="qBittorrent.Preferences.sendTestEmail();">
338 </div>
339 </fieldset>
341 <fieldset class="settings">
342 <legend>
343 QBT_TR(Run external program)QBT_TR[CONTEXT=OptionsDialog]
344 </legend>
345 <div class="formRow">
346 <input type="checkbox" id="autorunOnTorrentAddedCheckbox" onclick="qBittorrent.Preferences.updateAutoRunOnTorrentAdded();">
347 <label id="autorunOnTorrentAddedLabel" for="autorunOnTorrentAddedCheckbox">QBT_TR(Run on torrent added:)QBT_TR[CONTEXT=OptionsDialog]</label>
348 <input type="text" id="autorunOnTorrentAddedProgram" aria-labelledby="autorunOnTorrentAddedLabel" style="width: 400px;">
349 </div>
350 <div class="formRow">
351 <input type="checkbox" id="autorun_checkbox" onclick="qBittorrent.Preferences.updateAutoRun();">
352 <label id="autorunLabel" for="autorun_checkbox">QBT_TR(Run on torrent finished:)QBT_TR[CONTEXT=OptionsDialog]</label>
353 <input type="text" id="autorunProg_txt" aria-labelledby="autorunLabel" style="width: 400px;">
354 </div>
355 <div style="font-style: italic;">QBT_TR(Supported parameters (case sensitive):)QBT_TR[CONTEXT=OptionsDialog]
356 <ul>
357 <li>QBT_TR(%N: Torrent name)QBT_TR[CONTEXT=OptionsDialog]</li>
358 <li>QBT_TR(%L: Category)QBT_TR[CONTEXT=OptionsDialog]</li>
359 <li>QBT_TR(%G: Tags (separated by comma))QBT_TR[CONTEXT=OptionsDialog]</li>
360 <li>QBT_TR(%F: Content path (same as root path for multifile torrent))QBT_TR[CONTEXT=OptionsDialog]</li>
361 <li>QBT_TR(%R: Root path (first torrent subdirectory path))QBT_TR[CONTEXT=OptionsDialog]</li>
362 <li>QBT_TR(%D: Save path)QBT_TR[CONTEXT=OptionsDialog]</li>
363 <li>QBT_TR(%C: Number of files)QBT_TR[CONTEXT=OptionsDialog]</li>
364 <li>QBT_TR(%Z: Torrent size (bytes))QBT_TR[CONTEXT=OptionsDialog]</li>
365 <li>QBT_TR(%T: Current tracker)QBT_TR[CONTEXT=OptionsDialog]</li>
366 <li>QBT_TR(%I: Info hash v1)QBT_TR[CONTEXT=OptionsDialog]</li>
367 <li>QBT_TR(%J: Info hash v2)QBT_TR[CONTEXT=OptionsDialog]</li>
368 <li>QBT_TR(%K: Torrent ID)QBT_TR[CONTEXT=OptionsDialog]</li>
369 </ul>
370 QBT_TR(Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N"))QBT_TR[CONTEXT=OptionsDialog]
371 </div>
372 </fieldset>
373 </div>
375 <div id="ConnectionTab" class="PrefTab invisible">
376 <div class="formRow">
377 <label for="enable_protocol_combobox">QBT_TR(Peer connection protocol:)QBT_TR[CONTEXT=OptionsDialog]</label>
378 <select id="enable_protocol_combobox">
379 <option value="0" selected>QBT_TR(TCP and μTP)QBT_TR[CONTEXT=OptionsDialog]</option>
380 <option value="1">TCP</option>
381 <option value="2">μTP</option>
382 </select>
383 </div>
384 <fieldset class="settings">
385 <legend>QBT_TR(Listening Port)QBT_TR[CONTEXT=OptionsDialog]</legend>
386 <div class="formRow">
387 <label for="port_value">QBT_TR(Port used for incoming connections:)QBT_TR[CONTEXT=OptionsDialog]</label>
388 <input type="text" id="port_value" style="width: 4em;" title="QBT_TR(Set to 0 to let your system pick an unused port)QBT_TR[CONTEXT=OptionsDialog]">
389 <button type="button" style="margin-left: 1em;" onclick="qBittorrent.Preferences.generateRandomPort();">QBT_TR(Random)QBT_TR[CONTEXT=OptionsDialog]</button>
390 </div>
391 <div class="formRow">
392 <input type="checkbox" id="upnp_checkbox">
393 <label for="upnp_checkbox">QBT_TR(Use UPnP / NAT-PMP port forwarding from my router)QBT_TR[CONTEXT=OptionsDialog]</label>
394 </div>
395 </fieldset>
397 <fieldset class="settings">
398 <legend>QBT_TR(Connections Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
399 <table>
400 <tbody>
401 <tr>
402 <td>
403 <input type="checkbox" id="max_connec_checkbox" onclick="qBittorrent.Preferences.updateMaxConnecEnabled();">
404 <label id="maxConnectionsLabel" for="max_connec_checkbox">QBT_TR(Global maximum number of connections:)QBT_TR[CONTEXT=OptionsDialog]</label>
405 </td>
406 <td><input type="text" id="max_connec_value" aria-labelledby="maxConnectionsLabel" style="width: 4em;"></td>
407 </tr>
408 <tr>
409 <td>
410 <input type="checkbox" id="max_connec_per_torrent_checkbox" onclick="qBittorrent.Preferences.updateMaxConnecPerTorrentEnabled();">
411 <label id="maxConnectionsPerTorrentLabel" for="max_connec_per_torrent_checkbox">QBT_TR(Maximum number of connections per torrent:)QBT_TR[CONTEXT=OptionsDialog]</label>
412 </td>
413 <td><input type="text" id="max_connec_per_torrent_value" aria-labelledby="maxConnectionsPerTorrentLabel" style="width: 4em;"></td>
414 </tr>
415 <tr>
416 <td>
417 <input type="checkbox" id="max_uploads_checkbox" onclick="qBittorrent.Preferences.updateMaxUploadsEnabled();">
418 <label id="maxUploadsLabel" for="max_uploads_checkbox">QBT_TR(Global maximum number of upload slots:)QBT_TR[CONTEXT=OptionsDialog]</label>
419 </td>
420 <td><input type="text" id="max_uploads_value" aria-labelledby="maxUploadsLabel" style="width: 4em;"></td>
421 </tr>
422 <tr>
423 <td>
424 <input type="checkbox" id="max_uploads_per_torrent_checkbox" onclick="qBittorrent.Preferences.updateMaxUploadsPerTorrentEnabled();">
425 <label id="maxUploadsPerTorrentLabel" for="max_uploads_per_torrent_checkbox">QBT_TR(Maximum number of upload slots per torrent:)QBT_TR[CONTEXT=OptionsDialog]</label>
426 </td>
427 <td><input type="text" id="max_uploads_per_torrent_value" aria-labelledby="maxUploadsPerTorrentLabel" style="width: 4em;"></td>
428 </tr>
429 </tbody>
430 </table>
431 </fieldset>
433 <fieldset class="settings" id="fieldsetI2p">
434 <legend>
435 <input type="checkbox" id="i2pEnabledCheckbox" onclick="qBittorrent.Preferences.updateI2PSettingsEnabled();">
436 <label for="i2pEnabledCheckbox">QBT_TR(I2P (Experimental))QBT_TR[CONTEXT=OptionsDialog]</label>
437 </legend>
438 <table>
439 <tbody>
440 <tr>
441 <td>
442 <label for="i2pAddress">QBT_TR(Host:)QBT_TR[CONTEXT=OptionsDialog]</label>
443 </td>
444 <td>
445 <input type="text" id="i2pAddress">
446 </td>
447 <td>
448 <label for="i2pPort">QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog]</label>
449 </td>
450 <td>
451 <input type="number" id="i2pPort" min="0" max="65535" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 5em;">
452 </td>
453 </tr>
454 </tbody>
455 </table>
456 <div class="formRow">
457 <input type="checkbox" id="i2pMixedMode" title="QBT_TR(If &quot;mixed mode&quot; is enabled, I2P torrents are allowed to also get peers from other sources than the tracker, and connect to regular IPs, not providing any anonymization. This may be useful if the user is not interested in the anonymization of I2P, but still wants to be able to connect to I2P peers.)QBT_TR[CONTEXT=OptionsDialog]">
458 <label for="i2pMixedMode">QBT_TR(Mixed mode)QBT_TR[CONTEXT=OptionsDialog]</label>
459 </div>
460 </fieldset>
462 <fieldset class="settings">
463 <legend>QBT_TR(Proxy Server)QBT_TR[CONTEXT=OptionsDialog]</legend>
464 <table>
465 <tbody>
466 <tr>
467 <td>
468 <label for="peer_proxy_type_select">QBT_TR(Type:)QBT_TR[CONTEXT=OptionsDialog]</label>
469 </td>
470 <td>
471 <select id="peer_proxy_type_select" onchange="qBittorrent.Preferences.updatePeerProxySettings();">
472 <option value="None">QBT_TR((None))QBT_TR[CONTEXT=OptionsDialog]</option>
473 <option value="SOCKS4">QBT_TR(SOCKS4)QBT_TR[CONTEXT=OptionsDialog]</option>
474 <option value="SOCKS5">QBT_TR(SOCKS5)QBT_TR[CONTEXT=OptionsDialog]</option>
475 <option value="HTTP">QBT_TR(HTTP)QBT_TR[CONTEXT=OptionsDialog]</option>
476 </select>
477 </td>
478 <td>
479 <label for="peer_proxy_host_text">QBT_TR(Host:)QBT_TR[CONTEXT=OptionsDialog]</label>
480 </td>
481 <td>
482 <input type="text" id="peer_proxy_host_text">
483 </td>
484 <td>
485 <label for="peer_proxy_port_value">QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog]</label>
486 </td>
487 <td>
488 <input type="text" id="peer_proxy_port_value" style="width: 4em;">
489 </td>
490 </tr>
491 </tbody>
492 </table>
494 <div class="formRow">
495 <input type="checkbox" id="proxyHostnameLookupCheckbox" title="QBT_TR(If checked, hostname lookups are done via the proxy.)QBT_TR[CONTEXT=OptionsDialog]">
496 <label for="proxyHostnameLookupCheckbox">QBT_TR(Perform hostname lookup via proxy)QBT_TR[CONTEXT=OptionsDialog]</label>
497 </div>
499 <fieldset class="settings">
500 <legend>
501 <input type="checkbox" id="peer_proxy_auth_checkbox" onclick="qBittorrent.Preferences.updatePeerProxyAuthSettings();">
502 <label for="peer_proxy_auth_checkbox">QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog]</label>
503 </legend>
504 <table>
505 <tbody>
506 <tr>
507 <td>
508 <label for="peer_proxy_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
509 </td>
510 <td>
511 <input type="text" id="peer_proxy_username_text">
512 </td>
513 </tr>
514 <tr>
515 <td>
516 <label for="peer_proxy_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
517 </td>
518 <td>
519 <input type="password" id="peer_proxy_password_text">
520 </td>
521 </tr>
522 </tbody>
523 </table>
524 <div class="formRow">
525 <span>QBT_TR(Info: The password is saved unencrypted)QBT_TR[CONTEXT=OptionsDialog]</span>
526 </div>
527 </fieldset>
529 <fieldset class="settings">
530 <legend>
531 <input type="checkbox" id="proxy_bittorrent_checkbox" onclick="qBittorrent.Preferences.updatePeerProxySettings();">
532 <label for="proxy_bittorrent_checkbox">QBT_TR(Use proxy for BitTorrent purposes)QBT_TR[CONTEXT=OptionsDialog]</label>
533 </legend>
534 <div class="formRow">
535 <input type="checkbox" id="use_peer_proxy_checkbox">
536 <label for="use_peer_proxy_checkbox">QBT_TR(Use proxy for peer connections)QBT_TR[CONTEXT=OptionsDialog]</label>
537 </div>
538 </fieldset>
539 <div class="formRow">
540 <input type="checkbox" id="proxy_rss_checkbox">
541 <label for="proxy_rss_checkbox">QBT_TR(Use proxy for RSS purposes)QBT_TR[CONTEXT=OptionsDialog]</label>
542 </div>
543 <div class="formRow">
544 <input type="checkbox" id="proxy_misc_checkbox">
545 <label for="proxy_misc_checkbox">QBT_TR(Use proxy for general purposes)QBT_TR[CONTEXT=OptionsDialog]</label>
546 </div>
547 </fieldset>
549 <fieldset class="settings">
550 <legend>
551 <label>QBT_TR(IP Filtering)QBT_TR[CONTEXT=OptionsDialog]</label>
552 </legend>
553 <div class="formRow">
554 <input type="checkbox" id="ipfilter_text_checkbox" onclick="qBittorrent.Preferences.updateFilterSettings();">
555 <label id="ipfilterTextLabel" for="ipfilter_text_checkbox">QBT_TR(Filter path (.dat, .p2p, .p2b):)QBT_TR[CONTEXT=OptionsDialog]</label>
556 <input type="text" id="ipfilter_text" aria-labelledby="ipfilterTextLabel">
557 </div>
558 <div class="formRow">
559 <input type="checkbox" id="ipfilter_trackers_checkbox">
560 <label for="ipfilter_trackers_checkbox">QBT_TR(Apply to trackers)QBT_TR[CONTEXT=OptionsDialog]</label>
561 </div>
562 <div class="formRow">
563 <fieldset class="settings">
564 <legend id="manuallyBannedIPAddressesLabel">QBT_TR(Manually banned IP addresses...)QBT_TR[CONTEXT=OptionsDialog]</legend>
565 <textarea id="banned_IPs_textarea" aria-labelledby="manuallyBannedIPAddressesLabel" rows="5" cols="70"></textarea>
566 </fieldset>
567 </div>
568 </fieldset>
569 </div>
571 <div id="SpeedTab" class="PrefTab invisible">
572 <fieldset class="settings">
573 <legend>QBT_TR(Global Rate Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
574 <table>
575 <tbody>
576 <tr>
577 <td rowspan="2">
578 <img src="images/slow_off.svg" style="height: 1.5em;" alt="QBT_TR(Alternative speed limits)QBT_TR[CONTEXT=MainWindow]">
579 </td>
580 <td><label for="up_limit_value">QBT_TR(Upload:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
581 <td><input type="number" id="up_limit_value" style="width: 4em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
582 </tr>
583 <tr>
584 <td><label for="dl_limit_value">QBT_TR(Download:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
585 <td><input type="number" id="dl_limit_value" style="width: 4em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
586 </tr>
587 </tbody>
588 </table>
589 <i>QBT_TR(0 means unlimited)QBT_TR[CONTEXT=OptionsDialog]</i>
590 </fieldset>
592 <fieldset class="settings">
593 <legend>QBT_TR(Alternative Rate Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
594 <table>
595 <tbody>
596 <tr>
597 <td rowspan="2">
598 <img src="images/slow.svg" style="height: 1.5em;" alt="QBT_TR(Alternative speed limits)QBT_TR[CONTEXT=MainWindow]">
599 </td>
600 <td><label for="alt_up_limit_value">QBT_TR(Upload:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
601 <td><input type="number" id="alt_up_limit_value" style="width: 4em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
602 </tr>
603 <tr>
604 <td><label for="alt_dl_limit_value">QBT_TR(Download:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
605 <td><input type="number" id="alt_dl_limit_value" style="width: 4em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
606 </tr>
607 </tbody>
608 </table>
609 <i>QBT_TR(0 means unlimited)QBT_TR[CONTEXT=OptionsDialog]</i>
611 <fieldset class="settings">
612 <legend>
613 <input type="checkbox" id="limitSchedulingCheckbox" onclick="qBittorrent.Preferences.updateSchedulingEnabled();">
614 <label for="limitSchedulingCheckbox">QBT_TR(Schedule the use of alternative rate limits)QBT_TR[CONTEXT=OptionsDialog]</label>
615 </legend>
616 <div class="formRow">
617 <label id="scheduleFromHourLabel">QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog]</label>
618 <input type="text" id="schedule_from_hour" aria-labelledby="scheduleFromHourLabel" style="width: 1.5em;">:<input type="text" id="schedule_from_min" aria-labelledby="scheduleFromHourLabel" style="width: 1.5em;">
619 <label id="scheduleToHourLabel">QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog]</label>
620 <input type="text" id="schedule_to_hour" aria-labelledby="scheduleToHourLabel" style="width: 1.5em;">:<input type="text" id="schedule_to_min" aria-labelledby="scheduleToHourLabel" style="width: 1.5em;">
621 </div>
622 <div class="formRow">
623 <label for="schedule_freq_select">QBT_TR(When:)QBT_TR[CONTEXT=OptionsDialog]</label>
624 <select id="schedule_freq_select">
625 <option value="0">QBT_TR(Every day)QBT_TR[CONTEXT=OptionsDialog]</option>
626 <option value="1">QBT_TR(Weekdays)QBT_TR[CONTEXT=OptionsDialog]</option>
627 <option value="2">QBT_TR(Weekends)QBT_TR[CONTEXT=OptionsDialog]</option>
628 <option value="3">QBT_TR(Monday)QBT_TR[CONTEXT=HttpServer]</option>
629 <option value="4">QBT_TR(Tuesday)QBT_TR[CONTEXT=HttpServer]</option>
630 <option value="5">QBT_TR(Wednesday)QBT_TR[CONTEXT=HttpServer]</option>
631 <option value="6">QBT_TR(Thursday)QBT_TR[CONTEXT=HttpServer]</option>
632 <option value="7">QBT_TR(Friday)QBT_TR[CONTEXT=HttpServer]</option>
633 <option value="8">QBT_TR(Saturday)QBT_TR[CONTEXT=HttpServer]</option>
634 <option value="9">QBT_TR(Sunday)QBT_TR[CONTEXT=HttpServer]</option>
635 </select>
636 </div>
637 </fieldset>
638 </fieldset>
640 <fieldset class="settings">
641 <legend>QBT_TR(Rate Limits Settings)QBT_TR[CONTEXT=OptionsDialog]</legend>
642 <div class="formRow">
643 <input type="checkbox" id="limit_utp_rate_checkbox">
644 <label for="limit_utp_rate_checkbox">QBT_TR(Apply rate limit to µTP protocol)QBT_TR[CONTEXT=OptionsDialog]</label>
645 </div>
646 <div class="formRow">
647 <input type="checkbox" id="limit_tcp_overhead_checkbox">
648 <label for="limit_tcp_overhead_checkbox">QBT_TR(Apply rate limit to transport overhead)QBT_TR[CONTEXT=OptionsDialog]</label>
649 </div>
650 <div class="formRow">
651 <input type="checkbox" id="limit_lan_peers_checkbox">
652 <label for="limit_lan_peers_checkbox">QBT_TR(Apply rate limit to peers on LAN)QBT_TR[CONTEXT=OptionsDialog]</label>
653 </div>
654 </fieldset>
655 </div>
657 <div id="BittorrentTab" class="PrefTab invisible">
658 <fieldset class="settings">
659 <legend>QBT_TR(Privacy)QBT_TR[CONTEXT=OptionsDialog]</legend>
660 <div class="formRow">
661 <input type="checkbox" id="dht_checkbox">
662 <label for="dht_checkbox">QBT_TR(Enable DHT (decentralized network) to find more peers)QBT_TR[CONTEXT=OptionsDialog]</label>
663 </div>
664 <div class="formRow">
665 <input type="checkbox" id="pex_checkbox">
666 <label for="pex_checkbox">QBT_TR(Enable Peer Exchange (PeX) to find more peers)QBT_TR[CONTEXT=OptionsDialog]</label>
667 </div>
668 <div class="formRow">
669 <input type="checkbox" id="lsd_checkbox">
670 <label for="lsd_checkbox">QBT_TR(Enable Local Peer Discovery to find more peers)QBT_TR[CONTEXT=OptionsDialog]</label>
671 </div>
672 <div class="formRow">
673 <label for="encryption_select">QBT_TR(Encryption mode:)QBT_TR[CONTEXT=OptionsDialog]</label>
674 <select id="encryption_select">
675 <option value="0">QBT_TR(Allow encryption)QBT_TR[CONTEXT=OptionsDialog]</option>
676 <option value="1">QBT_TR(Require encryption)QBT_TR[CONTEXT=OptionsDialog]</option>
677 <option value="2">QBT_TR(Disable encryption)QBT_TR[CONTEXT=OptionsDialog]</option>
678 </select>
679 </div>
680 <div class="formRow">
681 <input type="checkbox" id="anonymous_mode_checkbox">
682 <label for="anonymous_mode_checkbox">QBT_TR(Enable anonymous mode)QBT_TR[CONTEXT=OptionsDialog] (<a target="_blank" href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">QBT_TR(More information)QBT_TR[CONTEXT=HttpServer]</a>)</label>
683 </div>
684 </fieldset>
686 <div class="formRow">
687 <label for="maxActiveCheckingTorrents">QBT_TR(Max active checking torrents:)QBT_TR[CONTEXT=OptionsDialog]</label>
688 <input type="number" id="maxActiveCheckingTorrents" style="width: 4em;" min="-1">
689 </div>
691 <fieldset class="settings">
692 <legend>
693 <input type="checkbox" id="queueing_checkbox" onclick="qBittorrent.Preferences.updateQueueingSystem();">
694 <label for="queueing_checkbox">QBT_TR(Torrent Queueing)QBT_TR[CONTEXT=OptionsDialog]</label>
695 </legend>
696 <table>
697 <tbody>
698 <tr>
699 <td>
700 <label for="max_active_dl_value">QBT_TR(Maximum active downloads:)QBT_TR[CONTEXT=OptionsDialog]</label>
701 </td>
702 <td>
703 <input type="text" id="max_active_dl_value" style="width: 4em;">
704 </td>
705 </tr>
706 <tr>
707 <td>
708 <label for="max_active_up_value">QBT_TR(Maximum active uploads:)QBT_TR[CONTEXT=OptionsDialog]</label>
709 </td>
710 <td>
711 <input type="text" id="max_active_up_value" style="width: 4em;">
712 </td>
713 </tr>
714 <tr>
715 <td>
716 <label for="max_active_to_value">QBT_TR(Maximum active torrents:)QBT_TR[CONTEXT=OptionsDialog]</label>
717 </td>
718 <td>
719 <input type="text" id="max_active_to_value" style="width: 4em;">
720 </td>
721 </tr>
722 </tbody>
723 </table>
724 <fieldset class="settings">
725 <legend>
726 <input type="checkbox" id="dont_count_slow_torrents_checkbox" onclick="qBittorrent.Preferences.updateSlowTorrentsSettings();">
727 <label for="dont_count_slow_torrents_checkbox">QBT_TR(Do not count slow torrents in these limits)QBT_TR[CONTEXT=OptionsDialog]</label>
728 </legend>
729 <table>
730 <tbody>
731 <tr>
732 <td>
733 <label for="dl_rate_threshold">QBT_TR(Download rate threshold:)QBT_TR[CONTEXT=OptionsDialog]</label>
734 </td>
735 <td>
736 <input type="text" id="dl_rate_threshold" style="width: 4em;">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]
737 </td>
738 </tr>
739 <tr>
740 <td>
741 <label for="ul_rate_threshold">QBT_TR(Upload rate threshold:)QBT_TR[CONTEXT=OptionsDialog]</label>
742 </td>
743 <td>
744 <input type="text" id="ul_rate_threshold" style="width: 4em;">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]
745 </td>
746 </tr>
747 <tr>
748 <td>
749 <label for="torrent_inactive_timer">QBT_TR(Torrent inactivity timer:)QBT_TR[CONTEXT=OptionsDialog]</label>
750 </td>
751 <td>
752 <input type="text" id="torrent_inactive_timer" style="width: 4em;">&nbsp;&nbsp;QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog]
753 </td>
754 </tr>
755 </tbody>
756 </table>
757 </fieldset>
758 </fieldset>
760 <fieldset class="settings">
761 <legend>QBT_TR(Seeding Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
762 <table>
763 <tbody>
764 <tr>
765 <td>
766 <input type="checkbox" id="max_ratio_checkbox" onclick="qBittorrent.Preferences.updateMaxRatioTimeEnabled();">
767 <label id="maxRatioLabel" for="max_ratio_checkbox">QBT_TR(When ratio reaches)QBT_TR[CONTEXT=OptionsDialog]</label>
768 </td>
769 <td>
770 <input type="text" id="max_ratio_value" style="width: 4em;" aria-labelledby="maxRatioLabel">
771 </td>
772 </tr>
773 <tr>
774 <td>
775 <input type="checkbox" id="max_seeding_time_checkbox" onclick="qBittorrent.Preferences.updateMaxRatioTimeEnabled();">
776 <label id="maxSeedingTimeLabel" for="max_seeding_time_checkbox">QBT_TR(When total seeding time reaches)QBT_TR[CONTEXT=OptionsDialog]</label>
777 </td>
778 <td>
779 <input type="text" id="max_seeding_time_value" style="width: 4em;" aria-labelledby="maxSeedingTimeLabel">QBT_TR(minutes)QBT_TR[CONTEXT=OptionsDialog]
780 </td>
781 </tr>
782 <tr>
783 <td>
784 <input type="checkbox" id="max_inactive_seeding_time_checkbox" onclick="qBittorrent.Preferences.updateMaxRatioTimeEnabled();">
785 <label id="maxInactiveSeedingTimeLabel" for="max_inactive_seeding_time_checkbox">QBT_TR(When inactive seeding time reaches)QBT_TR[CONTEXT=OptionsDialog]</label>
786 </td>
787 <td>
788 <input type="text" id="max_inactive_seeding_time_value" style="width: 4em;" aria-labelledby="maxInactiveSeedingTimeLabel">QBT_TR(minutes)QBT_TR[CONTEXT=OptionsDialog]
789 </td>
790 </tr>
791 <tr>
792 <td style="text-align: right;"><label for="max_ratio_act">QBT_TR(then)QBT_TR[CONTEXT=OptionsDialog]</label></td>
793 <td>
794 <select id="max_ratio_act">
795 <option value="0">QBT_TR(Stop torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
796 <option value="1">QBT_TR(Remove torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
797 <option value="3">QBT_TR(Remove torrent and its files)QBT_TR[CONTEXT=OptionsDialog]</option>
798 <option value="2">QBT_TR(Enable super seeding for torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
799 </select>
800 </td>
801 </tr>
802 </tbody>
803 </table>
804 </fieldset>
806 <fieldset class="settings">
807 <legend>
808 <input type="checkbox" id="add_trackers_checkbox" onclick="qBittorrent.Preferences.updateAddTrackersEnabled();">
809 <label id="addTrackersLabel" for="add_trackers_checkbox">QBT_TR(Automatically append these trackers to new downloads:)QBT_TR[CONTEXT=OptionsDialog]</label>
810 </legend>
811 <textarea id="add_trackers_textarea" rows="5" cols="70" aria-labelledby="addTrackersLabel"></textarea>
812 </fieldset>
813 </div>
815 <div id="RSSTab" class="PrefTab invisible">
816 <fieldset class="settings">
817 <legend>QBT_TR(RSS Reader)QBT_TR[CONTEXT=OptionsDialog]</legend>
818 <div class="formRow">
819 <input type="checkbox" id="enable_fetching_rss_feeds_checkbox">
820 <label for="enable_fetching_rss_feeds_checkbox">QBT_TR(Enable fetching RSS feeds)QBT_TR[CONTEXT=OptionsDialog]</label>
821 </div>
822 <table>
823 <tbody>
824 <tr>
825 <td>
826 <label for="feed_refresh_interval">QBT_TR(Feeds refresh interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
827 </td>
828 <td>
829 <input type="text" id="feed_refresh_interval" style="width: 4em;">&nbsp;&nbsp;QBT_TR( min)QBT_TR[CONTEXT=OptionsDialog]
830 </td>
831 </tr>
832 <tr>
833 <td>
834 <label for="feedFetchDelay">QBT_TR(Same host request delay:)QBT_TR[CONTEXT=OptionsDialog]</label>
835 </td>
836 <td>
837 <input type="text" id="feedFetchDelay" style="width: 4em;">&nbsp;&nbsp;QBT_TR( sec)QBT_TR[CONTEXT=OptionsDialog]
838 </td>
839 </tr>
840 <tr>
841 <td>
842 <label for="maximum_article_number">QBT_TR(Maximum number of articles per feed:)QBT_TR[CONTEXT=OptionsDialog]</label>
843 </td>
844 <td>
845 <input type="text" id="maximum_article_number" style="width: 4em;">
846 </td>
847 </tr>
848 </tbody>
849 </table>
850 </fieldset>
852 <fieldset class="settings">
853 <legend>QBT_TR(RSS Torrent Auto Downloader)QBT_TR[CONTEXT=OptionsDialog]</legend>
854 <div class="formRow">
855 <input type="checkbox" id="enable_auto_downloading_rss_torrents_checkbox">
856 <label for="enable_auto_downloading_rss_torrents_checkbox">QBT_TR(Enable auto downloading of RSS torrents)QBT_TR[CONTEXT=OptionsDialog]</label>
857 </div>
858 <button type="button" style="margin: 0 1em; width: calc(100% - 2.2em)" onclick="window.qBittorrent.Rss.openRssDownloader();">QBT_TR(Edit auto downloading rules...)QBT_TR[CONTEXT=OptionsDialog]</button>
859 </fieldset>
861 <fieldset class="settings">
862 <legend>QBT_TR(RSS Smart Episode Filter)QBT_TR[CONTEXT=OptionsDialog]</legend>
863 <div class="formRow">
864 <input type="checkbox" id="downlock_repack_proper_episodes">
866 <label for="downlock_repack_proper_episodes">QBT_TR(Download REPACK/PROPER episodes)QBT_TR[CONTEXT=OptionsDialog]</label>
867 </div>
868 <label for="rss_filter_textarea">QBT_TR(Filters:)QBT_TR[CONTEXT=OptionsDialog]</label><br>
869 <textarea id="rss_filter_textarea" rows="6" cols="70"></textarea>
870 </fieldset>
871 </div>
873 <div id="WebUITab" class="PrefTab invisible">
874 <fieldset class="settings">
875 <legend>QBT_TR(Web User Interface (Remote control))QBT_TR[CONTEXT=OptionsDialog]</legend>
876 <table>
877 <tbody>
878 <tr>
879 <td>
880 <label for="webui_address_value">QBT_TR(IP address:)QBT_TR[CONTEXT=OptionsDialog]</label>
881 </td>
882 <td>
883 <input type="text" id="webui_address_value">
884 <label for="webui_port_value" style="margin-left: 10px;">QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog]</label>
885 <input type="text" id="webui_port_value" style="width: 4em;">
886 </td>
887 </tr>
888 </tbody>
889 </table>
890 <div class="formRow">
891 <input type="checkbox" id="webui_upnp_checkbox">
892 <label for="webui_upnp_checkbox">QBT_TR(Use UPnP / NAT-PMP to forward the port from my router)QBT_TR[CONTEXT=OptionsDialog]</label>
893 </div>
894 <fieldset class="settings">
895 <legend>
896 <input type="checkbox" id="use_https_checkbox" onclick="qBittorrent.Preferences.updateHttpsSettings();">
897 <label for="use_https_checkbox">QBT_TR(Use HTTPS instead of HTTP)QBT_TR[CONTEXT=OptionsDialog]</label>
898 </legend>
899 <table>
900 <tbody>
901 <tr>
902 <td>
903 <label for="ssl_cert_text">QBT_TR(Certificate:)QBT_TR[CONTEXT=OptionsDialog]</label>
904 </td>
905 <td>
906 <input type="text" id="ssl_cert_text" class="pathFile" style="width: 30em;">
907 </td>
908 </tr>
909 <tr>
910 <td>
911 <label for="ssl_key_text">QBT_TR(Key:)QBT_TR[CONTEXT=OptionsDialog]</label>
912 </td>
913 <td>
914 <input type="text" id="ssl_key_text" class="pathFile" style="width: 30em;">
915 </td>
916 </tr>
917 </tbody>
918 </table>
919 <div style="padding-left: 10px;"><a target="_blank" href="https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts">QBT_TR(Information about certificates)QBT_TR[CONTEXT=HttpServer]</a></div>
920 </fieldset>
922 <fieldset class="settings">
923 <legend>QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog]</legend>
924 <table>
925 <tbody>
926 <tr>
927 <td>
928 <label for="webui_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
929 </td>
930 <td>
931 <input type="text" id="webui_username_text">
932 </td>
933 </tr>
934 <tr>
935 <td>
936 <label for="webui_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
937 </td>
938 <td>
939 <input type="password" id="webui_password_text" placeholder="QBT_TR(Change current password)QBT_TR[CONTEXT=OptionsDialog]" autocomplete="new-password">
940 </td>
941 </tr>
942 </tbody>
943 </table>
944 <div class="formRow">
945 <input type="checkbox" id="bypass_local_auth_checkbox">
946 <label for="bypass_local_auth_checkbox">QBT_TR(Bypass authentication for clients on localhost)QBT_TR[CONTEXT=OptionsDialog]</label>
947 </div>
948 <div class="formRow">
949 <input type="checkbox" id="bypass_auth_subnet_whitelist_checkbox" onclick="qBittorrent.Preferences.updateBypasssAuthSettings();">
950 <label id="bypassAuthSubnetWhitelistLabel" for="bypass_auth_subnet_whitelist_checkbox">QBT_TR(Bypass authentication for clients in whitelisted IP subnets)QBT_TR[CONTEXT=OptionsDialog]</label>
951 </div>
952 <div class="formRow" style="padding-left: 30px; padding-top: 5px;">
953 <textarea id="bypass_auth_subnet_whitelist_textarea" rows="5" cols="48" placeholder="QBT_TR(Example: 172.17.32.0/24, fdff:ffff:c8::/40)QBT_TR[CONTEXT=OptionsDialog]" aria-labelledby="bypassAuthSubnetWhitelistLabel"></textarea>
954 </div>
955 <table>
956 <tbody>
957 <tr>
958 <td><label for="webUIMaxAuthFailCountInput">QBT_TR(Ban client after consecutive failures:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
959 <td><input type="number" id="webUIMaxAuthFailCountInput" style="width: 4em;" min="0"></td>
960 </tr>
961 <tr>
962 <td style="text-align: right;"><label for="webUIBanDurationInput">QBT_TR(ban for:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
963 <td><input type="number" id="webUIBanDurationInput" style="width: 4em;" min="1">QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog]</td>
964 </tr>
965 </tbody>
966 </table>
967 <table>
968 <tbody>
969 <tr>
970 <td><label for="webUISessionTimeoutInput">QBT_TR(Session timeout:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
971 <td><input type="number" id="webUISessionTimeoutInput" style="width: 4em;" min="0">&nbsp;&nbsp;QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog]</td>
972 </tr>
973 </tbody>
974 </table>
975 </fieldset>
977 <fieldset class="settings">
978 <legend><input type="checkbox" id="use_alt_webui_checkbox" onclick="qBittorrent.Preferences.updateAlternativeWebUISettings();">
979 <label for="use_alt_webui_checkbox">QBT_TR(Use alternative WebUI)QBT_TR[CONTEXT=OptionsDialog]</label>
980 </legend>
981 <div class="formRow">
982 <label for="webui_files_location_textarea">QBT_TR(Files location:)QBT_TR[CONTEXT=OptionsDialog]</label>
983 <input type="text" id="webui_files_location_textarea" class="pathDirectory">
984 </div>
985 <div class="formRow">
986 <a href="https://github.com/qbittorrent/qBittorrent/wiki/List-of-known-alternate-WebUIs" target="_blank">QBT_TR(List of alternative WebUI)QBT_TR[CONTEXT=OptionsDialog]</a>
987 </div>
988 </fieldset>
990 <fieldset class="settings">
991 <legend>QBT_TR(Security)QBT_TR[CONTEXT=OptionsDialog]</legend>
992 <div class="formRow">
993 <input type="checkbox" id="clickjacking_protection_checkbox">
994 <label for="clickjacking_protection_checkbox">QBT_TR(Enable clickjacking protection)QBT_TR[CONTEXT=OptionsDialog]</label>
995 </div>
996 <div class="formRow">
997 <input type="checkbox" id="csrf_protection_checkbox">
998 <label for="csrf_protection_checkbox">QBT_TR(Enable Cross-Site Request Forgery (CSRF) protection)QBT_TR[CONTEXT=OptionsDialog]</label>
999 </div>
1000 <div class="formRow">
1001 <input type="checkbox" id="secureCookieCheckbox">
1002 <label for="secureCookieCheckbox">QBT_TR(Enable cookie Secure flag (requires HTTPS or localhost connection))QBT_TR[CONTEXT=OptionsDialog]</label>
1003 </div>
1005 <fieldset class="settings">
1006 <legend>
1007 <input type="checkbox" id="host_header_validation_checkbox" onclick="qBittorrent.Preferences.updateHostHeaderValidationSettings();">
1008 <label for="host_header_validation_checkbox">QBT_TR(Enable Host header validation)QBT_TR[CONTEXT=OptionsDialog]</label>
1009 </legend>
1010 <table>
1011 <tbody>
1012 <tr>
1013 <td>
1014 <label for="webui_domain_textarea">QBT_TR(Server domains:)QBT_TR[CONTEXT=OptionsDialog]</label>
1015 </td>
1016 <td>
1017 <textarea id="webui_domain_textarea" rows="1" cols="60" title="QBT_TR(Whitelist for filtering HTTP Host header values.
1018 In order to defend against DNS rebinding attack,
1019 you should put in domain names used by WebUI server.
1021 Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsDialog]"></textarea>
1022 </td>
1023 </tr>
1024 </tbody>
1025 </table>
1026 </fieldset>
1027 </fieldset>
1029 <fieldset class="settings">
1030 <legend>
1031 <input type="checkbox" id="webUIUseCustomHTTPHeadersCheckbox" onclick="qBittorrent.Preferences.updateWebUICustomHTTPHeadersSettings();">
1032 <label id="webUIUseCustomHTTPHeadersLabel" for="webUIUseCustomHTTPHeadersCheckbox">QBT_TR(Add custom HTTP headers)QBT_TR[CONTEXT=OptionsDialog]</label>
1033 </legend>
1034 <textarea id="webUICustomHTTPHeadersTextarea" placeholder="QBT_TR(Header: value pairs, one per line)QBT_TR[CONTEXT=OptionsDialog]" aria-labelledby="webUIUseCustomHTTPHeadersLabel" style="width: 90%;"></textarea>
1035 </fieldset>
1037 <fieldset class="settings">
1038 <legend>
1039 <input type="checkbox" id="webUIReverseProxySupportCheckbox" onclick="qBittorrent.Preferences.updateWebUIReverseProxySettings();">
1040 <label for="webUIReverseProxySupportCheckbox">QBT_TR(Enable reverse proxy support)QBT_TR[CONTEXT=OptionsDialog]</label>
1041 </legend>
1042 <div class="formRow">
1043 <label for="webUIReverseProxiesListTextarea">QBT_TR(Trusted proxies list:)QBT_TR[CONTEXT=OptionsDialog]</label>
1044 <input type="text" id="webUIReverseProxiesListTextarea" title="QBT_TR(Specify reverse proxy IPs (or subnets, e.g. 0.0.0.0/24) in order to use forwarded client address (X-Forwarded-For header). Use ';' to split multiple entries.)QBT_TR[CONTEXT=OptionsDialog]">
1045 </div>
1046 <div class="formRow">
1047 <a href="https://github.com/qbittorrent/qBittorrent/wiki#reverse-proxy-setup-for-webui-access" target="_blank">QBT_TR(Reverse proxy setup examples)QBT_TR[CONTEXT=HttpServer]</a>
1048 </div>
1049 </fieldset>
1051 </fieldset>
1053 <fieldset class="settings">
1054 <legend>
1055 <input type="checkbox" id="use_dyndns_checkbox" onclick="qBittorrent.Preferences.updateDynDnsSettings();">
1056 <label id="UseDyndnsLabel" for="use_dyndns_checkbox">QBT_TR(Update my dynamic domain name)QBT_TR[CONTEXT=OptionsDialog]</label>
1057 </legend>
1058 <select id="dyndns_select" aria-labelledby="UseDyndnsLabel">
1059 <option value="0">DynDNS</option>
1060 <option value="1">NO-IP</option>
1061 </select>
1062 <input type="button" value="QBT_TR(Register)QBT_TR[CONTEXT=OptionsDialog]" onclick="qBittorrent.Preferences.registerDynDns();">
1063 <table style="margin-top: 10px;">
1064 <tbody>
1065 <tr>
1066 <td>
1067 <label for="dyndns_domain_text">QBT_TR(Domain name:)QBT_TR[CONTEXT=OptionsDialog]</label>
1068 </td>
1069 <td>
1070 <input type="text" id="dyndns_domain_text">
1071 </td>
1072 </tr>
1073 <tr>
1074 <td>
1075 <label for="dyndns_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
1076 </td>
1077 <td>
1078 <input type="text" id="dyndns_username_text">
1079 </td>
1080 </tr>
1081 <tr>
1082 <td>
1083 <label for="dyndns_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
1084 </td>
1085 <td>
1086 <input type="password" id="dyndns_password_text">
1087 </td>
1088 </tr>
1089 </tbody>
1090 </table>
1091 </fieldset>
1092 </div>
1094 <div id="AdvancedTab" class="PrefTab invisible">
1095 <fieldset class="settings">
1096 <legend>QBT_TR(qBittorrent Section)QBT_TR[CONTEXT=OptionsDialog]&nbsp;(<a href="https://github.com/qbittorrent/qBittorrent/wiki/Explanation-of-Options-in-qBittorrent#Advanced" target="_blank">QBT_TR(Open documentation)QBT_TR[CONTEXT=HttpServer]</a>)</legend>
1097 <table>
1098 <tbody>
1099 <tr>
1100 <td>
1101 <label for="resumeDataStorageType">QBT_TR(Resume data storage type (requires restart):)QBT_TR[CONTEXT=OptionsDialog]</label>
1102 </td>
1103 <td>
1104 <select id="resumeDataStorageType" style="width: 15em;">
1105 <option value="Legacy">QBT_TR(Fastresume files)QBT_TR[CONTEXT=OptionsDialog]</option>
1106 <option value="SQLite">QBT_TR(SQLite database (experimental))QBT_TR[CONTEXT=OptionsDialog]</option>
1107 </select>
1108 </td>
1109 </tr>
1110 <tr id="rowMemoryWorkingSetLimit">
1111 <td>
1112 <label for="torrentContentRemoveOption">QBT_TR(Torrent content removing mode:)QBT_TR[CONTEXT=OptionsDialog]</label>
1113 </td>
1114 <td>
1115 <select id="torrentContentRemoveOption" style="width: 15em;">
1116 <option value="Delete">QBT_TR(Delete files permanently)QBT_TR[CONTEXT=OptionsDialog]</option>
1117 <option value="MoveToTrash">QBT_TR(Move files to trash (if possible))QBT_TR[CONTEXT=OptionsDialog]</option>
1118 </select>
1119 </td>
1120 </tr>
1121 <tr>
1122 <td>
1123 <label for="memoryWorkingSetLimit">QBT_TR(Physical memory (RAM) usage limit:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://wikipedia.org/wiki/Working_set" target="_blank">(?)</a></label>
1124 </td>
1125 <td>
1126 <input type="text" id="memoryWorkingSetLimit" style="width: 15em;" title="QBT_TR(This option is less effective on Linux)QBT_TR[CONTEXT=OptionsDialog]">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1127 </td>
1128 </tr>
1129 <tr>
1130 <td>
1131 <label for="networkInterface">QBT_TR(Network interface:)QBT_TR[CONTEXT=OptionsDialog]</label>
1132 </td>
1133 <td>
1134 <select id="networkInterface" style="width: 15em;">
1135 </select>
1136 </td>
1137 </tr>
1138 <tr>
1139 <td>
1140 <label for="optionalIPAddressToBind">QBT_TR(Optional IP address to bind to:)QBT_TR[CONTEXT=OptionsDialog]</label>
1141 </td>
1142 <td>
1143 <select id="optionalIPAddressToBind" style="width: 15em;">
1144 </select>
1145 </td>
1146 </tr>
1147 <tr>
1148 <td>
1149 <label for="saveResumeDataInterval">QBT_TR(Save resume data interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
1150 </td>
1151 <td>
1152 <input type="text" id="saveResumeDataInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(min)QBT_TR[CONTEXT=OptionsDialog]
1153 </td>
1154 </tr>
1155 <tr>
1156 <td>
1157 <label for="saveStatisticsInterval">QBT_TR(Save statistics interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
1158 </td>
1159 <td>
1160 <input type="text" id="saveStatisticsInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(min)QBT_TR[CONTEXT=OptionsDialog]
1161 </td>
1162 </tr>
1163 <tr>
1164 <td>
1165 <label for="torrentFileSizeLimit">QBT_TR(.torrent file size limit:)QBT_TR[CONTEXT=OptionsDialog]</label>
1166 </td>
1167 <td>
1168 <input type="text" id="torrentFileSizeLimit" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1169 </td>
1170 </tr>
1171 <tr>
1172 <td>
1173 <label for="recheckTorrentsOnCompletion">QBT_TR(Recheck torrents on completion:)QBT_TR[CONTEXT=OptionsDialog]</label>
1174 </td>
1175 <td>
1176 <input type="checkbox" id="recheckTorrentsOnCompletion">
1177 </td>
1178 </tr>
1179 <tr>
1180 <td>
1181 <label for="appInstanceName">QBT_TR(Customize application instance name:)QBT_TR[CONTEXT=OptionsDialog]</label>
1182 </td>
1183 <td>
1184 <input type="text" id="appInstanceName" style="width: 15em;" title="QBT_TR(It appends the text to the window title to help distinguish qBittorent instances)QBT_TR[CONTEXT=OptionsDialog]">
1185 </td>
1186 </tr>
1187 <tr>
1188 <td>
1189 <label for="refreshInterval">QBT_TR(Refresh interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
1190 </td>
1191 <td>
1192 <input type="text" id="refreshInterval" style="width: 15em;" title="QBT_TR(It controls the internal state update interval which in turn will affect UI updates)QBT_TR[CONTEXT=OptionsDialog]">&nbsp;&nbsp;QBT_TR(ms)QBT_TR[CONTEXT=OptionsDialog]
1193 </td>
1194 </tr>
1195 <tr>
1196 <td>
1197 <label for="resolvePeerCountries">QBT_TR(Resolve peer countries:)QBT_TR[CONTEXT=OptionsDialog]</label>
1198 </td>
1199 <td>
1200 <input type="checkbox" id="resolvePeerCountries">
1201 </td>
1202 </tr>
1203 <tr>
1204 <td>
1205 <label for="reannounceWhenAddressChanged">QBT_TR(Reannounce to all trackers when IP or port changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
1206 </td>
1207 <td>
1208 <input type="checkbox" id="reannounceWhenAddressChanged">
1209 </td>
1210 </tr>
1211 <tr>
1212 <td>
1213 <label for="enableEmbeddedTracker">QBT_TR(Enable embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
1214 </td>
1215 <td>
1216 <input type="checkbox" id="enableEmbeddedTracker">
1217 </td>
1218 </tr>
1219 <tr>
1220 <td>
1221 <label for="embeddedTrackerPort">QBT_TR(Embedded tracker port:)QBT_TR[CONTEXT=OptionsDialog]</label>
1222 </td>
1223 <td>
1224 <input type="text" id="embeddedTrackerPort" style="width: 15em;">
1225 </td>
1226 </tr>
1227 <tr>
1228 <td>
1229 <label for="embeddedTrackerPortForwarding">QBT_TR(Enable port forwarding for embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
1230 </td>
1231 <td>
1232 <input type="checkbox" id="embeddedTrackerPortForwarding">
1233 </td>
1234 </tr>
1235 <tr id="rowMarkOfTheWeb">
1236 <td>
1237 <label for="markOfTheWeb">QBT_TR(Enable Mark-of-the-Web (MOTW) for downloaded files (require macOS or Windows):)QBT_TR[CONTEXT=OptionsDialog]</label>
1238 </td>
1239 <td>
1240 <input type="checkbox" id="markOfTheWeb">
1241 </td>
1242 </tr>
1243 <tr>
1244 <td>
1245 <label for="pythonExecutablePath">QBT_TR(Python executable path (may require restart):)QBT_TR[CONTEXT=OptionsDialog]</label>
1246 </td>
1247 <td>
1248 <input type="text" id="pythonExecutablePath" class="pathFile" placeholder="QBT_TR((Auto detect if empty))QBT_TR[CONTEXT=OptionsDialog]" style="width: 15em;">
1249 </td>
1250 </tr>
1251 </tbody>
1252 </table>
1253 </fieldset>
1254 <fieldset class="settings">
1255 <legend>QBT_TR(libtorrent Section)QBT_TR[CONTEXT=OptionsDialog]&nbsp;(<a href="https://www.libtorrent.org/reference-Settings.html" target="_blank">QBT_TR(Open documentation)QBT_TR[CONTEXT=HttpServer]</a>)</legend>
1256 <table>
1257 <tbody>
1258 <tr>
1259 <td>
1260 <label for="bdecodeDepthLimit">QBT_TR(Bdecode depth limit:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Bdecoding.html#bdecode()" target="_blank">(?)</a></label>
1261 </td>
1262 <td>
1263 <input type="text" id="bdecodeDepthLimit" style="width: 15em;">
1264 </td>
1265 </tr>
1266 <tr>
1267 <td>
1268 <label for="bdecodeTokenLimit">QBT_TR(Bdecode token limit:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Bdecoding.html#bdecode()" target="_blank">(?)</a></label>
1269 </td>
1270 <td>
1271 <input type="text" id="bdecodeTokenLimit" style="width: 15em;">
1272 </td>
1273 </tr>
1274 <tr>
1275 <td>
1276 <label for="asyncIOThreads">QBT_TR(Asynchronous I/O threads:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#aio_threads" target="_blank">(?)</a></label>
1277 </td>
1278 <td>
1279 <input type="text" id="asyncIOThreads" style="width: 15em;">
1280 </td>
1281 </tr>
1282 <tr id="rowHashingThreads">
1283 <td>
1284 <label for="hashingThreads">QBT_TR(Hashing threads:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#hashing_threads" target="_blank">(?)</a></label>
1285 </td>
1286 <td>
1287 <input type="text" id="hashingThreads" style="width: 15em;">
1288 </td>
1289 </tr>
1290 <tr>
1291 <td>
1292 <label for="filePoolSize">QBT_TR(File pool size:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#file_pool_size" target="_blank">(?)</a></label>
1293 </td>
1294 <td>
1295 <input type="text" id="filePoolSize" style="width: 15em;">
1296 </td>
1297 </tr>
1298 <tr>
1299 <td>
1300 <label for="outstandMemoryWhenCheckingTorrents">QBT_TR(Outstanding memory when checking torrents:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#checking_mem_usage" target="_blank">(?)</a></label>
1301 </td>
1302 <td>
1303 <input type="text" id="outstandMemoryWhenCheckingTorrents" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1304 </td>
1305 </tr>
1306 <tr id="rowDiskCache">
1307 <td>
1308 <label for="diskCache">QBT_TR(Disk cache:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#cache_size" target="_blank">(?)</a></label>
1309 </td>
1310 <td>
1311 <input type="text" id="diskCache" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1312 </td>
1313 </tr>
1314 <tr id="rowDiskCacheExpiryInterval">
1315 <td>
1316 <label for="diskCacheExpiryInterval">QBT_TR(Disk cache expiry interval:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#cache_expiry" target="_blank">(?)</a></label>
1317 </td>
1318 <td>
1319 <input type="text" id="diskCacheExpiryInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(s)QBT_TR[CONTEXT=OptionsDialog]
1320 </td>
1321 </tr>
1322 <tr>
1323 <td>
1324 <label for="diskQueueSize">QBT_TR(Disk queue size:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#max_queued_disk_bytes" target="_blank">(?)</a></label>
1325 </td>
1326 <td>
1327 <input type="text" id="diskQueueSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1328 </td>
1329 </tr>
1330 <tr id="rowDiskIOType">
1331 <td>
1332 <label for="diskIOType">QBT_TR(Disk IO type (requires restart):)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/single-page-ref.html#default-disk-io-constructor" target="_blank">(?)</a></label>
1333 </td>
1334 <td>
1335 <select id="diskIOType" style="width: 15em;">
1336 <option value="0">QBT_TR(Default)QBT_TR[CONTEXT=OptionsDialog]</option>
1337 <option value="1">QBT_TR(Memory mapped files)QBT_TR[CONTEXT=OptionsDialog]</option>
1338 <option value="2">QBT_TR(POSIX-compliant)QBT_TR[CONTEXT=OptionsDialog]</option>
1339 </select>
1340 </td>
1341 </tr>
1342 <tr>
1343 <td>
1344 <label for="diskIOReadMode">QBT_TR(Disk IO read mode:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#disk_io_read_mode" target="_blank">(?)</a></label>
1345 </td>
1346 <td>
1347 <select id="diskIOReadMode" style="width: 15em;">
1348 <option value="0">QBT_TR(Disable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1349 <option value="1">QBT_TR(Enable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1350 </select>
1351 </td>
1352 </tr>
1353 <tr>
1354 <td>
1355 <label for="diskIOWriteMode">QBT_TR(Disk IO write mode:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#disk_io_write_mode" target="_blank">(?)</a></label>
1356 </td>
1357 <td>
1358 <select id="diskIOWriteMode" style="width: 15em;">
1359 <option value="0">QBT_TR(Disable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1360 <option value="1">QBT_TR(Enable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1361 <option value="2" id="diskIOWriteModeWriteThrough">QBT_TR(Write-through)QBT_TR[CONTEXT=OptionsDialog]</option>
1362 </select>
1363 </td>
1364 </tr>
1365 <tr id="rowCoalesceReadsAndWrites">
1366 <td>
1367 <label for="coalesceReadsAndWrites">QBT_TR(Coalesce reads &amp; writes:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#coalesce_reads" target="_blank">(?)</a></label>
1368 </td>
1369 <td>
1370 <input type="checkbox" id="coalesceReadsAndWrites">
1371 </td>
1372 </tr>
1373 <tr>
1374 <td>
1375 <label for="pieceExtentAffinity">QBT_TR(Use piece extent affinity:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://libtorrent.org/single-page-ref.html#piece_extent_affinity" target="_blank">(?)</a></label>
1376 </td>
1377 <td>
1378 <input type="checkbox" id="pieceExtentAffinity">
1379 </td>
1380 </tr>
1381 <tr>
1382 <td>
1383 <label for="sendUploadPieceSuggestions">QBT_TR(Send upload piece suggestions:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#suggest_mode" target="_blank">(?)</a></label>
1384 </td>
1385 <td>
1386 <input type="checkbox" id="sendUploadPieceSuggestions">
1387 </td>
1388 </tr>
1389 <tr>
1390 <td>
1391 <label for="sendBufferWatermark">QBT_TR(Send buffer watermark:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_buffer_watermark" target="_blank">(?)</a></label>
1392 </td>
1393 <td>
1394 <input type="text" id="sendBufferWatermark" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1395 </td>
1396 </tr>
1397 <tr>
1398 <td>
1399 <label for="sendBufferLowWatermark">QBT_TR(Send buffer low watermark:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_buffer_low_watermark" target="_blank">(?)</a></label>
1400 </td>
1401 <td>
1402 <input type="text" id="sendBufferLowWatermark" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1403 </td>
1404 </tr>
1405 <tr>
1406 <td>
1407 <label for="sendBufferWatermarkFactor">QBT_TR(Send buffer watermark factor:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_buffer_watermark_factor" target="_blank">(?)</a></label>
1408 </td>
1409 <td>
1410 <input type="text" id="sendBufferWatermarkFactor" style="width: 15em;">&nbsp;&nbsp;%
1411 </td>
1412 </tr>
1413 <tr>
1414 <td>
1415 <label for="connectionSpeed">QBT_TR(Outgoing connections per second:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#connection_speed" target="_blank">(?)</a></label>
1416 </td>
1417 <td>
1418 <input type="text" id="connectionSpeed" style="width: 15em;">
1419 </td>
1420 </tr>
1421 <tr>
1422 <td>
1423 <label for="socketSendBufferSize">QBT_TR(Socket send buffer size [0: system default]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_socket_buffer_size" target="_blank">(?)</a></label>
1424 </td>
1425 <td>
1426 <input type="text" id="socketSendBufferSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1427 </td>
1428 </tr>
1429 <tr>
1430 <td>
1431 <label for="socketReceiveBufferSize">QBT_TR(Socket receive buffer size [0: system default]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#recv_socket_buffer_size" target="_blank">(?)</a></label>
1432 </td>
1433 <td>
1434 <input type="text" id="socketReceiveBufferSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1435 </td>
1436 </tr>
1437 <tr>
1438 <td>
1439 <label for="socketBacklogSize">QBT_TR(Socket backlog size:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#listen_queue_size" target="_blank">(?)</a></label>
1440 </td>
1441 <td>
1442 <input type="text" id="socketBacklogSize" style="width: 15em;">
1443 </td>
1444 </tr>
1445 <tr>
1446 <td>
1447 <label for="outgoingPortsMin">QBT_TR(Outgoing ports (Min) [0: disabled]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#outgoing_port" target="_blank">(?)</a></label>
1448 </td>
1449 <td>
1450 <input type="text" id="outgoingPortsMin" style="width: 15em;">
1451 </td>
1452 </tr>
1453 <tr>
1454 <td>
1455 <label for="outgoingPortsMax">QBT_TR(Outgoing ports (Max) [0: disabled]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#outgoing_port" target="_blank">(?)</a></label>
1456 </td>
1457 <td>
1458 <input type="text" id="outgoingPortsMax" style="width: 15em;">
1459 </td>
1460 </tr>
1461 <tr>
1462 <td>
1463 <label for="UPnPLeaseDuration">QBT_TR(UPnP lease duration [0: permanent lease]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#upnp_lease_duration" target="_blank">(?)</a></label>
1464 </td>
1465 <td>
1466 <input type="text" id="UPnPLeaseDuration" style="width: 15em;">
1467 </td>
1468 </tr>
1469 <tr>
1470 <td>
1471 <label for="peerToS">QBT_TR(Type of service (ToS) for connections to peers)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_tos" target="_blank">(?)</a></label>
1472 </td>
1473 <td>
1474 <input type="text" id="peerToS" style="width: 15em;">
1475 </td>
1476 </tr>
1477 <tr>
1478 <td>
1479 <label for="utpTCPMixedModeAlgorithm">QBT_TR(μTP-TCP mixed mode algorithm:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#mixed_mode_algorithm" target="_blank">(?)</a></label>
1480 </td>
1481 <td>
1482 <select id="utpTCPMixedModeAlgorithm" style="width: 15em;">
1483 <option value="0">QBT_TR(Prefer TCP)QBT_TR[CONTEXT=OptionsDialog]</option>
1484 <option value="1">QBT_TR(Peer proportional (throttles TCP))QBT_TR[CONTEXT=OptionsDialog]</option>
1485 </select>
1486 </td>
1487 </tr>
1488 <tr>
1489 <td>
1490 <label for="IDNSupportCheckbox">QBT_TR(Support internationalized domain name (IDN):)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#allow_idna" target="_blank">(?)</a></label>
1491 </td>
1492 <td>
1493 <input type="checkbox" id="IDNSupportCheckbox">
1494 </td>
1495 </tr>
1496 <tr>
1497 <td>
1498 <label for="allowMultipleConnectionsFromTheSameIPAddress">QBT_TR(Allow multiple connections from the same IP address:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#allow_multiple_connections_per_ip" target="_blank">(?)</a></label>
1499 </td>
1500 <td>
1501 <input type="checkbox" id="allowMultipleConnectionsFromTheSameIPAddress">
1502 </td>
1503 </tr>
1504 <tr>
1505 <td>
1506 <label for="validateHTTPSTrackerCertificate">QBT_TR(Validate HTTPS tracker certificate:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#validate_https_trackers" target="_blank">(?)</a></label>
1507 </td>
1508 <td>
1509 <input type="checkbox" id="validateHTTPSTrackerCertificate">
1510 </td>
1511 </tr>
1512 <tr>
1513 <td>
1514 <label for="mitigateSSRF">QBT_TR(Server-side request forgery (SSRF) mitigation:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#ssrf_mitigation" target="_blank">(?)</a></label>
1515 </td>
1516 <td>
1517 <input type="checkbox" id="mitigateSSRF">
1518 </td>
1519 </tr>
1520 <tr>
1521 <td>
1522 <label for="blockPeersOnPrivilegedPorts">QBT_TR(Disallow connection to peers on privileged ports:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://libtorrent.org/single-page-ref.html#no_connect_privileged_ports" target="_blank">(?)</a></label>
1523 </td>
1524 <td>
1525 <input type="checkbox" id="blockPeersOnPrivilegedPorts">
1526 </td>
1527 </tr>
1528 <tr>
1529 <td>
1530 <label for="uploadSlotsBehavior">QBT_TR(Upload slots behavior:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#choking_algorithm" target="_blank">(?)</a></label>
1531 </td>
1532 <td>
1533 <select id="uploadSlotsBehavior" style="width: 15em;">
1534 <option value="0">QBT_TR(Fixed slots)QBT_TR[CONTEXT=OptionsDialog]</option>
1535 <option value="1">QBT_TR(Upload rate based)QBT_TR[CONTEXT=OptionsDialog]</option>
1536 </select>
1537 </td>
1538 </tr>
1539 <tr>
1540 <td>
1541 <label for="uploadChokingAlgorithm">QBT_TR(Upload choking algorithm:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#seed_choking_algorithm" target="_blank">(?)</a></label>
1542 </td>
1543 <td>
1544 <select id="uploadChokingAlgorithm" style="width: 15em;">
1545 <option value="0">QBT_TR(Round-robin)QBT_TR[CONTEXT=OptionsDialog]</option>
1546 <option value="1">QBT_TR(Fastest upload)QBT_TR[CONTEXT=OptionsDialog]</option>
1547 <option value="2">QBT_TR(Anti-leech)QBT_TR[CONTEXT=OptionsDialog]</option>
1548 </select>
1549 </td>
1550 </tr>
1551 <tr>
1552 <td>
1553 <label for="announceAllTrackers">QBT_TR(Always announce to all trackers in a tier:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#announce_to_all_trackers" target="_blank">(?)</a></label>
1554 </td>
1555 <td>
1556 <input type="checkbox" id="announceAllTrackers">
1557 </td>
1558 </tr>
1559 <tr>
1560 <td>
1561 <label for="announceAllTiers">QBT_TR(Always announce to all tiers:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#announce_to_all_tiers" target="_blank">(?)</a></label>
1562 </td>
1563 <td>
1564 <input type="checkbox" id="announceAllTiers">
1565 </td>
1566 </tr>
1567 <tr>
1568 <td>
1569 <label for="announceIP">QBT_TR(IP address reported to trackers (requires restart):)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#announce_ip" target="_blank">(?)</a></label>
1570 </td>
1571 <td>
1572 <input type="text" id="announceIP" style="width: 15em;">
1573 </td>
1574 </tr>
1575 <tr>
1576 <td>
1577 <label for="maxConcurrentHTTPAnnounces">QBT_TR(Max concurrent HTTP announces:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#max_concurrent_http_announces" target="_blank">(?)</a></label>
1578 </td>
1579 <td>
1580 <input type="text" id="maxConcurrentHTTPAnnounces" style="width: 15em;">
1581 </td>
1582 </tr>
1583 <tr>
1584 <td>
1585 <label for="stopTrackerTimeout">QBT_TR(Stop tracker timeout [0: disabled]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#stop_tracker_timeout" target="_blank">(?)</a></label>
1586 </td>
1587 <td>
1588 <input type="text" id="stopTrackerTimeout" style="width: 15em;">
1589 </td>
1590 </tr>
1591 <tr>
1592 <td>
1593 <label for="peerTurnover">QBT_TR(Peer turnover disconnect percentage:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_turnover" target="_blank">(?)</a></label>
1594 </td>
1595 <td>
1596 <input type="text" id="peerTurnover" style="width: 15em;">&nbsp;&nbsp;%
1597 </td>
1598 </tr>
1599 <tr>
1600 <td>
1601 <label for="peerTurnoverCutoff">QBT_TR(Peer turnover threshold percentage:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_turnover" target="_blank">(?)</a></label>
1602 </td>
1603 <td>
1604 <input type="text" id="peerTurnoverCutoff" style="width: 15em;">&nbsp;&nbsp;%
1605 </td>
1606 </tr>
1607 <tr>
1608 <td>
1609 <label for="peerTurnoverInterval">QBT_TR(Peer turnover disconnect interval:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_turnover" target="_blank">(?)</a></label>
1610 </td>
1611 <td>
1612 <input type="text" id="peerTurnoverInterval" style="width: 15em;">&nbsp;&nbsp;s
1613 </td>
1614 </tr>
1615 <tr>
1616 <td>
1617 <label for="requestQueueSize">QBT_TR(Maximum outstanding requests to a single peer:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#max_out_request_queue" target="_blank">(?)</a></label>
1618 </td>
1619 <td>
1620 <input type="text" id="requestQueueSize" style="width: 15em;">
1621 </td>
1622 </tr>
1623 <tr>
1624 <td>
1625 <label for="dhtBootstrapNodes">QBT_TR(DHT bootstrap nodes:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#dht_bootstrap_nodes" target="_blank">(?)</a></label>
1626 </td>
1627 <td>
1628 <input type="text" id="dhtBootstrapNodes" placeholder="QBT_TR(Resets to default if empty)QBT_TR[CONTEXT=OptionsDialog]" style="width: 15em;">
1629 </td>
1630 </tr>
1631 <tr id="rowI2pInboundQuantity">
1632 <td>
1633 <label for="i2pInboundQuantity">QBT_TR(I2P inbound quantity:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_inbound_quantity" target="_blank">(?)</a></label>
1634 </td>
1635 <td>
1636 <input id="i2pInboundQuantity" type="number" min="1" max="16" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1637 </td>
1638 </tr>
1639 <tr id="rowI2pOutboundQuantity">
1640 <td>
1641 <label for="i2pOutboundQuantity">QBT_TR(I2P outbound quantity:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_outbound_quantity" target="_blank">(?)</a></label>
1642 </td>
1643 <td>
1644 <input id="i2pOutboundQuantity" type="number" min="1" max="16" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1645 </td>
1646 </tr>
1647 <tr id="rowI2pInboundLength">
1648 <td>
1649 <label for="i2pInboundLength">QBT_TR(I2P inbound length:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_inbound_length" target="_blank">(?)</a></label>
1650 </td>
1651 <td>
1652 <input id="i2pInboundLength" type="number" min="0" max="7" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1653 </td>
1654 </tr>
1655 <tr id="rowI2pOutboundLength">
1656 <td>
1657 <label for="i2pOutboundLength">QBT_TR(I2P outbound length:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_outbound_length" target="_blank">(?)</a></label>
1658 </td>
1659 <td>
1660 <input id="i2pOutboundLength" type="number" min="0" max="7" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1661 </td>
1662 </tr>
1663 </tbody>
1664 </table>
1665 </fieldset>
1666 </div>
1668 <div style="text-align: center; margin-top: 1em;"><input type="button" value="QBT_TR(Save)QBT_TR[CONTEXT=HttpServer]" onclick="qBittorrent.Preferences.applyPreferences();"></div>
1670 <script>
1671 "use strict";
1673 window.qBittorrent ??= {};
1674 window.qBittorrent.Preferences ??= (() => {
1675 const exports = () => {
1676 return {
1677 setup: setup,
1678 numberInputLimiter: numberInputLimiter,
1679 updateFileLogEnabled: updateFileLogEnabled,
1680 updateFileLogBackupEnabled: updateFileLogBackupEnabled,
1681 updateFileLogDeleteEnabled: updateFileLogDeleteEnabled,
1682 updateTempDirEnabled: updateTempDirEnabled,
1683 updateExportDirEnabled: updateExportDirEnabled,
1684 updateExportDirFinEnabled: updateExportDirFinEnabled,
1685 addWatchFolder: addWatchFolder,
1686 updateExcludedFileNamesEnabled: updateExcludedFileNamesEnabled,
1687 changeWatchFolderSelect: changeWatchFolderSelect,
1688 updateMailNotification: updateMailNotification,
1689 updateMailAuthSettings: updateMailAuthSettings,
1690 sendTestEmail: sendTestEmail,
1691 updateAutoRun: updateAutoRun,
1692 updateAutoRunOnTorrentAdded: updateAutoRunOnTorrentAdded,
1693 generateRandomPort: generateRandomPort,
1694 updateMaxConnecEnabled: updateMaxConnecEnabled,
1695 updateMaxConnecPerTorrentEnabled: updateMaxConnecPerTorrentEnabled,
1696 updateMaxUploadsEnabled: updateMaxUploadsEnabled,
1697 updateMaxUploadsPerTorrentEnabled: updateMaxUploadsPerTorrentEnabled,
1698 updateI2PSettingsEnabled: updateI2PSettingsEnabled,
1699 updatePeerProxySettings: updatePeerProxySettings,
1700 updatePeerProxyAuthSettings: updatePeerProxyAuthSettings,
1701 updateFilterSettings: updateFilterSettings,
1702 updateSchedulingEnabled: updateSchedulingEnabled,
1703 updateQueueingSystem: updateQueueingSystem,
1704 updateSlowTorrentsSettings: updateSlowTorrentsSettings,
1705 updateMaxRatioTimeEnabled: updateMaxRatioTimeEnabled,
1706 updateAddTrackersEnabled: updateAddTrackersEnabled,
1707 updateHttpsSettings: updateHttpsSettings,
1708 updateBypasssAuthSettings: updateBypasssAuthSettings,
1709 updateAlternativeWebUISettings: updateAlternativeWebUISettings,
1710 updateHostHeaderValidationSettings: updateHostHeaderValidationSettings,
1711 updateWebUICustomHTTPHeadersSettings: updateWebUICustomHTTPHeadersSettings,
1712 updateWebUIReverseProxySettings: updateWebUIReverseProxySettings,
1713 updateDynDnsSettings: updateDynDnsSettings,
1714 updateWebuiLocaleSelect: updateWebuiLocaleSelect,
1715 registerDynDns: registerDynDns,
1716 applyPreferences: applyPreferences
1720 // Behavior tab
1721 const numberInputLimiter = (input) => {
1722 const min = input.getAttribute("min");
1723 const max = input.getAttribute("max");
1725 if (min && (input.value.toInt() < min.toInt()))
1726 input.value = min;
1728 if (max && (input.value.toInt() > max.toInt()))
1729 input.value = max;
1732 const updateFileLogEnabled = function() {
1733 const isFileLogEnabled = $("filelog_checkbox").checked;
1734 $("filelog_save_path_input").disabled = !isFileLogEnabled;
1735 $("filelog_backup_checkbox").disabled = !isFileLogEnabled;
1736 $("filelog_delete_old_checkbox").disabled = !isFileLogEnabled;
1738 updateFileLogBackupEnabled();
1739 updateFileLogDeleteEnabled();
1742 const updateFileLogBackupEnabled = function() {
1743 const pros = $("filelog_backup_checkbox").getProperties("disabled", "checked");
1744 $("filelog_max_size_input").disabled = pros.disabled || !pros.checked;
1747 const updateFileLogDeleteEnabled = function() {
1748 const pros = $("filelog_delete_old_checkbox").getProperties("disabled", "checked");
1749 $("filelog_age_input").disabled = pros.disabled || !pros.checked;
1750 $("filelog_age_type_select").disabled = pros.disabled || !pros.checked;
1753 // Downloads tab
1754 let watchedFoldersTable;
1756 const updateTempDirEnabled = function() {
1757 const isTempDirEnabled = $("temppath_checkbox").checked;
1758 $("temppath_text").disabled = !isTempDirEnabled;
1761 const changeWatchFolderSelect = (item) => {
1762 if (item.value === "other") {
1763 item.nextElementSibling.hidden = false;
1764 item.nextElementSibling.value = "QBT_TR(Type folder here)QBT_TR[CONTEXT=ScanFoldersModel]";
1765 item.nextElementSibling.select();
1767 else {
1768 item.nextElementSibling.hidden = true;
1769 const text = item.options[item.selectedIndex].textContent;
1770 item.nextElementSibling.value = text;
1774 const addWatchFolder = (folder = "", sel = "default_folder", other = "") => {
1775 const pos = $("watched_folders_tab").getChildren("tbody")[0].getChildren("tr").length;
1776 const myinput = "<input id='text_watch_" + pos + "' type='text' value='" + folder + "'>";
1777 const disableInput = (sel !== "other");
1778 const mycb = "<div class='select-watched-folder-editable'>"
1779 + "<select id ='cb_watch_" + pos + "' onchange='qBittorrent.Preferences.changeWatchFolderSelect(this)'>"
1780 + "<option value='watch_folder'>QBT_TR(Monitored folder)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
1781 + "<option value='default_folder'>QBT_TR(Default save location)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
1782 + "<option value='other'>QBT_TR(Other...)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
1783 + "</select>"
1784 + "<input id='cb_watch_txt_" + pos + "' type='text' " + (disableInput ? "hidden " : "") + "/>"
1785 + "<img src='images/list-add.svg' id='addFolderImg_" + pos + "' alt='Add' style='padding-left:170px;width:16px;cursor:pointer;' onclick='qBittorrent.Preferences.addWatchFolder();'>"
1786 + "</div>";
1788 watchedFoldersTable.push([myinput, mycb]);
1789 $("cb_watch_" + pos).value = sel;
1790 if (disableInput) {
1791 const elt = $("cb_watch_" + pos);
1792 other = elt.options[elt.selectedIndex].textContent;
1794 $("cb_watch_txt_" + pos).value = other;
1796 // hide previous img
1797 if (pos > 0)
1798 $("addFolderImg_" + (pos - 1)).style.display = "none";
1801 const getWatchedFolders = () => {
1802 const nb_folders = $("watched_folders_tab").getChildren("tbody")[0].getChildren("tr").length;
1803 const folders = new Hash();
1804 for (let i = 0; i < nb_folders; ++i) {
1805 const fpath = $("text_watch_" + i).value.trim();
1806 if (fpath.length > 0) {
1807 const sel = $("cb_watch_" + i).value.trim();
1809 let other;
1810 if (sel === "other")
1811 other = $("cb_watch_txt_" + i).value.trim();
1812 else
1813 other = (sel === "watch_folder") ? 0 : 1;
1815 folders.set(fpath, other);
1818 return folders;
1821 const updateExcludedFileNamesEnabled = function() {
1822 const isAExcludedFileNamesEnabled = $("excludedFileNamesCheckbox").checked;
1823 $("excludedFileNamesTextarea").disabled = !isAExcludedFileNamesEnabled;
1826 const updateExportDirEnabled = function() {
1827 const isExportDirEnabled = $("exportdir_checkbox").checked;
1828 $("exportdir_text").disabled = !isExportDirEnabled;
1831 const updateExportDirFinEnabled = function() {
1832 const isExportDirFinEnabled = $("exportdirfin_checkbox").checked;
1833 $("exportdirfin_text").disabled = !isExportDirFinEnabled;
1836 const updateMailNotification = function() {
1837 const isMailNotificationEnabled = $("mail_notification_checkbox").checked;
1838 $("src_email_txt").disabled = !isMailNotificationEnabled;
1839 $("dest_email_txt").disabled = !isMailNotificationEnabled;
1840 $("smtp_server_txt").disabled = !isMailNotificationEnabled;
1841 $("mail_ssl_checkbox").disabled = !isMailNotificationEnabled;
1842 $("mail_auth_checkbox").disabled = !isMailNotificationEnabled;
1843 $("mail_test_button").disabled = !isMailNotificationEnabled;
1845 if (!isMailNotificationEnabled) {
1846 $("mail_auth_checkbox").checked = !isMailNotificationEnabled;
1847 updateMailAuthSettings();
1851 const updateMailAuthSettings = function() {
1852 const isMailAuthEnabled = $("mail_auth_checkbox").checked;
1853 $("mail_username_text").disabled = !isMailAuthEnabled;
1854 $("mail_password_text").disabled = !isMailAuthEnabled;
1857 const sendTestEmail = function() {
1858 new Request({
1859 url: "api/v2/app/sendTestEmail",
1860 method: "post",
1861 onFailure: function() {
1862 alert("QBT_TR(Could not contact qBittorrent)QBT_TR[CONTEXT=HttpServer]");
1864 onSuccess: function() {
1865 alert("QBT_TR(Attempted to send email. Check your inbox to confirm success)QBT_TR[CONTEXT=OptionsDialog]");
1867 }).send();
1870 const updateAutoRunOnTorrentAdded = function() {
1871 const isAutoRunOnTorrentAddedEnabled = $("autorunOnTorrentAddedCheckbox").checked;
1872 $("autorunOnTorrentAddedProgram").disabled = !isAutoRunOnTorrentAddedEnabled;
1875 const updateAutoRun = function() {
1876 const isAutoRunEnabled = $("autorun_checkbox").checked;
1877 $("autorunProg_txt").disabled = !isAutoRunEnabled;
1880 // Connection tab
1882 const updateMaxConnecEnabled = function() {
1883 const isMaxConnecEnabled = $("max_connec_checkbox").checked;
1884 $("max_connec_value").disabled = !isMaxConnecEnabled;
1887 const updateMaxConnecPerTorrentEnabled = function() {
1888 const isMaxConnecPerTorrentEnabled = $("max_connec_per_torrent_checkbox").checked;
1889 $("max_connec_per_torrent_value").disabled = !isMaxConnecPerTorrentEnabled;
1892 const updateMaxUploadsEnabled = function() {
1893 const isMaxUploadsEnabled = $("max_uploads_checkbox").checked;
1894 $("max_uploads_value").disabled = !isMaxUploadsEnabled;
1897 const updateMaxUploadsPerTorrentEnabled = function() {
1898 const isMaxUploadsPerTorrentEnabled = $("max_uploads_per_torrent_checkbox").checked;
1899 $("max_uploads_per_torrent_value").disabled = !isMaxUploadsPerTorrentEnabled;
1902 const updateI2PSettingsEnabled = function() {
1903 const isI2PEnabled = $("i2pEnabledCheckbox").checked;
1904 $("i2pAddress").disabled = !isI2PEnabled;
1905 $("i2pPort").disabled = !isI2PEnabled;
1906 $("i2pMixedMode").disabled = !isI2PEnabled;
1909 const updatePeerProxySettings = function() {
1910 const proxyType = $("peer_proxy_type_select").value;
1911 const isProxyDisabled = (proxyType === "None");
1912 const isProxySocks4 = (proxyType === "SOCKS4");
1914 $("peer_proxy_host_text").disabled = isProxyDisabled;
1915 $("peer_proxy_port_value").disabled = isProxyDisabled;
1917 $("peer_proxy_auth_checkbox").disabled = (isProxyDisabled || isProxySocks4);
1918 $("proxy_bittorrent_checkbox").disabled = isProxyDisabled;
1919 $("use_peer_proxy_checkbox").disabled = (isProxyDisabled || !$("proxy_bittorrent_checkbox").checked);
1920 $("proxyHostnameLookupCheckbox").disabled = (isProxyDisabled || isProxySocks4);
1921 $("proxy_rss_checkbox").disabled = (isProxyDisabled || isProxySocks4);
1922 $("proxy_misc_checkbox").disabled = (isProxyDisabled || isProxySocks4);
1924 updatePeerProxyAuthSettings();
1927 const updatePeerProxyAuthSettings = function() {
1928 const proxyType = $("peer_proxy_type_select").value;
1929 const isProxyDisabled = (proxyType === "None");
1930 const isPeerProxyAuthEnabled = (!$("peer_proxy_auth_checkbox").disabled && $("peer_proxy_auth_checkbox").checked);
1931 $("peer_proxy_username_text").disabled = (isProxyDisabled || !isPeerProxyAuthEnabled);
1932 $("peer_proxy_password_text").disabled = (isProxyDisabled || !isPeerProxyAuthEnabled);
1935 const updateFilterSettings = function() {
1936 const isIPFilterEnabled = $("ipfilter_text_checkbox").checked;
1937 $("ipfilter_text").disabled = !isIPFilterEnabled;
1940 // Speed tab
1941 const updateSchedulingEnabled = function() {
1942 const isLimitSchedulingEnabled = $("limitSchedulingCheckbox").checked;
1943 $("schedule_from_hour").disabled = !isLimitSchedulingEnabled;
1944 $("schedule_from_min").disabled = !isLimitSchedulingEnabled;
1945 $("schedule_to_hour").disabled = !isLimitSchedulingEnabled;
1946 $("schedule_to_min").disabled = !isLimitSchedulingEnabled;
1947 $("schedule_freq_select").disabled = !isLimitSchedulingEnabled;
1950 // Bittorrent tab
1951 const updateQueueingSystem = function() {
1952 const isQueueingEnabled = $("queueing_checkbox").checked;
1953 $("max_active_dl_value").disabled = !isQueueingEnabled;
1954 $("max_active_up_value").disabled = !isQueueingEnabled;
1955 $("max_active_to_value").disabled = !isQueueingEnabled;
1956 $("dont_count_slow_torrents_checkbox").disabled = !isQueueingEnabled;
1957 updateSlowTorrentsSettings();
1960 const updateSlowTorrentsSettings = function() {
1961 const isDontCountSlowTorrentsEnabled = (!$("dont_count_slow_torrents_checkbox").disabled) && $("dont_count_slow_torrents_checkbox").checked;
1962 $("dl_rate_threshold").disabled = !isDontCountSlowTorrentsEnabled;
1963 $("ul_rate_threshold").disabled = !isDontCountSlowTorrentsEnabled;
1964 $("torrent_inactive_timer").disabled = !isDontCountSlowTorrentsEnabled;
1967 const updateMaxRatioTimeEnabled = function() {
1968 const isMaxRatioEnabled = $("max_ratio_checkbox").checked;
1969 $("max_ratio_value").disabled = !isMaxRatioEnabled;
1971 const isMaxSeedingTimeEnabled = $("max_seeding_time_checkbox").checked;
1972 $("max_seeding_time_value").disabled = !isMaxSeedingTimeEnabled;
1974 const isMaxInactiveSeedingTimeEnabled = $("max_inactive_seeding_time_checkbox").checked;
1975 $("max_inactive_seeding_time_value").disabled = !isMaxInactiveSeedingTimeEnabled;
1977 $("max_ratio_act").disabled = !(isMaxRatioEnabled || isMaxSeedingTimeEnabled || isMaxInactiveSeedingTimeEnabled);
1980 const updateAddTrackersEnabled = function() {
1981 const isAddTrackersEnabled = $("add_trackers_checkbox").checked;
1982 $("add_trackers_textarea").disabled = !isAddTrackersEnabled;
1985 // WebUI tab
1986 const updateHttpsSettings = function() {
1987 const isUseHttpsEnabled = $("use_https_checkbox").checked;
1988 $("ssl_cert_text").disabled = !isUseHttpsEnabled;
1989 $("ssl_key_text").disabled = !isUseHttpsEnabled;
1992 const updateBypasssAuthSettings = function() {
1993 const isBypassAuthSubnetWhitelistEnabled = $("bypass_auth_subnet_whitelist_checkbox").checked;
1994 $("bypass_auth_subnet_whitelist_textarea").disabled = !isBypassAuthSubnetWhitelistEnabled;
1997 const updateAlternativeWebUISettings = function() {
1998 const isUseAlternativeWebUIEnabled = $("use_alt_webui_checkbox").checked;
1999 $("webui_files_location_textarea").disabled = !isUseAlternativeWebUIEnabled;
2002 const updateHostHeaderValidationSettings = function() {
2003 const isHostHeaderValidationEnabled = $("host_header_validation_checkbox").checked;
2004 $("webui_domain_textarea").disabled = !isHostHeaderValidationEnabled;
2007 const updateWebUICustomHTTPHeadersSettings = function() {
2008 const isEnabled = $("webUIUseCustomHTTPHeadersCheckbox").checked;
2009 $("webUICustomHTTPHeadersTextarea").disabled = !isEnabled;
2012 const updateWebUIReverseProxySettings = function() {
2013 const isEnabled = $("webUIReverseProxySupportCheckbox").checked;
2014 $("webUIReverseProxiesListTextarea").disabled = !isEnabled;
2017 const updateDynDnsSettings = function() {
2018 const isDynDnsEnabled = $("use_dyndns_checkbox").checked;
2019 $("dyndns_select").disabled = !isDynDnsEnabled;
2020 $("dyndns_domain_text").disabled = !isDynDnsEnabled;
2021 $("dyndns_username_text").disabled = !isDynDnsEnabled;
2022 $("dyndns_password_text").disabled = !isDynDnsEnabled;
2025 const registerDynDns = function() {
2026 if ($("dyndns_select").value.toInt() === 1)
2027 window.open("http://www.no-ip.com/services/managed_dns/free_dynamic_dns.html", "NO-IP Registration");
2028 else
2029 window.open("https://www.dyndns.com/account/services/hosts/add.html", "DynDNS Registration");
2032 const generateRandomPort = function() {
2033 const min = 1024;
2034 const max = 65535;
2035 const port = Math.floor(Math.random() * (max - min + 1) + min);
2036 $("port_value").value = port;
2039 const time_padding = function(val) {
2040 let ret = val.toString();
2041 if (ret.length === 1)
2042 ret = "0" + ret;
2043 return ret;
2046 // Advanced Tab
2047 const updateNetworkInterfaces = function(default_iface, default_iface_name) {
2048 const url = "api/v2/app/networkInterfaceList";
2049 $("networkInterface").getChildren().each(c => c.destroy());
2050 new Request.JSON({
2051 url: url,
2052 method: "get",
2053 noCache: true,
2054 onFailure: function() {
2055 alert("Could not contact qBittorrent");
2057 onSuccess: function(ifaces) {
2058 if (!Array.isArray(ifaces))
2059 return;
2061 // add the current network interface to the options if needed
2062 if (default_iface && !ifaces.some((item) => item.value === default_iface))
2063 ifaces.push({ name: default_iface_name || default_iface, value: default_iface });
2065 $("networkInterface").options.add(new Option("QBT_TR(Any interface)QBT_TR[CONTEXT=OptionsDialog]", ""));
2066 ifaces.forEach((item, index) => {
2067 $("networkInterface").options.add(new Option(item.name, item.value));
2069 $("networkInterface").value = default_iface;
2071 }).send();
2074 const updateInterfaceAddresses = function(iface, default_addr) {
2075 const url = "api/v2/app/networkInterfaceAddressList";
2076 $("optionalIPAddressToBind").getChildren().each(c => c.destroy());
2077 new Request.JSON({
2078 url: url,
2079 method: "get",
2080 noCache: true,
2081 data: {
2082 "iface": iface
2084 onFailure: function() {
2085 alert("Could not contact qBittorrent");
2087 onSuccess: function(addresses) {
2088 if (!addresses)
2089 return;
2091 $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All addresses)QBT_TR[CONTEXT=OptionDialog]", ""));
2092 $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All IPv4 addresses)QBT_TR[CONTEXT=OptionDialog]", "0.0.0.0"));
2093 $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All IPv6 addresses)QBT_TR[CONTEXT=OptionDialog]", "::"));
2094 addresses.forEach((item, index) => {
2095 $("optionalIPAddressToBind").options.add(new Option(item, item));
2097 $("optionalIPAddressToBind").value = default_addr;
2099 }).send();
2102 const updateWebuiLocaleSelect = (selected) => {
2103 const languages = [];
2104 for (let i = 0; i < $("locale_select").options.length; i++)
2105 languages.push($("locale_select").options[i].value);
2107 if (!languages.includes(selected)) {
2108 const lang = selected.slice(0, selected.indexOf("_"));
2109 selected = languages.includes(lang) ? lang : "en";
2111 $("locale_select").value = selected;
2114 const loadPreferences = function() {
2115 window.parent.qBittorrent.Cache.preferences.init({
2116 onSuccess: (pref) => {
2117 // Behavior tab
2118 document.getElementById("displayFullURLTrackerColumn").checked = (LocalPreferences.get("full_url_tracker_column", "false") === "true");
2119 document.getElementById("hideZeroFiltersCheckbox").checked = (LocalPreferences.get("hide_zero_status_filters", "false") === "true");
2120 $("dblclickDownloadSelect").value = LocalPreferences.get("dblclick_download", "1");
2121 $("dblclickCompleteSelect").value = LocalPreferences.get("dblclick_complete", "1");
2122 document.getElementById("confirmTorrentDeletion").checked = pref.confirm_torrent_deletion;
2123 document.getElementById("useAltRowColorsInput").checked = (LocalPreferences.get("use_alt_row_colors", "true") === "true");
2124 $("filelog_checkbox").checked = pref.file_log_enabled;
2125 $("filelog_save_path_input").value = pref.file_log_path;
2126 $("filelog_backup_checkbox").checked = pref.file_log_backup_enabled;
2127 $("filelog_max_size_input").value = pref.file_log_max_size;
2128 $("filelog_delete_old_checkbox").checked = pref.file_log_delete_old;
2129 $("filelog_age_input").value = pref.file_log_age;
2130 $("filelog_age_type_select").value = pref.file_log_age_type;
2131 updateFileLogEnabled();
2133 // Downloads tab
2134 // When adding a torrent
2135 let index = 0;
2136 switch (pref.torrent_content_layout) {
2137 case "Original":
2138 index = 0;
2139 break;
2140 case "Subfolder":
2141 index = 1;
2142 break;
2143 case "NoSubfolder":
2144 index = 2;
2145 break;
2147 $("contentlayout_select").getChildren("option")[index].selected = true;
2148 $("addToTopOfQueueCheckbox").checked = pref.add_to_top_of_queue;
2149 $("dontstartdownloads_checkbox").checked = pref.add_stopped_enabled;
2150 switch (pref.torrent_stop_condition) {
2151 case "None":
2152 index = 0;
2153 break;
2154 case "MetadataReceived":
2155 index = 1;
2156 break;
2157 case "FilesChecked":
2158 index = 2;
2159 break;
2161 $("stopConditionSelect").getChildren("option")[index].selected = true;
2162 document.getElementById("mergeTrackersInput").checked = pref.merge_trackers;
2163 $("deletetorrentfileafter_checkbox").checked = pref.auto_delete_mode;
2165 $("preallocateall_checkbox").checked = pref.preallocate_all;
2166 $("appendext_checkbox").checked = pref.incomplete_files_ext;
2167 $("unwantedfolder_checkbox").checked = pref.use_unwanted_folder;
2169 // Saving Management
2170 $("default_tmm_combobox").value = pref.auto_tmm_enabled;
2171 $("torrent_changed_tmm_combobox").value = pref.torrent_changed_tmm_enabled;
2172 $("save_path_changed_tmm_combobox").value = pref.save_path_changed_tmm_enabled;
2173 $("category_changed_tmm_combobox").value = pref.category_changed_tmm_enabled;
2174 $("use_subcategories_checkbox").checked = pref.use_subcategories;
2175 document.getElementById("categoryPathsManualModeCheckbox").checked = pref.use_category_paths_in_manual_mode;
2176 $("savepath_text").value = pref.save_path;
2177 $("temppath_checkbox").checked = pref.temp_path_enabled;
2178 $("temppath_text").value = pref.temp_path;
2179 updateTempDirEnabled();
2180 if (pref.export_dir !== "") {
2181 $("exportdir_checkbox").checked = true;
2182 $("exportdir_text").value = pref.export_dir;
2184 else {
2185 $("exportdir_checkbox").checked = false;
2186 $("exportdir_text").value = "";
2188 updateExportDirEnabled();
2189 if (pref.export_dir_fin !== "") {
2190 $("exportdirfin_checkbox").checked = true;
2191 $("exportdirfin_text").value = pref.export_dir_fin;
2193 else {
2194 $("exportdirfin_checkbox").checked = false;
2195 $("exportdirfin_text").value = "";
2197 updateExportDirFinEnabled();
2199 // Automatically add torrents from
2200 for (const folder in pref.scan_dirs) {
2201 if (!Object.hasOwn(pref.scan_dirs, folder))
2202 continue;
2204 const folderType = pref.scan_dirs[folder];
2205 let sel = "";
2206 let other = "";
2207 if (typeof folderType === "number") {
2208 sel = (folderType === 0) ? "watch_folder" : "default_folder";
2210 else {
2211 sel = "other";
2212 other = folderType;
2214 addWatchFolder(folder, sel, other);
2216 addWatchFolder();
2218 // Excluded file names
2219 $("excludedFileNamesCheckbox").checked = pref.excluded_file_names_enabled;
2220 $("excludedFileNamesTextarea").value = pref.excluded_file_names;
2222 // Email notification upon download completion
2223 $("mail_notification_checkbox").checked = pref.mail_notification_enabled;
2224 $("src_email_txt").value = pref.mail_notification_sender;
2225 $("dest_email_txt").value = pref.mail_notification_email;
2226 $("smtp_server_txt").value = pref.mail_notification_smtp;
2227 $("mail_ssl_checkbox").checked = pref.mail_notification_ssl_enabled;
2228 $("mail_auth_checkbox").checked = pref.mail_notification_auth_enabled;
2229 $("mail_username_text").value = pref.mail_notification_username;
2230 $("mail_password_text").value = pref.mail_notification_password;
2231 updateMailNotification();
2232 updateMailAuthSettings();
2234 // Run an external program on torrent added
2235 $("autorunOnTorrentAddedCheckbox").checked = pref.autorun_on_torrent_added_enabled;
2236 $("autorunOnTorrentAddedProgram").value = pref.autorun_on_torrent_added_program;
2237 updateAutoRunOnTorrentAdded();
2238 // Run an external program on torrent finished
2239 $("autorun_checkbox").checked = pref.autorun_enabled;
2240 $("autorunProg_txt").value = pref.autorun_program;
2241 updateAutoRun();
2243 // Connection tab
2244 // Listening Port
2245 $("port_value").value = pref.listen_port.toInt();
2246 $("upnp_checkbox").checked = pref.upnp;
2248 // Connections Limits
2249 const max_connec = pref.max_connec.toInt();
2250 if (max_connec <= 0) {
2251 $("max_connec_checkbox").checked = false;
2252 $("max_connec_value").value = 500;
2254 else {
2255 $("max_connec_checkbox").checked = true;
2256 $("max_connec_value").value = max_connec;
2258 updateMaxConnecEnabled();
2259 const max_connec_per_torrent = pref.max_connec_per_torrent.toInt();
2260 if (max_connec_per_torrent <= 0) {
2261 $("max_connec_per_torrent_checkbox").checked = false;
2262 $("max_connec_per_torrent_value").value = 100;
2264 else {
2265 $("max_connec_per_torrent_checkbox").checked = true;
2266 $("max_connec_per_torrent_value").value = max_connec_per_torrent;
2268 updateMaxConnecPerTorrentEnabled();
2269 const max_uploads = pref.max_uploads.toInt();
2270 if (max_uploads <= 0) {
2271 $("max_uploads_checkbox").checked = false;
2272 $("max_uploads_value").value = 8;
2274 else {
2275 $("max_uploads_checkbox").checked = true;
2276 $("max_uploads_value").value = max_uploads;
2278 updateMaxUploadsEnabled();
2279 const max_uploads_per_torrent = pref.max_uploads_per_torrent.toInt();
2280 if (max_uploads_per_torrent <= 0) {
2281 $("max_uploads_per_torrent_checkbox").checked = false;
2282 $("max_uploads_per_torrent_value").value = 4;
2284 else {
2285 $("max_uploads_per_torrent_checkbox").checked = true;
2286 $("max_uploads_per_torrent_value").value = max_uploads_per_torrent;
2288 updateMaxUploadsPerTorrentEnabled();
2290 // I2P
2291 $("i2pEnabledCheckbox").checked = pref.i2p_enabled;
2292 $("i2pAddress").value = pref.i2p_address;
2293 $("i2pPort").value = pref.i2p_port;
2294 $("i2pMixedMode").checked = pref.i2p_mixed_mode;
2295 updateI2PSettingsEnabled();
2297 // Proxy Server
2298 $("peer_proxy_type_select").value = pref.proxy_type;
2299 $("peer_proxy_host_text").value = pref.proxy_ip;
2300 $("peer_proxy_port_value").value = pref.proxy_port;
2301 $("peer_proxy_auth_checkbox").checked = pref.proxy_auth_enabled;
2302 $("peer_proxy_username_text").value = pref.proxy_username;
2303 $("peer_proxy_password_text").value = pref.proxy_password;
2304 $("proxyHostnameLookupCheckbox").checked = pref.proxy_hostname_lookup;
2305 $("proxy_bittorrent_checkbox").checked = pref.proxy_bittorrent;
2306 $("use_peer_proxy_checkbox").checked = pref.proxy_peer_connections;
2307 $("proxy_rss_checkbox").checked = pref.proxy_rss;
2308 $("proxy_misc_checkbox").checked = pref.proxy_misc;
2309 updatePeerProxySettings();
2311 // IP Filtering
2312 $("ipfilter_text_checkbox").checked = pref.ip_filter_enabled;
2313 $("ipfilter_text").value = pref.ip_filter_path;
2314 $("ipfilter_trackers_checkbox").checked = pref.ip_filter_trackers;
2315 $("banned_IPs_textarea").value = pref.banned_IPs;
2316 updateFilterSettings();
2318 // Speed tab
2319 // Global Rate Limits
2320 $("up_limit_value").value = (pref.up_limit.toInt() / 1024);
2321 $("dl_limit_value").value = (pref.dl_limit.toInt() / 1024);
2322 // Alternative Global Rate Limits
2323 $("alt_up_limit_value").value = (pref.alt_up_limit.toInt() / 1024);
2324 $("alt_dl_limit_value").value = (pref.alt_dl_limit.toInt() / 1024);
2326 $("enable_protocol_combobox").value = pref.bittorrent_protocol;
2327 $("limit_utp_rate_checkbox").checked = pref.limit_utp_rate;
2328 $("limit_tcp_overhead_checkbox").checked = pref.limit_tcp_overhead;
2329 $("limit_lan_peers_checkbox").checked = pref.limit_lan_peers;
2331 // Scheduling
2332 $("limitSchedulingCheckbox").checked = pref.scheduler_enabled;
2333 $("schedule_from_hour").value = time_padding(pref.schedule_from_hour);
2334 $("schedule_from_min").value = time_padding(pref.schedule_from_min);
2335 $("schedule_to_hour").value = time_padding(pref.schedule_to_hour);
2336 $("schedule_to_min").value = time_padding(pref.schedule_to_min);
2337 $("schedule_freq_select").value = pref.scheduler_days;
2338 updateSchedulingEnabled();
2340 // Bittorrent tab
2341 // Privacy
2342 $("dht_checkbox").checked = pref.dht;
2343 $("pex_checkbox").checked = pref.pex;
2344 $("lsd_checkbox").checked = pref.lsd;
2345 const encryption = pref.encryption.toInt();
2346 $("encryption_select").getChildren("option")[encryption].selected = true;
2347 $("anonymous_mode_checkbox").checked = pref.anonymous_mode;
2349 $("maxActiveCheckingTorrents").value = pref.max_active_checking_torrents;
2351 // Torrent Queueing
2352 $("queueing_checkbox").checked = pref.queueing_enabled;
2353 $("max_active_dl_value").value = pref.max_active_downloads.toInt();
2354 $("max_active_up_value").value = pref.max_active_uploads.toInt();
2355 $("max_active_to_value").value = pref.max_active_torrents.toInt();
2356 $("dont_count_slow_torrents_checkbox").checked = pref.dont_count_slow_torrents;
2357 $("dl_rate_threshold").value = pref.slow_torrent_dl_rate_threshold.toInt();
2358 $("ul_rate_threshold").value = pref.slow_torrent_ul_rate_threshold.toInt();
2359 $("torrent_inactive_timer").value = pref.slow_torrent_inactive_timer.toInt();
2360 updateQueueingSystem();
2362 // Share Limiting
2363 $("max_ratio_checkbox").checked = pref.max_ratio_enabled;
2364 $("max_ratio_value").value = (pref.max_ratio_enabled ? pref.max_ratio : 1);
2365 $("max_seeding_time_checkbox").checked = pref.max_seeding_time_enabled;
2366 $("max_seeding_time_value").value = (pref.max_seeding_time_enabled ? pref.max_seeding_time.toInt() : 1440);
2367 $("max_inactive_seeding_time_checkbox").checked = pref.max_inactive_seeding_time_enabled;
2368 $("max_inactive_seeding_time_value").value = (pref.max_inactive_seeding_time_enabled ? pref.max_inactive_seeding_time.toInt() : 1440);
2369 let maxRatioAct = 0;
2370 switch (pref.max_ratio_act.toInt()) {
2371 case 0: // Stop
2372 default:
2373 maxRatioAct = 0;
2374 break;
2375 case 1: // Remove
2376 maxRatioAct = 1;
2377 break;
2378 case 2: // Enable super seeding
2379 maxRatioAct = 3;
2380 break;
2381 case 3: // Remove torrent and files
2382 maxRatioAct = 2;
2383 break;
2385 $("max_ratio_act").getChildren("option")[maxRatioAct].selected = true;
2386 updateMaxRatioTimeEnabled();
2388 // Add trackers
2389 $("add_trackers_checkbox").checked = pref.add_trackers_enabled;
2390 $("add_trackers_textarea").value = pref.add_trackers;
2391 updateAddTrackersEnabled();
2393 // RSS Tab
2394 $("enable_fetching_rss_feeds_checkbox").checked = pref.rss_processing_enabled;
2395 $("feed_refresh_interval").value = pref.rss_refresh_interval;
2396 $("feedFetchDelay").value = pref.rss_fetch_delay;
2397 $("maximum_article_number").value = pref.rss_max_articles_per_feed;
2398 $("enable_auto_downloading_rss_torrents_checkbox").checked = pref.rss_auto_downloading_enabled;
2399 $("downlock_repack_proper_episodes").checked = pref.rss_download_repack_proper_episodes;
2400 $("rss_filter_textarea").value = pref.rss_smart_episode_filters;
2402 // WebUI tab
2403 // Language
2404 updateWebuiLocaleSelect(pref.locale);
2405 $("performanceWarning").checked = pref.performance_warning;
2407 // HTTP Server
2408 $("webui_domain_textarea").value = pref.web_ui_domain_list;
2409 $("webui_address_value").value = pref.web_ui_address;
2410 $("webui_port_value").value = pref.web_ui_port;
2411 $("webui_upnp_checkbox").checked = pref.web_ui_upnp;
2412 $("use_https_checkbox").checked = pref.use_https;
2413 $("ssl_cert_text").value = pref.web_ui_https_cert_path;
2414 $("ssl_key_text").value = pref.web_ui_https_key_path;
2415 updateHttpsSettings();
2417 // Authentication
2418 $("webui_username_text").value = pref.web_ui_username;
2419 $("bypass_local_auth_checkbox").checked = pref.bypass_local_auth;
2420 $("bypass_auth_subnet_whitelist_checkbox").checked = pref.bypass_auth_subnet_whitelist_enabled;
2421 $("bypass_auth_subnet_whitelist_textarea").value = pref.bypass_auth_subnet_whitelist;
2422 updateBypasssAuthSettings();
2423 $("webUIMaxAuthFailCountInput").value = pref.web_ui_max_auth_fail_count.toInt();
2424 $("webUIBanDurationInput").value = pref.web_ui_ban_duration.toInt();
2425 $("webUISessionTimeoutInput").value = pref.web_ui_session_timeout.toInt();
2427 // Use alternative WebUI
2428 $("use_alt_webui_checkbox").checked = pref.alternative_webui_enabled;
2429 $("webui_files_location_textarea").value = pref.alternative_webui_path;
2430 updateAlternativeWebUISettings();
2432 // Security
2433 $("clickjacking_protection_checkbox").checked = pref.web_ui_clickjacking_protection_enabled;
2434 $("csrf_protection_checkbox").checked = pref.web_ui_csrf_protection_enabled;
2435 $("secureCookieCheckbox").checked = pref.web_ui_secure_cookie_enabled;
2436 $("host_header_validation_checkbox").checked = pref.web_ui_host_header_validation_enabled;
2437 updateHostHeaderValidationSettings();
2439 // Custom HTTP headers
2440 $("webUIUseCustomHTTPHeadersCheckbox").checked = pref.web_ui_use_custom_http_headers_enabled;
2441 $("webUICustomHTTPHeadersTextarea").value = pref.web_ui_custom_http_headers;
2442 updateWebUICustomHTTPHeadersSettings();
2444 // Reverse Proxy
2445 $("webUIReverseProxySupportCheckbox").checked = pref.web_ui_reverse_proxy_enabled;
2446 $("webUIReverseProxiesListTextarea").value = pref.web_ui_reverse_proxies_list;
2447 updateWebUIReverseProxySettings();
2449 // Update my dynamic domain name
2450 $("use_dyndns_checkbox").checked = pref.dyndns_enabled;
2451 $("dyndns_select").value = pref.dyndns_service;
2452 $("dyndns_domain_text").value = pref.dyndns_domain;
2453 $("dyndns_username_text").value = pref.dyndns_username;
2454 $("dyndns_password_text").value = pref.dyndns_password;
2455 updateDynDnsSettings();
2457 // Advanced settings
2458 // qBittorrent section
2459 $("resumeDataStorageType").value = pref.resume_data_storage_type;
2460 $("torrentContentRemoveOption").value = pref.torrent_content_remove_option;
2461 $("memoryWorkingSetLimit").value = pref.memory_working_set_limit;
2462 updateNetworkInterfaces(pref.current_network_interface, pref.current_interface_name);
2463 updateInterfaceAddresses(pref.current_network_interface, pref.current_interface_address);
2464 $("saveResumeDataInterval").value = pref.save_resume_data_interval;
2465 $("saveStatisticsInterval").value = pref.save_statistics_interval;
2466 $("torrentFileSizeLimit").value = (pref.torrent_file_size_limit / 1024 / 1024);
2467 $("recheckTorrentsOnCompletion").checked = pref.recheck_completed_torrents;
2468 $("appInstanceName").value = pref.app_instance_name;
2469 $("refreshInterval").value = pref.refresh_interval;
2470 $("resolvePeerCountries").checked = pref.resolve_peer_countries;
2471 $("reannounceWhenAddressChanged").checked = pref.reannounce_when_address_changed;
2472 // libtorrent section
2473 $("bdecodeDepthLimit").value = pref.bdecode_depth_limit;
2474 $("bdecodeTokenLimit").value = pref.bdecode_token_limit;
2475 $("asyncIOThreads").value = pref.async_io_threads;
2476 $("hashingThreads").value = pref.hashing_threads;
2477 $("filePoolSize").value = pref.file_pool_size;
2478 $("outstandMemoryWhenCheckingTorrents").value = pref.checking_memory_use;
2479 $("diskCache").value = pref.disk_cache;
2480 $("diskCacheExpiryInterval").value = pref.disk_cache_ttl;
2481 $("diskQueueSize").value = (pref.disk_queue_size / 1024);
2482 $("diskIOType").value = pref.disk_io_type;
2483 $("diskIOReadMode").value = pref.disk_io_read_mode;
2484 $("diskIOWriteMode").value = pref.disk_io_write_mode;
2485 $("coalesceReadsAndWrites").checked = pref.enable_coalesce_read_write;
2486 $("pieceExtentAffinity").checked = pref.enable_piece_extent_affinity;
2487 $("sendUploadPieceSuggestions").checked = pref.enable_upload_suggestions;
2488 $("sendBufferWatermark").value = pref.send_buffer_watermark;
2489 $("sendBufferLowWatermark").value = pref.send_buffer_low_watermark;
2490 $("sendBufferWatermarkFactor").value = pref.send_buffer_watermark_factor;
2491 $("connectionSpeed").value = pref.connection_speed;
2492 $("socketSendBufferSize").value = (pref.socket_send_buffer_size / 1024);
2493 $("socketReceiveBufferSize").value = (pref.socket_receive_buffer_size / 1024);
2494 $("socketBacklogSize").value = pref.socket_backlog_size;
2495 $("outgoingPortsMin").value = pref.outgoing_ports_min;
2496 $("outgoingPortsMax").value = pref.outgoing_ports_max;
2497 $("UPnPLeaseDuration").value = pref.upnp_lease_duration;
2498 $("peerToS").value = pref.peer_tos;
2499 $("utpTCPMixedModeAlgorithm").value = pref.utp_tcp_mixed_mode;
2500 $("IDNSupportCheckbox").checked = pref.idn_support_enabled;
2501 $("allowMultipleConnectionsFromTheSameIPAddress").checked = pref.enable_multi_connections_from_same_ip;
2502 $("validateHTTPSTrackerCertificate").checked = pref.validate_https_tracker_certificate;
2503 $("mitigateSSRF").checked = pref.ssrf_mitigation;
2504 $("blockPeersOnPrivilegedPorts").checked = pref.block_peers_on_privileged_ports;
2505 $("enableEmbeddedTracker").checked = pref.enable_embedded_tracker;
2506 $("embeddedTrackerPort").value = pref.embedded_tracker_port;
2507 $("embeddedTrackerPortForwarding").checked = pref.embedded_tracker_port_forwarding;
2508 $("markOfTheWeb").checked = pref.mark_of_the_web;
2509 $("pythonExecutablePath").value = pref.python_executable_path;
2510 $("uploadSlotsBehavior").value = pref.upload_slots_behavior;
2511 $("uploadChokingAlgorithm").value = pref.upload_choking_algorithm;
2512 $("announceAllTrackers").checked = pref.announce_to_all_trackers;
2513 $("announceAllTiers").checked = pref.announce_to_all_tiers;
2514 $("announceIP").value = pref.announce_ip;
2515 $("maxConcurrentHTTPAnnounces").value = pref.max_concurrent_http_announces;
2516 $("stopTrackerTimeout").value = pref.stop_tracker_timeout;
2517 $("peerTurnover").value = pref.peer_turnover;
2518 $("peerTurnoverCutoff").value = pref.peer_turnover_cutoff;
2519 $("peerTurnoverInterval").value = pref.peer_turnover_interval;
2520 $("requestQueueSize").value = pref.request_queue_size;
2521 $("dhtBootstrapNodes").value = pref.dht_bootstrap_nodes;
2522 $("i2pInboundQuantity").value = pref.i2p_inbound_quantity;
2523 $("i2pOutboundQuantity").value = pref.i2p_outbound_quantity;
2524 $("i2pInboundLength").value = pref.i2p_inbound_length;
2525 $("i2pOutboundLength").value = pref.i2p_outbound_length;
2530 const applyPreferences = function() {
2531 const settings = {};
2532 // Validate form data
2534 // Behavior tab
2535 LocalPreferences.set("full_url_tracker_column", document.getElementById("displayFullURLTrackerColumn").checked.toString());
2536 LocalPreferences.set("hide_zero_status_filters", document.getElementById("hideZeroFiltersCheckbox").checked.toString());
2537 LocalPreferences.set("dblclick_download", $("dblclickDownloadSelect").value);
2538 LocalPreferences.set("dblclick_complete", $("dblclickCompleteSelect").value);
2539 settings["confirm_torrent_deletion"] = document.getElementById("confirmTorrentDeletion").checked;
2540 LocalPreferences.set("use_alt_row_colors", document.getElementById("useAltRowColorsInput").checked.toString());
2541 settings["file_log_enabled"] = $("filelog_checkbox").checked;
2542 settings["file_log_path"] = $("filelog_save_path_input").value;
2543 settings["file_log_backup_enabled"] = $("filelog_backup_checkbox").checked;
2544 settings["file_log_max_size"] = Number($("filelog_max_size_input").value);
2545 settings["file_log_delete_old"] = $("filelog_delete_old_checkbox").checked;
2546 settings["file_log_age"] = Number($("filelog_age_input").value);
2547 settings["file_log_age_type"] = Number($("filelog_age_type_select").value);
2549 // Downloads tab
2550 // When adding a torrent
2551 settings["torrent_content_layout"] = $("contentlayout_select").getSelected()[0].value;
2552 settings["add_to_top_of_queue"] = $("addToTopOfQueueCheckbox").checked;
2553 settings["add_stopped_enabled"] = $("dontstartdownloads_checkbox").checked;
2554 settings["torrent_stop_condition"] = $("stopConditionSelect").getSelected()[0].value;
2555 settings["merge_trackers"] = document.getElementById("mergeTrackersInput").checked;
2556 settings["auto_delete_mode"] = Number($("deletetorrentfileafter_checkbox").checked);
2558 settings["preallocate_all"] = $("preallocateall_checkbox").checked;
2559 settings["incomplete_files_ext"] = $("appendext_checkbox").checked;
2560 settings["use_unwanted_folder"] = $("unwantedfolder_checkbox").checked;
2562 // Saving Management
2563 settings["auto_tmm_enabled"] = ($("default_tmm_combobox").value === "true");
2564 settings["torrent_changed_tmm_enabled"] = ($("torrent_changed_tmm_combobox").value === "true");
2565 settings["save_path_changed_tmm_enabled"] = ($("save_path_changed_tmm_combobox").value === "true");
2566 settings["category_changed_tmm_enabled"] = ($("category_changed_tmm_combobox").value === "true");
2567 settings["use_subcategories"] = $("use_subcategories_checkbox").checked;
2568 settings["use_category_paths_in_manual_mode"] = document.getElementById("categoryPathsManualModeCheckbox").checked;
2569 settings["save_path"] = $("savepath_text").value;
2570 settings["temp_path_enabled"] = $("temppath_checkbox").checked;
2571 settings["temp_path"] = $("temppath_text").value;
2572 if ($("exportdir_checkbox").checked)
2573 settings["export_dir"] = $("exportdir_text").value;
2574 else
2575 settings["export_dir"] = "";
2576 if ($("exportdirfin_checkbox").checked)
2577 settings["export_dir_fin"] = $("exportdirfin_text").value;
2578 else
2579 settings["export_dir_fin"] = "";
2581 // Automatically add torrents from
2582 settings["scan_dirs"] = getWatchedFolders();
2584 // Excluded file names
2585 settings["excluded_file_names_enabled"] = $("excludedFileNamesCheckbox").checked;
2586 settings["excluded_file_names"] = $("excludedFileNamesTextarea").value;
2588 // Email notification upon download completion
2589 settings["mail_notification_enabled"] = $("mail_notification_checkbox").checked;
2590 settings["mail_notification_sender"] = $("src_email_txt").value;
2591 settings["mail_notification_email"] = $("dest_email_txt").value;
2592 settings["mail_notification_smtp"] = $("smtp_server_txt").value;
2593 settings["mail_notification_ssl_enabled"] = $("mail_ssl_checkbox").checked;
2594 settings["mail_notification_auth_enabled"] = $("mail_auth_checkbox").checked;
2595 settings["mail_notification_username"] = $("mail_username_text").value;
2596 settings["mail_notification_password"] = $("mail_password_text").value;
2598 // Run an external program on torrent added
2599 settings["autorun_on_torrent_added_enabled"] = $("autorunOnTorrentAddedCheckbox").checked;
2600 settings["autorun_on_torrent_added_program"] = $("autorunOnTorrentAddedProgram").value;
2601 // Run an external program on torrent finished
2602 settings["autorun_enabled"] = $("autorun_checkbox").checked;
2603 settings["autorun_program"] = $("autorunProg_txt").value;
2605 // Connection tab
2606 // Listening Port
2607 const listen_port = $("port_value").value.toInt();
2608 if (isNaN(listen_port) || (listen_port < 0) || (listen_port > 65535)) {
2609 alert("QBT_TR(The port used for incoming connections must be between 0 and 65535.)QBT_TR[CONTEXT=HttpServer]");
2610 return;
2612 settings["listen_port"] = listen_port;
2613 settings["upnp"] = $("upnp_checkbox").checked;
2615 // Connections Limits
2616 let max_connec = -1;
2617 if ($("max_connec_checkbox").checked) {
2618 max_connec = $("max_connec_value").value.toInt();
2619 if (isNaN(max_connec) || (max_connec <= 0)) {
2620 alert("QBT_TR(Maximum number of connections limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2621 return;
2624 settings["max_connec"] = max_connec;
2625 let max_connec_per_torrent = -1;
2626 if ($("max_connec_per_torrent_checkbox").checked) {
2627 max_connec_per_torrent = $("max_connec_per_torrent_value").value.toInt();
2628 if (isNaN(max_connec_per_torrent) || (max_connec_per_torrent <= 0)) {
2629 alert("QBT_TR(Maximum number of connections per torrent limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2630 return;
2633 settings["max_connec_per_torrent"] = max_connec_per_torrent;
2634 let max_uploads = -1;
2635 if ($("max_uploads_checkbox").checked) {
2636 max_uploads = $("max_uploads_value").value.toInt();
2637 if (isNaN(max_uploads) || (max_uploads <= 0)) {
2638 alert("QBT_TR(Global number of upload slots limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2639 return;
2642 settings["max_uploads"] = max_uploads;
2643 let max_uploads_per_torrent = -1;
2644 if ($("max_uploads_per_torrent_checkbox").checked) {
2645 max_uploads_per_torrent = $("max_uploads_per_torrent_value").value.toInt();
2646 if (isNaN(max_uploads_per_torrent) || (max_uploads_per_torrent <= 0)) {
2647 alert("QBT_TR(Maximum number of upload slots per torrent limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2648 return;
2651 settings["max_uploads_per_torrent"] = max_uploads_per_torrent;
2653 // I2P
2654 settings["i2p_enabled"] = $("i2pEnabledCheckbox").checked;
2655 settings["i2p_address"] = $("i2pAddress").value;
2656 settings["i2p_port"] = $("i2pPort").value.toInt();
2657 settings["i2p_mixed_mode"] = $("i2pMixedMode").checked;
2659 // Proxy Server
2660 settings["proxy_type"] = $("peer_proxy_type_select").value;
2661 settings["proxy_ip"] = $("peer_proxy_host_text").value;
2662 settings["proxy_port"] = $("peer_proxy_port_value").value.toInt();
2663 settings["proxy_auth_enabled"] = $("peer_proxy_auth_checkbox").checked;
2664 settings["proxy_username"] = $("peer_proxy_username_text").value;
2665 settings["proxy_password"] = $("peer_proxy_password_text").value;
2666 settings["proxy_hostname_lookup"] = $("proxyHostnameLookupCheckbox").checked;
2667 settings["proxy_bittorrent"] = $("proxy_bittorrent_checkbox").checked;
2668 settings["proxy_peer_connections"] = $("use_peer_proxy_checkbox").checked;
2669 settings["proxy_rss"] = $("proxy_rss_checkbox").checked;
2670 settings["proxy_misc"] = $("proxy_misc_checkbox").checked;
2672 // IP Filtering
2673 settings["ip_filter_enabled"] = $("ipfilter_text_checkbox").checked;
2674 settings["ip_filter_path"] = $("ipfilter_text").value;
2675 settings["ip_filter_trackers"] = $("ipfilter_trackers_checkbox").checked;
2676 settings["banned_IPs"] = $("banned_IPs_textarea").value;
2678 // Speed tab
2679 // Global Rate Limits
2680 const up_limit = $("up_limit_value").value.toInt() * 1024;
2681 if (isNaN(up_limit) || (up_limit < 0)) {
2682 alert("QBT_TR(Global upload rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2683 return;
2685 settings["up_limit"] = up_limit;
2687 const dl_limit = $("dl_limit_value").value.toInt() * 1024;
2688 if (isNaN(dl_limit) || (dl_limit < 0)) {
2689 alert("QBT_TR(Global download rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2690 return;
2692 settings["dl_limit"] = dl_limit;
2694 // Alternative Global Rate Limits
2695 const alt_up_limit = $("alt_up_limit_value").value.toInt() * 1024;
2696 if (isNaN(alt_up_limit) || (alt_up_limit < 0)) {
2697 alert("QBT_TR(Alternative upload rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2698 return;
2700 settings["alt_up_limit"] = alt_up_limit;
2702 const alt_dl_limit = $("alt_dl_limit_value").value.toInt() * 1024;
2703 if (isNaN(alt_dl_limit) || (alt_dl_limit < 0)) {
2704 alert("QBT_TR(Alternative download rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2705 return;
2707 settings["alt_dl_limit"] = alt_dl_limit;
2709 settings["bittorrent_protocol"] = Number($("enable_protocol_combobox").value);
2710 settings["limit_utp_rate"] = $("limit_utp_rate_checkbox").checked;
2711 settings["limit_tcp_overhead"] = $("limit_tcp_overhead_checkbox").checked;
2712 settings["limit_lan_peers"] = $("limit_lan_peers_checkbox").checked;
2714 // Scheduler
2715 const scheduling_enabled = $("limitSchedulingCheckbox").checked;
2716 settings["scheduler_enabled"] = scheduling_enabled;
2717 if (scheduling_enabled) {
2718 settings["schedule_from_hour"] = $("schedule_from_hour").value.toInt();
2719 settings["schedule_from_min"] = $("schedule_from_min").value.toInt();
2720 settings["schedule_to_hour"] = $("schedule_to_hour").value.toInt();
2721 settings["schedule_to_min"] = $("schedule_to_min").value.toInt();
2722 settings["scheduler_days"] = $("schedule_freq_select").value.toInt();
2725 // Bittorrent tab
2726 // Privacy
2727 settings["dht"] = $("dht_checkbox").checked;
2728 settings["pex"] = $("pex_checkbox").checked;
2729 settings["lsd"] = $("lsd_checkbox").checked;
2730 settings["encryption"] = Number($("encryption_select").getSelected()[0].value);
2731 settings["anonymous_mode"] = $("anonymous_mode_checkbox").checked;
2733 settings["max_active_checking_torrents"] = Number($("maxActiveCheckingTorrents").value);
2735 // Torrent Queueing
2736 settings["queueing_enabled"] = $("queueing_checkbox").checked;
2737 if ($("queueing_checkbox").checked) {
2738 const max_active_downloads = $("max_active_dl_value").value.toInt();
2739 if (isNaN(max_active_downloads) || (max_active_downloads < -1)) {
2740 alert("QBT_TR(Maximum active downloads must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
2741 return;
2743 settings["max_active_downloads"] = max_active_downloads;
2744 const max_active_uploads = $("max_active_up_value").value.toInt();
2745 if (isNaN(max_active_uploads) || (max_active_uploads < -1)) {
2746 alert("QBT_TR(Maximum active uploads must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
2747 return;
2749 settings["max_active_uploads"] = max_active_uploads;
2750 const max_active_torrents = $("max_active_to_value").value.toInt();
2751 if (isNaN(max_active_torrents) || (max_active_torrents < -1)) {
2752 alert("QBT_TR(Maximum active torrents must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
2753 return;
2755 settings["max_active_torrents"] = max_active_torrents;
2756 settings["dont_count_slow_torrents"] = $("dont_count_slow_torrents_checkbox").checked;
2757 const dl_rate_threshold = $("dl_rate_threshold").value.toInt();
2758 if (isNaN(dl_rate_threshold) || (dl_rate_threshold < 1)) {
2759 alert("QBT_TR(Download rate threshold must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
2760 return;
2762 settings["slow_torrent_dl_rate_threshold"] = dl_rate_threshold;
2763 const ul_rate_threshold = $("ul_rate_threshold").value.toInt();
2764 if (isNaN(ul_rate_threshold) || (ul_rate_threshold < 1)) {
2765 alert("QBT_TR(Upload rate threshold must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
2766 return;
2768 settings["slow_torrent_ul_rate_threshold"] = ul_rate_threshold;
2769 const torrent_inactive_timer = $("torrent_inactive_timer").value.toInt();
2770 if (isNaN(torrent_inactive_timer) || (torrent_inactive_timer < 1)) {
2771 alert("QBT_TR(Torrent inactivity timer must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
2772 return;
2774 settings["slow_torrent_inactive_timer"] = torrent_inactive_timer;
2777 // Share Ratio Limiting
2778 let max_ratio = -1;
2779 if ($("max_ratio_checkbox").checked) {
2780 max_ratio = $("max_ratio_value").value.toFloat();
2781 if (isNaN(max_ratio) || (max_ratio < 0) || (max_ratio > 9998)) {
2782 alert("QBT_TR(Share ratio limit must be between 0 and 9998.)QBT_TR[CONTEXT=HttpServer]");
2783 return;
2786 settings["max_ratio_enabled"] = $("max_ratio_checkbox").checked;
2787 settings["max_ratio"] = max_ratio;
2789 let max_seeding_time = -1;
2790 if ($("max_seeding_time_checkbox").checked) {
2791 max_seeding_time = $("max_seeding_time_value").value.toInt();
2792 if (isNaN(max_seeding_time) || (max_seeding_time < 0) || (max_seeding_time > 525600)) {
2793 alert("QBT_TR(Seeding time limit must be between 0 and 525600 minutes.)QBT_TR[CONTEXT=HttpServer]");
2794 return;
2797 settings["max_seeding_time_enabled"] = $("max_seeding_time_checkbox").checked;
2798 settings["max_seeding_time"] = max_seeding_time;
2799 settings["max_ratio_act"] = $("max_ratio_act").value.toInt();
2801 let max_inactive_seeding_time = -1;
2802 if ($("max_inactive_seeding_time_checkbox").checked) {
2803 max_inactive_seeding_time = $("max_inactive_seeding_time_value").value.toInt();
2804 if (isNaN(max_inactive_seeding_time) || (max_inactive_seeding_time < 0) || (max_inactive_seeding_time > 525600)) {
2805 alert("QBT_TR(Seeding time limit must be between 0 and 525600 minutes.)QBT_TR[CONTEXT=HttpServer]");
2806 return;
2809 settings["max_inactive_seeding_time_enabled"] = $("max_inactive_seeding_time_checkbox").checked;
2810 settings["max_inactive_seeding_time"] = max_inactive_seeding_time;
2811 settings["max_ratio_act"] = $("max_ratio_act").value.toInt();
2813 // Add trackers
2814 settings["add_trackers_enabled"] = $("add_trackers_checkbox").checked;
2815 settings["add_trackers"] = $("add_trackers_textarea").value;
2817 // RSS Tab
2818 settings["rss_processing_enabled"] = $("enable_fetching_rss_feeds_checkbox").checked;
2819 settings["rss_refresh_interval"] = Number($("feed_refresh_interval").value);
2820 settings["rss_fetch_delay"] = Number($("feedFetchDelay").value);
2821 settings["rss_max_articles_per_feed"] = Number($("maximum_article_number").value);
2822 settings["rss_auto_downloading_enabled"] = $("enable_auto_downloading_rss_torrents_checkbox").checked;
2823 settings["rss_download_repack_proper_episodes"] = $("downlock_repack_proper_episodes").checked;
2824 settings["rss_smart_episode_filters"] = $("rss_filter_textarea").value;
2826 // WebUI tab
2827 // Language
2828 settings["locale"] = $("locale_select").value;
2829 settings["performance_warning"] = $("performanceWarning").checked;
2831 // HTTP Server
2832 settings["web_ui_domain_list"] = $("webui_domain_textarea").value;
2833 const web_ui_address = $("webui_address_value").value.toString();
2834 const web_ui_port = $("webui_port_value").value.toInt();
2835 if (isNaN(web_ui_port) || (web_ui_port < 1) || (web_ui_port > 65535)) {
2836 alert("QBT_TR(The port used for the WebUI must be between 1 and 65535.)QBT_TR[CONTEXT=HttpServer]");
2837 return;
2839 settings["web_ui_address"] = web_ui_address;
2840 settings["web_ui_port"] = web_ui_port;
2841 settings["web_ui_upnp"] = $("webui_upnp_checkbox").checked;
2843 const useHTTPS = $("use_https_checkbox").checked;
2844 settings["use_https"] = useHTTPS;
2846 const httpsCertificate = $("ssl_cert_text").value;
2847 settings["web_ui_https_cert_path"] = httpsCertificate;
2848 if (useHTTPS && (httpsCertificate.length === 0)) {
2849 alert("QBT_TR(HTTPS certificate should not be empty)QBT_TR[CONTEXT=OptionsDialog]");
2850 return;
2853 const httpsKey = $("ssl_key_text").value;
2854 settings["web_ui_https_key_path"] = httpsKey;
2855 if (useHTTPS && (httpsKey.length === 0)) {
2856 alert("QBT_TR(HTTPS key should not be empty)QBT_TR[CONTEXT=OptionsDialog]");
2857 return;
2860 // Authentication
2861 const web_ui_username = $("webui_username_text").value;
2862 if (web_ui_username.length < 3) {
2863 alert("QBT_TR(The WebUI username must be at least 3 characters long.)QBT_TR[CONTEXT=OptionsDialog]");
2864 return;
2866 const web_ui_password = $("webui_password_text").value;
2867 if ((0 < web_ui_password.length) && (web_ui_password.length < 6)) {
2868 alert("QBT_TR(The WebUI password must be at least 6 characters long.)QBT_TR[CONTEXT=OptionsDialog]");
2869 return;
2872 settings["web_ui_username"] = web_ui_username;
2873 if (web_ui_password.length > 0)
2874 settings["web_ui_password"] = web_ui_password;
2875 settings["bypass_local_auth"] = $("bypass_local_auth_checkbox").checked;
2876 settings["bypass_auth_subnet_whitelist_enabled"] = $("bypass_auth_subnet_whitelist_checkbox").checked;
2877 settings["bypass_auth_subnet_whitelist"] = $("bypass_auth_subnet_whitelist_textarea").value;
2878 settings["web_ui_max_auth_fail_count"] = Number($("webUIMaxAuthFailCountInput").value);
2879 settings["web_ui_ban_duration"] = Number($("webUIBanDurationInput").value);
2880 settings["web_ui_session_timeout"] = Number($("webUISessionTimeoutInput").value);
2882 // Use alternative WebUI
2883 const alternative_webui_enabled = $("use_alt_webui_checkbox").checked;
2884 const webui_files_location_textarea = $("webui_files_location_textarea").value;
2885 if (alternative_webui_enabled && (webui_files_location_textarea.trim() === "")) {
2886 alert("QBT_TR(The alternative WebUI files location cannot be blank.)QBT_TR[CONTEXT=OptionsDialog]");
2887 return;
2889 settings["alternative_webui_enabled"] = alternative_webui_enabled;
2890 settings["alternative_webui_path"] = webui_files_location_textarea;
2892 // Security
2893 settings["web_ui_clickjacking_protection_enabled"] = $("clickjacking_protection_checkbox").checked;
2894 settings["web_ui_csrf_protection_enabled"] = $("csrf_protection_checkbox").checked;
2895 settings["web_ui_secure_cookie_enabled"] = $("secureCookieCheckbox").checked;
2896 settings["web_ui_host_header_validation_enabled"] = $("host_header_validation_checkbox").checked;
2898 // Custom HTTP headers
2899 settings["web_ui_use_custom_http_headers_enabled"] = $("webUIUseCustomHTTPHeadersCheckbox").checked;
2900 settings["web_ui_custom_http_headers"] = $("webUICustomHTTPHeadersTextarea").value;
2902 // Reverse Proxy
2903 settings["web_ui_reverse_proxy_enabled"] = $("webUIReverseProxySupportCheckbox").checked;
2904 settings["web_ui_reverse_proxies_list"] = $("webUIReverseProxiesListTextarea").value;
2906 // Update my dynamic domain name
2907 settings["dyndns_enabled"] = $("use_dyndns_checkbox").checked;
2908 settings["dyndns_service"] = Number($("dyndns_select").value);
2909 settings["dyndns_domain"] = $("dyndns_domain_text").value;
2910 settings["dyndns_username"] = $("dyndns_username_text").value;
2911 settings["dyndns_password"] = $("dyndns_password_text").value;
2913 // Update advanced settings
2914 // qBittorrent section
2915 settings["resume_data_storage_type"] = $("resumeDataStorageType").value;
2916 settings["torrent_content_remove_option"] = $("torrentContentRemoveOption").value;
2917 settings["memory_working_set_limit"] = Number($("memoryWorkingSetLimit").value);
2918 settings["current_network_interface"] = $("networkInterface").value;
2919 settings["current_interface_address"] = $("optionalIPAddressToBind").value;
2920 settings["save_resume_data_interval"] = Number($("saveResumeDataInterval").value);
2921 settings["save_statistics_interval"] = Number($("saveStatisticsInterval").value);
2922 settings["torrent_file_size_limit"] = ($("torrentFileSizeLimit").value * 1024 * 1024);
2923 settings["recheck_completed_torrents"] = $("recheckTorrentsOnCompletion").checked;
2924 settings["app_instance_name"] = $("appInstanceName").value;
2925 settings["refresh_interval"] = Number($("refreshInterval").value);
2926 settings["resolve_peer_countries"] = $("resolvePeerCountries").checked;
2927 settings["reannounce_when_address_changed"] = $("reannounceWhenAddressChanged").checked;
2929 // libtorrent section
2930 settings["bdecode_depth_limit"] = Number($("bdecodeDepthLimit").value);
2931 settings["bdecode_token_limit"] = Number($("bdecodeTokenLimit").value);
2932 settings["async_io_threads"] = Number($("asyncIOThreads").value);
2933 settings["hashing_threads"] = Number($("hashingThreads").value);
2934 settings["file_pool_size"] = Number($("filePoolSize").value);
2935 settings["checking_memory_use"] = Number($("outstandMemoryWhenCheckingTorrents").value);
2936 settings["disk_cache"] = Number($("diskCache").value);
2937 settings["disk_cache_ttl"] = Number($("diskCacheExpiryInterval").value);
2938 settings["disk_queue_size"] = (Number($("diskQueueSize").value) * 1024);
2939 settings["disk_io_type"] = Number($("diskIOType").value);
2940 settings["disk_io_read_mode"] = Number($("diskIOReadMode").value);
2941 settings["disk_io_write_mode"] = Number($("diskIOWriteMode").value);
2942 settings["enable_coalesce_read_write"] = $("coalesceReadsAndWrites").checked;
2943 settings["enable_piece_extent_affinity"] = $("pieceExtentAffinity").checked;
2944 settings["enable_upload_suggestions"] = $("sendUploadPieceSuggestions").checked;
2945 settings["send_buffer_watermark"] = Number($("sendBufferWatermark").value);
2946 settings["send_buffer_low_watermark"] = Number($("sendBufferLowWatermark").value);
2947 settings["send_buffer_watermark_factor"] = Number($("sendBufferWatermarkFactor").value);
2948 settings["connection_speed"] = Number($("connectionSpeed").value);
2949 settings["socket_send_buffer_size"] = ($("socketSendBufferSize").value * 1024);
2950 settings["socket_receive_buffer_size"] = ($("socketReceiveBufferSize").value * 1024);
2951 settings["socket_backlog_size"] = Number($("socketBacklogSize").value);
2952 settings["outgoing_ports_min"] = Number($("outgoingPortsMin").value);
2953 settings["outgoing_ports_max"] = Number($("outgoingPortsMax").value);
2954 settings["upnp_lease_duration"] = Number($("UPnPLeaseDuration").value);
2955 settings["peer_tos"] = Number($("peerToS").value);
2956 settings["utp_tcp_mixed_mode"] = Number($("utpTCPMixedModeAlgorithm").value);
2957 settings["idn_support_enabled"] = $("IDNSupportCheckbox").checked;
2958 settings["enable_multi_connections_from_same_ip"] = $("allowMultipleConnectionsFromTheSameIPAddress").checked;
2959 settings["validate_https_tracker_certificate"] = $("validateHTTPSTrackerCertificate").checked;
2960 settings["ssrf_mitigation"] = $("mitigateSSRF").checked;
2961 settings["block_peers_on_privileged_ports"] = $("blockPeersOnPrivilegedPorts").checked;
2962 settings["enable_embedded_tracker"] = $("enableEmbeddedTracker").checked;
2963 settings["embedded_tracker_port"] = Number($("embeddedTrackerPort").value);
2964 settings["embedded_tracker_port_forwarding"] = $("embeddedTrackerPortForwarding").checked;
2965 settings["mark_of_the_web"] = $("markOfTheWeb").checked;
2966 settings["python_executable_path"] = $("pythonExecutablePath").value;
2967 settings["upload_slots_behavior"] = Number($("uploadSlotsBehavior").value);
2968 settings["upload_choking_algorithm"] = Number($("uploadChokingAlgorithm").value);
2969 settings["announce_to_all_trackers"] = $("announceAllTrackers").checked;
2970 settings["announce_to_all_tiers"] = $("announceAllTiers").checked;
2971 settings["announce_ip"] = $("announceIP").value;
2972 settings["max_concurrent_http_announces"] = Number($("maxConcurrentHTTPAnnounces").value);
2973 settings["stop_tracker_timeout"] = Number($("stopTrackerTimeout").value);
2974 settings["peer_turnover"] = Number($("peerTurnover").value);
2975 settings["peer_turnover_cutoff"] = Number($("peerTurnoverCutoff").value);
2976 settings["peer_turnover_interval"] = Number($("peerTurnoverInterval").value);
2977 settings["request_queue_size"] = Number($("requestQueueSize").value);
2978 settings["dht_bootstrap_nodes"] = $("dhtBootstrapNodes").value;
2979 settings["i2p_inbound_quantity"] = Number($("i2pInboundQuantity").value);
2980 settings["i2p_outbound_quantity"] = Number($("i2pOutboundQuantity").value);
2981 settings["i2p_inbound_length"] = Number($("i2pInboundLength").value);
2982 settings["i2p_outbound_length"] = Number($("i2pOutboundLength").value);
2984 // Send it to qBT
2985 window.parent.qBittorrent.Cache.preferences.set({
2986 data: settings,
2987 onFailure: function() {
2988 alert("QBT_TR(Unable to save program preferences, qBittorrent is probably unreachable.)QBT_TR[CONTEXT=HttpServer]");
2989 window.parent.qBittorrent.Client.closeWindows();
2991 onSuccess: function() {
2992 // Close window
2993 window.parent.location.reload();
2994 window.parent.qBittorrent.Client.closeWindows();
2999 const setup = () => {
3000 watchedFoldersTable = new HtmlTable($("watched_folders_tab"));
3002 const buildInfo = window.qBittorrent.Cache.buildInfo.get();
3004 // hide entries
3005 const libtorrentVersion = window.qBittorrent.Misc.parseVersion(buildInfo.libtorrent);
3006 if (libtorrentVersion.valid) {
3007 if (libtorrentVersion.major >= 2) {
3008 $("rowDiskCache").style.display = "none";
3009 $("rowDiskCacheExpiryInterval").style.display = "none";
3010 $("rowCoalesceReadsAndWrites").style.display = "none";
3012 else {
3013 $("fieldsetI2p").style.display = "none";
3014 $("rowMemoryWorkingSetLimit").style.display = "none";
3015 $("rowHashingThreads").style.display = "none";
3016 $("rowDiskIOType").style.display = "none";
3017 $("rowI2pInboundQuantity").style.display = "none";
3018 $("rowI2pOutboundQuantity").style.display = "none";
3019 $("rowI2pInboundLength").style.display = "none";
3020 $("rowI2pOutboundLength").style.display = "none";
3023 if (!((libtorrentVersion.major >= 2) && (libtorrentVersion.minor >= 0) && (libtorrentVersion.fix >= 6)))
3024 $("diskIOWriteModeWriteThrough").style.display = "none";
3027 if ((buildInfo.platform !== "macos") && (buildInfo.platform !== "windows"))
3028 $("rowMarkOfTheWeb").style.display = "none";
3030 $("networkInterface").addEventListener("change", function() {
3031 updateInterfaceAddresses($(this).value, "");
3034 loadPreferences();
3036 window.qBittorrent.pathAutofill.attachPathAutofill();
3039 return exports();
3040 })();
3041 Object.freeze(window.qBittorrent.Preferences);
3043 window.qBittorrent.Preferences.setup();
3044 </script>