WebUI: Improve torrent deletion
[qBittorrent.git] / src / webui / www / private / views / preferences.html
blobcb77663200a5cd9bc93ab835b523cfb001a2b706
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="torrentFileSizeLimit">QBT_TR(.torrent file size limit:)QBT_TR[CONTEXT=OptionsDialog]</label>
1158 </td>
1159 <td>
1160 <input type="text" id="torrentFileSizeLimit" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1161 </td>
1162 </tr>
1163 <tr>
1164 <td>
1165 <label for="recheckTorrentsOnCompletion">QBT_TR(Recheck torrents on completion:)QBT_TR[CONTEXT=OptionsDialog]</label>
1166 </td>
1167 <td>
1168 <input type="checkbox" id="recheckTorrentsOnCompletion">
1169 </td>
1170 </tr>
1171 <tr>
1172 <td>
1173 <label for="appInstanceName">QBT_TR(Customize application instance name:)QBT_TR[CONTEXT=OptionsDialog]</label>
1174 </td>
1175 <td>
1176 <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]">
1177 </td>
1178 </tr>
1179 <tr>
1180 <td>
1181 <label for="refreshInterval">QBT_TR(Refresh interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
1182 </td>
1183 <td>
1184 <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]
1185 </td>
1186 </tr>
1187 <tr>
1188 <td>
1189 <label for="resolvePeerCountries">QBT_TR(Resolve peer countries:)QBT_TR[CONTEXT=OptionsDialog]</label>
1190 </td>
1191 <td>
1192 <input type="checkbox" id="resolvePeerCountries">
1193 </td>
1194 </tr>
1195 <tr>
1196 <td>
1197 <label for="reannounceWhenAddressChanged">QBT_TR(Reannounce to all trackers when IP or port changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
1198 </td>
1199 <td>
1200 <input type="checkbox" id="reannounceWhenAddressChanged">
1201 </td>
1202 </tr>
1203 <tr>
1204 <td>
1205 <label for="enableEmbeddedTracker">QBT_TR(Enable embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
1206 </td>
1207 <td>
1208 <input type="checkbox" id="enableEmbeddedTracker">
1209 </td>
1210 </tr>
1211 <tr>
1212 <td>
1213 <label for="embeddedTrackerPort">QBT_TR(Embedded tracker port:)QBT_TR[CONTEXT=OptionsDialog]</label>
1214 </td>
1215 <td>
1216 <input type="text" id="embeddedTrackerPort" style="width: 15em;">
1217 </td>
1218 </tr>
1219 <tr>
1220 <td>
1221 <label for="embeddedTrackerPortForwarding">QBT_TR(Enable port forwarding for embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
1222 </td>
1223 <td>
1224 <input type="checkbox" id="embeddedTrackerPortForwarding">
1225 </td>
1226 </tr>
1227 <tr id="rowMarkOfTheWeb">
1228 <td>
1229 <label for="markOfTheWeb">QBT_TR(Enable Mark-of-the-Web (MOTW) for downloaded files (require macOS or Windows):)QBT_TR[CONTEXT=OptionsDialog]</label>
1230 </td>
1231 <td>
1232 <input type="checkbox" id="markOfTheWeb">
1233 </td>
1234 </tr>
1235 <tr>
1236 <td>
1237 <label for="pythonExecutablePath">QBT_TR(Python executable path (may require restart):)QBT_TR[CONTEXT=OptionsDialog]</label>
1238 </td>
1239 <td>
1240 <input type="text" id="pythonExecutablePath" class="pathFile" placeholder="QBT_TR((Auto detect if empty))QBT_TR[CONTEXT=OptionsDialog]" style="width: 15em;">
1241 </td>
1242 </tr>
1243 </tbody>
1244 </table>
1245 </fieldset>
1246 <fieldset class="settings">
1247 <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>
1248 <table>
1249 <tbody>
1250 <tr>
1251 <td>
1252 <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>
1253 </td>
1254 <td>
1255 <input type="text" id="bdecodeDepthLimit" style="width: 15em;">
1256 </td>
1257 </tr>
1258 <tr>
1259 <td>
1260 <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>
1261 </td>
1262 <td>
1263 <input type="text" id="bdecodeTokenLimit" style="width: 15em;">
1264 </td>
1265 </tr>
1266 <tr>
1267 <td>
1268 <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>
1269 </td>
1270 <td>
1271 <input type="text" id="asyncIOThreads" style="width: 15em;">
1272 </td>
1273 </tr>
1274 <tr id="rowHashingThreads">
1275 <td>
1276 <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>
1277 </td>
1278 <td>
1279 <input type="text" id="hashingThreads" style="width: 15em;">
1280 </td>
1281 </tr>
1282 <tr>
1283 <td>
1284 <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>
1285 </td>
1286 <td>
1287 <input type="text" id="filePoolSize" style="width: 15em;">
1288 </td>
1289 </tr>
1290 <tr>
1291 <td>
1292 <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>
1293 </td>
1294 <td>
1295 <input type="text" id="outstandMemoryWhenCheckingTorrents" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1296 </td>
1297 </tr>
1298 <tr id="rowDiskCache">
1299 <td>
1300 <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>
1301 </td>
1302 <td>
1303 <input type="text" id="diskCache" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
1304 </td>
1305 </tr>
1306 <tr id="rowDiskCacheExpiryInterval">
1307 <td>
1308 <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>
1309 </td>
1310 <td>
1311 <input type="text" id="diskCacheExpiryInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(s)QBT_TR[CONTEXT=OptionsDialog]
1312 </td>
1313 </tr>
1314 <tr>
1315 <td>
1316 <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>
1317 </td>
1318 <td>
1319 <input type="text" id="diskQueueSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1320 </td>
1321 </tr>
1322 <tr id="rowDiskIOType">
1323 <td>
1324 <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>
1325 </td>
1326 <td>
1327 <select id="diskIOType" style="width: 15em;">
1328 <option value="0">QBT_TR(Default)QBT_TR[CONTEXT=OptionsDialog]</option>
1329 <option value="1">QBT_TR(Memory mapped files)QBT_TR[CONTEXT=OptionsDialog]</option>
1330 <option value="2">QBT_TR(POSIX-compliant)QBT_TR[CONTEXT=OptionsDialog]</option>
1331 </select>
1332 </td>
1333 </tr>
1334 <tr>
1335 <td>
1336 <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>
1337 </td>
1338 <td>
1339 <select id="diskIOReadMode" style="width: 15em;">
1340 <option value="0">QBT_TR(Disable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1341 <option value="1">QBT_TR(Enable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1342 </select>
1343 </td>
1344 </tr>
1345 <tr>
1346 <td>
1347 <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>
1348 </td>
1349 <td>
1350 <select id="diskIOWriteMode" style="width: 15em;">
1351 <option value="0">QBT_TR(Disable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1352 <option value="1">QBT_TR(Enable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
1353 <option value="2" id="diskIOWriteModeWriteThrough">QBT_TR(Write-through)QBT_TR[CONTEXT=OptionsDialog]</option>
1354 </select>
1355 </td>
1356 </tr>
1357 <tr id="rowCoalesceReadsAndWrites">
1358 <td>
1359 <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>
1360 </td>
1361 <td>
1362 <input type="checkbox" id="coalesceReadsAndWrites">
1363 </td>
1364 </tr>
1365 <tr>
1366 <td>
1367 <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>
1368 </td>
1369 <td>
1370 <input type="checkbox" id="pieceExtentAffinity">
1371 </td>
1372 </tr>
1373 <tr>
1374 <td>
1375 <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>
1376 </td>
1377 <td>
1378 <input type="checkbox" id="sendUploadPieceSuggestions">
1379 </td>
1380 </tr>
1381 <tr>
1382 <td>
1383 <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>
1384 </td>
1385 <td>
1386 <input type="text" id="sendBufferWatermark" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1387 </td>
1388 </tr>
1389 <tr>
1390 <td>
1391 <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>
1392 </td>
1393 <td>
1394 <input type="text" id="sendBufferLowWatermark" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1395 </td>
1396 </tr>
1397 <tr>
1398 <td>
1399 <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>
1400 </td>
1401 <td>
1402 <input type="text" id="sendBufferWatermarkFactor" style="width: 15em;">&nbsp;&nbsp;%
1403 </td>
1404 </tr>
1405 <tr>
1406 <td>
1407 <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>
1408 </td>
1409 <td>
1410 <input type="text" id="connectionSpeed" style="width: 15em;">
1411 </td>
1412 </tr>
1413 <tr>
1414 <td>
1415 <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>
1416 </td>
1417 <td>
1418 <input type="text" id="socketSendBufferSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1419 </td>
1420 </tr>
1421 <tr>
1422 <td>
1423 <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>
1424 </td>
1425 <td>
1426 <input type="text" id="socketReceiveBufferSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
1427 </td>
1428 </tr>
1429 <tr>
1430 <td>
1431 <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>
1432 </td>
1433 <td>
1434 <input type="text" id="socketBacklogSize" style="width: 15em;">
1435 </td>
1436 </tr>
1437 <tr>
1438 <td>
1439 <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>
1440 </td>
1441 <td>
1442 <input type="text" id="outgoingPortsMin" style="width: 15em;">
1443 </td>
1444 </tr>
1445 <tr>
1446 <td>
1447 <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>
1448 </td>
1449 <td>
1450 <input type="text" id="outgoingPortsMax" style="width: 15em;">
1451 </td>
1452 </tr>
1453 <tr>
1454 <td>
1455 <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>
1456 </td>
1457 <td>
1458 <input type="text" id="UPnPLeaseDuration" style="width: 15em;">
1459 </td>
1460 </tr>
1461 <tr>
1462 <td>
1463 <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>
1464 </td>
1465 <td>
1466 <input type="text" id="peerToS" style="width: 15em;">
1467 </td>
1468 </tr>
1469 <tr>
1470 <td>
1471 <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>
1472 </td>
1473 <td>
1474 <select id="utpTCPMixedModeAlgorithm" style="width: 15em;">
1475 <option value="0">QBT_TR(Prefer TCP)QBT_TR[CONTEXT=OptionsDialog]</option>
1476 <option value="1">QBT_TR(Peer proportional (throttles TCP))QBT_TR[CONTEXT=OptionsDialog]</option>
1477 </select>
1478 </td>
1479 </tr>
1480 <tr>
1481 <td>
1482 <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>
1483 </td>
1484 <td>
1485 <input type="checkbox" id="IDNSupportCheckbox">
1486 </td>
1487 </tr>
1488 <tr>
1489 <td>
1490 <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>
1491 </td>
1492 <td>
1493 <input type="checkbox" id="allowMultipleConnectionsFromTheSameIPAddress">
1494 </td>
1495 </tr>
1496 <tr>
1497 <td>
1498 <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>
1499 </td>
1500 <td>
1501 <input type="checkbox" id="validateHTTPSTrackerCertificate">
1502 </td>
1503 </tr>
1504 <tr>
1505 <td>
1506 <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>
1507 </td>
1508 <td>
1509 <input type="checkbox" id="mitigateSSRF">
1510 </td>
1511 </tr>
1512 <tr>
1513 <td>
1514 <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>
1515 </td>
1516 <td>
1517 <input type="checkbox" id="blockPeersOnPrivilegedPorts">
1518 </td>
1519 </tr>
1520 <tr>
1521 <td>
1522 <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>
1523 </td>
1524 <td>
1525 <select id="uploadSlotsBehavior" style="width: 15em;">
1526 <option value="0">QBT_TR(Fixed slots)QBT_TR[CONTEXT=OptionsDialog]</option>
1527 <option value="1">QBT_TR(Upload rate based)QBT_TR[CONTEXT=OptionsDialog]</option>
1528 </select>
1529 </td>
1530 </tr>
1531 <tr>
1532 <td>
1533 <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>
1534 </td>
1535 <td>
1536 <select id="uploadChokingAlgorithm" style="width: 15em;">
1537 <option value="0">QBT_TR(Round-robin)QBT_TR[CONTEXT=OptionsDialog]</option>
1538 <option value="1">QBT_TR(Fastest upload)QBT_TR[CONTEXT=OptionsDialog]</option>
1539 <option value="2">QBT_TR(Anti-leech)QBT_TR[CONTEXT=OptionsDialog]</option>
1540 </select>
1541 </td>
1542 </tr>
1543 <tr>
1544 <td>
1545 <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>
1546 </td>
1547 <td>
1548 <input type="checkbox" id="announceAllTrackers">
1549 </td>
1550 </tr>
1551 <tr>
1552 <td>
1553 <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>
1554 </td>
1555 <td>
1556 <input type="checkbox" id="announceAllTiers">
1557 </td>
1558 </tr>
1559 <tr>
1560 <td>
1561 <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>
1562 </td>
1563 <td>
1564 <input type="text" id="announceIP" style="width: 15em;">
1565 </td>
1566 </tr>
1567 <tr>
1568 <td>
1569 <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>
1570 </td>
1571 <td>
1572 <input type="text" id="maxConcurrentHTTPAnnounces" style="width: 15em;">
1573 </td>
1574 </tr>
1575 <tr>
1576 <td>
1577 <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>
1578 </td>
1579 <td>
1580 <input type="text" id="stopTrackerTimeout" style="width: 15em;">
1581 </td>
1582 </tr>
1583 <tr>
1584 <td>
1585 <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>
1586 </td>
1587 <td>
1588 <input type="text" id="peerTurnover" style="width: 15em;">&nbsp;&nbsp;%
1589 </td>
1590 </tr>
1591 <tr>
1592 <td>
1593 <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>
1594 </td>
1595 <td>
1596 <input type="text" id="peerTurnoverCutoff" style="width: 15em;">&nbsp;&nbsp;%
1597 </td>
1598 </tr>
1599 <tr>
1600 <td>
1601 <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>
1602 </td>
1603 <td>
1604 <input type="text" id="peerTurnoverInterval" style="width: 15em;">&nbsp;&nbsp;s
1605 </td>
1606 </tr>
1607 <tr>
1608 <td>
1609 <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>
1610 </td>
1611 <td>
1612 <input type="text" id="requestQueueSize" style="width: 15em;">
1613 </td>
1614 </tr>
1615 <tr>
1616 <td>
1617 <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>
1618 </td>
1619 <td>
1620 <input type="text" id="dhtBootstrapNodes" placeholder="QBT_TR(Resets to default if empty)QBT_TR[CONTEXT=OptionsDialog]" style="width: 15em;">
1621 </td>
1622 </tr>
1623 <tr id="rowI2pInboundQuantity">
1624 <td>
1625 <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>
1626 </td>
1627 <td>
1628 <input id="i2pInboundQuantity" type="number" min="1" max="16" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1629 </td>
1630 </tr>
1631 <tr id="rowI2pOutboundQuantity">
1632 <td>
1633 <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>
1634 </td>
1635 <td>
1636 <input id="i2pOutboundQuantity" type="number" min="1" max="16" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1637 </td>
1638 </tr>
1639 <tr id="rowI2pInboundLength">
1640 <td>
1641 <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>
1642 </td>
1643 <td>
1644 <input id="i2pInboundLength" type="number" min="0" max="7" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1645 </td>
1646 </tr>
1647 <tr id="rowI2pOutboundLength">
1648 <td>
1649 <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>
1650 </td>
1651 <td>
1652 <input id="i2pOutboundLength" type="number" min="0" max="7" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
1653 </td>
1654 </tr>
1655 </tbody>
1656 </table>
1657 </fieldset>
1658 </div>
1660 <div style="text-align: center; margin-top: 1em;"><input type="button" value="QBT_TR(Save)QBT_TR[CONTEXT=HttpServer]" onclick="qBittorrent.Preferences.applyPreferences();"></div>
1662 <script>
1663 "use strict";
1665 window.qBittorrent ??= {};
1666 window.qBittorrent.Preferences ??= (() => {
1667 const exports = () => {
1668 return {
1669 setup: setup,
1670 numberInputLimiter: numberInputLimiter,
1671 updateFileLogEnabled: updateFileLogEnabled,
1672 updateFileLogBackupEnabled: updateFileLogBackupEnabled,
1673 updateFileLogDeleteEnabled: updateFileLogDeleteEnabled,
1674 updateTempDirEnabled: updateTempDirEnabled,
1675 updateExportDirEnabled: updateExportDirEnabled,
1676 updateExportDirFinEnabled: updateExportDirFinEnabled,
1677 addWatchFolder: addWatchFolder,
1678 updateExcludedFileNamesEnabled: updateExcludedFileNamesEnabled,
1679 changeWatchFolderSelect: changeWatchFolderSelect,
1680 updateMailNotification: updateMailNotification,
1681 updateMailAuthSettings: updateMailAuthSettings,
1682 sendTestEmail: sendTestEmail,
1683 updateAutoRun: updateAutoRun,
1684 updateAutoRunOnTorrentAdded: updateAutoRunOnTorrentAdded,
1685 generateRandomPort: generateRandomPort,
1686 updateMaxConnecEnabled: updateMaxConnecEnabled,
1687 updateMaxConnecPerTorrentEnabled: updateMaxConnecPerTorrentEnabled,
1688 updateMaxUploadsEnabled: updateMaxUploadsEnabled,
1689 updateMaxUploadsPerTorrentEnabled: updateMaxUploadsPerTorrentEnabled,
1690 updateI2PSettingsEnabled: updateI2PSettingsEnabled,
1691 updatePeerProxySettings: updatePeerProxySettings,
1692 updatePeerProxyAuthSettings: updatePeerProxyAuthSettings,
1693 updateFilterSettings: updateFilterSettings,
1694 updateSchedulingEnabled: updateSchedulingEnabled,
1695 updateQueueingSystem: updateQueueingSystem,
1696 updateSlowTorrentsSettings: updateSlowTorrentsSettings,
1697 updateMaxRatioTimeEnabled: updateMaxRatioTimeEnabled,
1698 updateAddTrackersEnabled: updateAddTrackersEnabled,
1699 updateHttpsSettings: updateHttpsSettings,
1700 updateBypasssAuthSettings: updateBypasssAuthSettings,
1701 updateAlternativeWebUISettings: updateAlternativeWebUISettings,
1702 updateHostHeaderValidationSettings: updateHostHeaderValidationSettings,
1703 updateWebUICustomHTTPHeadersSettings: updateWebUICustomHTTPHeadersSettings,
1704 updateWebUIReverseProxySettings: updateWebUIReverseProxySettings,
1705 updateDynDnsSettings: updateDynDnsSettings,
1706 updateWebuiLocaleSelect: updateWebuiLocaleSelect,
1707 registerDynDns: registerDynDns,
1708 applyPreferences: applyPreferences
1712 // Behavior tab
1713 const numberInputLimiter = (input) => {
1714 const min = input.getAttribute("min");
1715 const max = input.getAttribute("max");
1717 if (min && (input.value.toInt() < min.toInt()))
1718 input.value = min;
1720 if (max && (input.value.toInt() > max.toInt()))
1721 input.value = max;
1724 const updateFileLogEnabled = function() {
1725 const isFileLogEnabled = $("filelog_checkbox").checked;
1726 $("filelog_save_path_input").disabled = !isFileLogEnabled;
1727 $("filelog_backup_checkbox").disabled = !isFileLogEnabled;
1728 $("filelog_delete_old_checkbox").disabled = !isFileLogEnabled;
1730 updateFileLogBackupEnabled();
1731 updateFileLogDeleteEnabled();
1734 const updateFileLogBackupEnabled = function() {
1735 const pros = $("filelog_backup_checkbox").getProperties("disabled", "checked");
1736 $("filelog_max_size_input").disabled = pros.disabled || !pros.checked;
1739 const updateFileLogDeleteEnabled = function() {
1740 const pros = $("filelog_delete_old_checkbox").getProperties("disabled", "checked");
1741 $("filelog_age_input").disabled = pros.disabled || !pros.checked;
1742 $("filelog_age_type_select").disabled = pros.disabled || !pros.checked;
1745 // Downloads tab
1746 let watchedFoldersTable;
1748 const updateTempDirEnabled = function() {
1749 const isTempDirEnabled = $("temppath_checkbox").checked;
1750 $("temppath_text").disabled = !isTempDirEnabled;
1753 const changeWatchFolderSelect = (item) => {
1754 if (item.value === "other") {
1755 item.nextElementSibling.hidden = false;
1756 item.nextElementSibling.value = "QBT_TR(Type folder here)QBT_TR[CONTEXT=ScanFoldersModel]";
1757 item.nextElementSibling.select();
1759 else {
1760 item.nextElementSibling.hidden = true;
1761 const text = item.options[item.selectedIndex].textContent;
1762 item.nextElementSibling.value = text;
1766 const addWatchFolder = (folder = "", sel = "default_folder", other = "") => {
1767 const pos = $("watched_folders_tab").getChildren("tbody")[0].getChildren("tr").length;
1768 const myinput = "<input id='text_watch_" + pos + "' type='text' value='" + folder + "'>";
1769 const disableInput = (sel !== "other");
1770 const mycb = "<div class='select-watched-folder-editable'>"
1771 + "<select id ='cb_watch_" + pos + "' onchange='qBittorrent.Preferences.changeWatchFolderSelect(this)'>"
1772 + "<option value='watch_folder'>QBT_TR(Monitored folder)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
1773 + "<option value='default_folder'>QBT_TR(Default save location)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
1774 + "<option value='other'>QBT_TR(Other...)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
1775 + "</select>"
1776 + "<input id='cb_watch_txt_" + pos + "' type='text' " + (disableInput ? "hidden " : "") + "/>"
1777 + "<img src='images/list-add.svg' id='addFolderImg_" + pos + "' alt='Add' style='padding-left:170px;width:16px;cursor:pointer;' onclick='qBittorrent.Preferences.addWatchFolder();'>"
1778 + "</div>";
1780 watchedFoldersTable.push([myinput, mycb]);
1781 $("cb_watch_" + pos).value = sel;
1782 if (disableInput) {
1783 const elt = $("cb_watch_" + pos);
1784 other = elt.options[elt.selectedIndex].textContent;
1786 $("cb_watch_txt_" + pos).value = other;
1788 // hide previous img
1789 if (pos > 0)
1790 $("addFolderImg_" + (pos - 1)).style.display = "none";
1793 const getWatchedFolders = () => {
1794 const nb_folders = $("watched_folders_tab").getChildren("tbody")[0].getChildren("tr").length;
1795 const folders = new Hash();
1796 for (let i = 0; i < nb_folders; ++i) {
1797 const fpath = $("text_watch_" + i).value.trim();
1798 if (fpath.length > 0) {
1799 const sel = $("cb_watch_" + i).value.trim();
1801 let other;
1802 if (sel === "other")
1803 other = $("cb_watch_txt_" + i).value.trim();
1804 else
1805 other = (sel === "watch_folder") ? 0 : 1;
1807 folders.set(fpath, other);
1810 return folders;
1813 const updateExcludedFileNamesEnabled = function() {
1814 const isAExcludedFileNamesEnabled = $("excludedFileNamesCheckbox").checked;
1815 $("excludedFileNamesTextarea").disabled = !isAExcludedFileNamesEnabled;
1818 const updateExportDirEnabled = function() {
1819 const isExportDirEnabled = $("exportdir_checkbox").checked;
1820 $("exportdir_text").disabled = !isExportDirEnabled;
1823 const updateExportDirFinEnabled = function() {
1824 const isExportDirFinEnabled = $("exportdirfin_checkbox").checked;
1825 $("exportdirfin_text").disabled = !isExportDirFinEnabled;
1828 const updateMailNotification = function() {
1829 const isMailNotificationEnabled = $("mail_notification_checkbox").checked;
1830 $("src_email_txt").disabled = !isMailNotificationEnabled;
1831 $("dest_email_txt").disabled = !isMailNotificationEnabled;
1832 $("smtp_server_txt").disabled = !isMailNotificationEnabled;
1833 $("mail_ssl_checkbox").disabled = !isMailNotificationEnabled;
1834 $("mail_auth_checkbox").disabled = !isMailNotificationEnabled;
1835 $("mail_test_button").disabled = !isMailNotificationEnabled;
1837 if (!isMailNotificationEnabled) {
1838 $("mail_auth_checkbox").checked = !isMailNotificationEnabled;
1839 updateMailAuthSettings();
1843 const updateMailAuthSettings = function() {
1844 const isMailAuthEnabled = $("mail_auth_checkbox").checked;
1845 $("mail_username_text").disabled = !isMailAuthEnabled;
1846 $("mail_password_text").disabled = !isMailAuthEnabled;
1849 const sendTestEmail = function() {
1850 new Request({
1851 url: "api/v2/app/sendTestEmail",
1852 method: "post",
1853 onFailure: function() {
1854 alert("QBT_TR(Could not contact qBittorrent)QBT_TR[CONTEXT=HttpServer]");
1856 onSuccess: function() {
1857 alert("QBT_TR(Attempted to send email. Check your inbox to confirm success)QBT_TR[CONTEXT=OptionsDialog]");
1859 }).send();
1862 const updateAutoRunOnTorrentAdded = function() {
1863 const isAutoRunOnTorrentAddedEnabled = $("autorunOnTorrentAddedCheckbox").checked;
1864 $("autorunOnTorrentAddedProgram").disabled = !isAutoRunOnTorrentAddedEnabled;
1867 const updateAutoRun = function() {
1868 const isAutoRunEnabled = $("autorun_checkbox").checked;
1869 $("autorunProg_txt").disabled = !isAutoRunEnabled;
1872 // Connection tab
1874 const updateMaxConnecEnabled = function() {
1875 const isMaxConnecEnabled = $("max_connec_checkbox").checked;
1876 $("max_connec_value").disabled = !isMaxConnecEnabled;
1879 const updateMaxConnecPerTorrentEnabled = function() {
1880 const isMaxConnecPerTorrentEnabled = $("max_connec_per_torrent_checkbox").checked;
1881 $("max_connec_per_torrent_value").disabled = !isMaxConnecPerTorrentEnabled;
1884 const updateMaxUploadsEnabled = function() {
1885 const isMaxUploadsEnabled = $("max_uploads_checkbox").checked;
1886 $("max_uploads_value").disabled = !isMaxUploadsEnabled;
1889 const updateMaxUploadsPerTorrentEnabled = function() {
1890 const isMaxUploadsPerTorrentEnabled = $("max_uploads_per_torrent_checkbox").checked;
1891 $("max_uploads_per_torrent_value").disabled = !isMaxUploadsPerTorrentEnabled;
1894 const updateI2PSettingsEnabled = function() {
1895 const isI2PEnabled = $("i2pEnabledCheckbox").checked;
1896 $("i2pAddress").disabled = !isI2PEnabled;
1897 $("i2pPort").disabled = !isI2PEnabled;
1898 $("i2pMixedMode").disabled = !isI2PEnabled;
1901 const updatePeerProxySettings = function() {
1902 const proxyType = $("peer_proxy_type_select").value;
1903 const isProxyDisabled = (proxyType === "None");
1904 const isProxySocks4 = (proxyType === "SOCKS4");
1906 $("peer_proxy_host_text").disabled = isProxyDisabled;
1907 $("peer_proxy_port_value").disabled = isProxyDisabled;
1909 $("peer_proxy_auth_checkbox").disabled = (isProxyDisabled || isProxySocks4);
1910 $("proxy_bittorrent_checkbox").disabled = isProxyDisabled;
1911 $("use_peer_proxy_checkbox").disabled = (isProxyDisabled || !$("proxy_bittorrent_checkbox").checked);
1912 $("proxyHostnameLookupCheckbox").disabled = (isProxyDisabled || isProxySocks4);
1913 $("proxy_rss_checkbox").disabled = (isProxyDisabled || isProxySocks4);
1914 $("proxy_misc_checkbox").disabled = (isProxyDisabled || isProxySocks4);
1916 updatePeerProxyAuthSettings();
1919 const updatePeerProxyAuthSettings = function() {
1920 const proxyType = $("peer_proxy_type_select").value;
1921 const isProxyDisabled = (proxyType === "None");
1922 const isPeerProxyAuthEnabled = (!$("peer_proxy_auth_checkbox").disabled && $("peer_proxy_auth_checkbox").checked);
1923 $("peer_proxy_username_text").disabled = (isProxyDisabled || !isPeerProxyAuthEnabled);
1924 $("peer_proxy_password_text").disabled = (isProxyDisabled || !isPeerProxyAuthEnabled);
1927 const updateFilterSettings = function() {
1928 const isIPFilterEnabled = $("ipfilter_text_checkbox").checked;
1929 $("ipfilter_text").disabled = !isIPFilterEnabled;
1932 // Speed tab
1933 const updateSchedulingEnabled = function() {
1934 const isLimitSchedulingEnabled = $("limitSchedulingCheckbox").checked;
1935 $("schedule_from_hour").disabled = !isLimitSchedulingEnabled;
1936 $("schedule_from_min").disabled = !isLimitSchedulingEnabled;
1937 $("schedule_to_hour").disabled = !isLimitSchedulingEnabled;
1938 $("schedule_to_min").disabled = !isLimitSchedulingEnabled;
1939 $("schedule_freq_select").disabled = !isLimitSchedulingEnabled;
1942 // Bittorrent tab
1943 const updateQueueingSystem = function() {
1944 const isQueueingEnabled = $("queueing_checkbox").checked;
1945 $("max_active_dl_value").disabled = !isQueueingEnabled;
1946 $("max_active_up_value").disabled = !isQueueingEnabled;
1947 $("max_active_to_value").disabled = !isQueueingEnabled;
1948 $("dont_count_slow_torrents_checkbox").disabled = !isQueueingEnabled;
1949 updateSlowTorrentsSettings();
1952 const updateSlowTorrentsSettings = function() {
1953 const isDontCountSlowTorrentsEnabled = (!$("dont_count_slow_torrents_checkbox").disabled) && $("dont_count_slow_torrents_checkbox").checked;
1954 $("dl_rate_threshold").disabled = !isDontCountSlowTorrentsEnabled;
1955 $("ul_rate_threshold").disabled = !isDontCountSlowTorrentsEnabled;
1956 $("torrent_inactive_timer").disabled = !isDontCountSlowTorrentsEnabled;
1959 const updateMaxRatioTimeEnabled = function() {
1960 const isMaxRatioEnabled = $("max_ratio_checkbox").checked;
1961 $("max_ratio_value").disabled = !isMaxRatioEnabled;
1963 const isMaxSeedingTimeEnabled = $("max_seeding_time_checkbox").checked;
1964 $("max_seeding_time_value").disabled = !isMaxSeedingTimeEnabled;
1966 const isMaxInactiveSeedingTimeEnabled = $("max_inactive_seeding_time_checkbox").checked;
1967 $("max_inactive_seeding_time_value").disabled = !isMaxInactiveSeedingTimeEnabled;
1969 $("max_ratio_act").disabled = !(isMaxRatioEnabled || isMaxSeedingTimeEnabled || isMaxInactiveSeedingTimeEnabled);
1972 const updateAddTrackersEnabled = function() {
1973 const isAddTrackersEnabled = $("add_trackers_checkbox").checked;
1974 $("add_trackers_textarea").disabled = !isAddTrackersEnabled;
1977 // WebUI tab
1978 const updateHttpsSettings = function() {
1979 const isUseHttpsEnabled = $("use_https_checkbox").checked;
1980 $("ssl_cert_text").disabled = !isUseHttpsEnabled;
1981 $("ssl_key_text").disabled = !isUseHttpsEnabled;
1984 const updateBypasssAuthSettings = function() {
1985 const isBypassAuthSubnetWhitelistEnabled = $("bypass_auth_subnet_whitelist_checkbox").checked;
1986 $("bypass_auth_subnet_whitelist_textarea").disabled = !isBypassAuthSubnetWhitelistEnabled;
1989 const updateAlternativeWebUISettings = function() {
1990 const isUseAlternativeWebUIEnabled = $("use_alt_webui_checkbox").checked;
1991 $("webui_files_location_textarea").disabled = !isUseAlternativeWebUIEnabled;
1994 const updateHostHeaderValidationSettings = function() {
1995 const isHostHeaderValidationEnabled = $("host_header_validation_checkbox").checked;
1996 $("webui_domain_textarea").disabled = !isHostHeaderValidationEnabled;
1999 const updateWebUICustomHTTPHeadersSettings = function() {
2000 const isEnabled = $("webUIUseCustomHTTPHeadersCheckbox").checked;
2001 $("webUICustomHTTPHeadersTextarea").disabled = !isEnabled;
2004 const updateWebUIReverseProxySettings = function() {
2005 const isEnabled = $("webUIReverseProxySupportCheckbox").checked;
2006 $("webUIReverseProxiesListTextarea").disabled = !isEnabled;
2009 const updateDynDnsSettings = function() {
2010 const isDynDnsEnabled = $("use_dyndns_checkbox").checked;
2011 $("dyndns_select").disabled = !isDynDnsEnabled;
2012 $("dyndns_domain_text").disabled = !isDynDnsEnabled;
2013 $("dyndns_username_text").disabled = !isDynDnsEnabled;
2014 $("dyndns_password_text").disabled = !isDynDnsEnabled;
2017 const registerDynDns = function() {
2018 if ($("dyndns_select").value.toInt() === 1)
2019 window.open("http://www.no-ip.com/services/managed_dns/free_dynamic_dns.html", "NO-IP Registration");
2020 else
2021 window.open("https://www.dyndns.com/account/services/hosts/add.html", "DynDNS Registration");
2024 const generateRandomPort = function() {
2025 const min = 1024;
2026 const max = 65535;
2027 const port = Math.floor(Math.random() * (max - min + 1) + min);
2028 $("port_value").value = port;
2031 const time_padding = function(val) {
2032 let ret = val.toString();
2033 if (ret.length === 1)
2034 ret = "0" + ret;
2035 return ret;
2038 // Advanced Tab
2039 const updateNetworkInterfaces = function(default_iface, default_iface_name) {
2040 const url = "api/v2/app/networkInterfaceList";
2041 $("networkInterface").getChildren().each(c => c.destroy());
2042 new Request.JSON({
2043 url: url,
2044 method: "get",
2045 noCache: true,
2046 onFailure: function() {
2047 alert("Could not contact qBittorrent");
2049 onSuccess: function(ifaces) {
2050 if (!Array.isArray(ifaces))
2051 return;
2053 // add the current network interface to the options if needed
2054 if (default_iface && !ifaces.some((item) => item.value === default_iface))
2055 ifaces.push({ name: default_iface_name || default_iface, value: default_iface });
2057 $("networkInterface").options.add(new Option("QBT_TR(Any interface)QBT_TR[CONTEXT=OptionsDialog]", ""));
2058 ifaces.forEach((item, index) => {
2059 $("networkInterface").options.add(new Option(item.name, item.value));
2061 $("networkInterface").value = default_iface;
2063 }).send();
2066 const updateInterfaceAddresses = function(iface, default_addr) {
2067 const url = "api/v2/app/networkInterfaceAddressList";
2068 $("optionalIPAddressToBind").getChildren().each(c => c.destroy());
2069 new Request.JSON({
2070 url: url,
2071 method: "get",
2072 noCache: true,
2073 data: {
2074 "iface": iface
2076 onFailure: function() {
2077 alert("Could not contact qBittorrent");
2079 onSuccess: function(addresses) {
2080 if (!addresses)
2081 return;
2083 $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All addresses)QBT_TR[CONTEXT=OptionDialog]", ""));
2084 $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All IPv4 addresses)QBT_TR[CONTEXT=OptionDialog]", "0.0.0.0"));
2085 $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All IPv6 addresses)QBT_TR[CONTEXT=OptionDialog]", "::"));
2086 addresses.forEach((item, index) => {
2087 $("optionalIPAddressToBind").options.add(new Option(item, item));
2089 $("optionalIPAddressToBind").value = default_addr;
2091 }).send();
2094 const updateWebuiLocaleSelect = (selected) => {
2095 const languages = [];
2096 for (let i = 0; i < $("locale_select").options.length; i++)
2097 languages.push($("locale_select").options[i].value);
2099 if (!languages.includes(selected)) {
2100 const lang = selected.slice(0, selected.indexOf("_"));
2101 selected = languages.includes(lang) ? lang : "en";
2103 $("locale_select").value = selected;
2106 const loadPreferences = function() {
2107 window.parent.qBittorrent.Cache.preferences.init({
2108 onSuccess: (pref) => {
2109 // Behavior tab
2110 document.getElementById("displayFullURLTrackerColumn").checked = (LocalPreferences.get("full_url_tracker_column", "false") === "true");
2111 document.getElementById("hideZeroFiltersCheckbox").checked = (LocalPreferences.get("hide_zero_status_filters", "false") === "true");
2112 $("dblclickDownloadSelect").value = LocalPreferences.get("dblclick_download", "1");
2113 $("dblclickCompleteSelect").value = LocalPreferences.get("dblclick_complete", "1");
2114 document.getElementById("confirmTorrentDeletion").checked = pref.confirm_torrent_deletion;
2115 document.getElementById("useAltRowColorsInput").checked = (LocalPreferences.get("use_alt_row_colors", "true") === "true");
2116 $("filelog_checkbox").checked = pref.file_log_enabled;
2117 $("filelog_save_path_input").value = pref.file_log_path;
2118 $("filelog_backup_checkbox").checked = pref.file_log_backup_enabled;
2119 $("filelog_max_size_input").value = pref.file_log_max_size;
2120 $("filelog_delete_old_checkbox").checked = pref.file_log_delete_old;
2121 $("filelog_age_input").value = pref.file_log_age;
2122 $("filelog_age_type_select").value = pref.file_log_age_type;
2123 updateFileLogEnabled();
2125 // Downloads tab
2126 // When adding a torrent
2127 let index = 0;
2128 switch (pref.torrent_content_layout) {
2129 case "Original":
2130 index = 0;
2131 break;
2132 case "Subfolder":
2133 index = 1;
2134 break;
2135 case "NoSubfolder":
2136 index = 2;
2137 break;
2139 $("contentlayout_select").getChildren("option")[index].selected = true;
2140 $("addToTopOfQueueCheckbox").checked = pref.add_to_top_of_queue;
2141 $("dontstartdownloads_checkbox").checked = pref.add_stopped_enabled;
2142 switch (pref.torrent_stop_condition) {
2143 case "None":
2144 index = 0;
2145 break;
2146 case "MetadataReceived":
2147 index = 1;
2148 break;
2149 case "FilesChecked":
2150 index = 2;
2151 break;
2153 $("stopConditionSelect").getChildren("option")[index].selected = true;
2154 document.getElementById("mergeTrackersInput").checked = pref.merge_trackers;
2155 $("deletetorrentfileafter_checkbox").checked = pref.auto_delete_mode;
2157 $("preallocateall_checkbox").checked = pref.preallocate_all;
2158 $("appendext_checkbox").checked = pref.incomplete_files_ext;
2159 $("unwantedfolder_checkbox").checked = pref.use_unwanted_folder;
2161 // Saving Management
2162 $("default_tmm_combobox").value = pref.auto_tmm_enabled;
2163 $("torrent_changed_tmm_combobox").value = pref.torrent_changed_tmm_enabled;
2164 $("save_path_changed_tmm_combobox").value = pref.save_path_changed_tmm_enabled;
2165 $("category_changed_tmm_combobox").value = pref.category_changed_tmm_enabled;
2166 $("use_subcategories_checkbox").checked = pref.use_subcategories;
2167 document.getElementById("categoryPathsManualModeCheckbox").checked = pref.use_category_paths_in_manual_mode;
2168 $("savepath_text").value = pref.save_path;
2169 $("temppath_checkbox").checked = pref.temp_path_enabled;
2170 $("temppath_text").value = pref.temp_path;
2171 updateTempDirEnabled();
2172 if (pref.export_dir !== "") {
2173 $("exportdir_checkbox").checked = true;
2174 $("exportdir_text").value = pref.export_dir;
2176 else {
2177 $("exportdir_checkbox").checked = false;
2178 $("exportdir_text").value = "";
2180 updateExportDirEnabled();
2181 if (pref.export_dir_fin !== "") {
2182 $("exportdirfin_checkbox").checked = true;
2183 $("exportdirfin_text").value = pref.export_dir_fin;
2185 else {
2186 $("exportdirfin_checkbox").checked = false;
2187 $("exportdirfin_text").value = "";
2189 updateExportDirFinEnabled();
2191 // Automatically add torrents from
2192 for (const folder in pref.scan_dirs) {
2193 if (!Object.hasOwn(pref.scan_dirs, folder))
2194 continue;
2196 const folderType = pref.scan_dirs[folder];
2197 let sel = "";
2198 let other = "";
2199 if (typeof folderType === "number") {
2200 sel = (folderType === 0) ? "watch_folder" : "default_folder";
2202 else {
2203 sel = "other";
2204 other = folderType;
2206 addWatchFolder(folder, sel, other);
2208 addWatchFolder();
2210 // Excluded file names
2211 $("excludedFileNamesCheckbox").checked = pref.excluded_file_names_enabled;
2212 $("excludedFileNamesTextarea").value = pref.excluded_file_names;
2214 // Email notification upon download completion
2215 $("mail_notification_checkbox").checked = pref.mail_notification_enabled;
2216 $("src_email_txt").value = pref.mail_notification_sender;
2217 $("dest_email_txt").value = pref.mail_notification_email;
2218 $("smtp_server_txt").value = pref.mail_notification_smtp;
2219 $("mail_ssl_checkbox").checked = pref.mail_notification_ssl_enabled;
2220 $("mail_auth_checkbox").checked = pref.mail_notification_auth_enabled;
2221 $("mail_username_text").value = pref.mail_notification_username;
2222 $("mail_password_text").value = pref.mail_notification_password;
2223 updateMailNotification();
2224 updateMailAuthSettings();
2226 // Run an external program on torrent added
2227 $("autorunOnTorrentAddedCheckbox").checked = pref.autorun_on_torrent_added_enabled;
2228 $("autorunOnTorrentAddedProgram").value = pref.autorun_on_torrent_added_program;
2229 updateAutoRunOnTorrentAdded();
2230 // Run an external program on torrent finished
2231 $("autorun_checkbox").checked = pref.autorun_enabled;
2232 $("autorunProg_txt").value = pref.autorun_program;
2233 updateAutoRun();
2235 // Connection tab
2236 // Listening Port
2237 $("port_value").value = pref.listen_port.toInt();
2238 $("upnp_checkbox").checked = pref.upnp;
2240 // Connections Limits
2241 const max_connec = pref.max_connec.toInt();
2242 if (max_connec <= 0) {
2243 $("max_connec_checkbox").checked = false;
2244 $("max_connec_value").value = 500;
2246 else {
2247 $("max_connec_checkbox").checked = true;
2248 $("max_connec_value").value = max_connec;
2250 updateMaxConnecEnabled();
2251 const max_connec_per_torrent = pref.max_connec_per_torrent.toInt();
2252 if (max_connec_per_torrent <= 0) {
2253 $("max_connec_per_torrent_checkbox").checked = false;
2254 $("max_connec_per_torrent_value").value = 100;
2256 else {
2257 $("max_connec_per_torrent_checkbox").checked = true;
2258 $("max_connec_per_torrent_value").value = max_connec_per_torrent;
2260 updateMaxConnecPerTorrentEnabled();
2261 const max_uploads = pref.max_uploads.toInt();
2262 if (max_uploads <= 0) {
2263 $("max_uploads_checkbox").checked = false;
2264 $("max_uploads_value").value = 8;
2266 else {
2267 $("max_uploads_checkbox").checked = true;
2268 $("max_uploads_value").value = max_uploads;
2270 updateMaxUploadsEnabled();
2271 const max_uploads_per_torrent = pref.max_uploads_per_torrent.toInt();
2272 if (max_uploads_per_torrent <= 0) {
2273 $("max_uploads_per_torrent_checkbox").checked = false;
2274 $("max_uploads_per_torrent_value").value = 4;
2276 else {
2277 $("max_uploads_per_torrent_checkbox").checked = true;
2278 $("max_uploads_per_torrent_value").value = max_uploads_per_torrent;
2280 updateMaxUploadsPerTorrentEnabled();
2282 // I2P
2283 $("i2pEnabledCheckbox").checked = pref.i2p_enabled;
2284 $("i2pAddress").value = pref.i2p_address;
2285 $("i2pPort").value = pref.i2p_port;
2286 $("i2pMixedMode").checked = pref.i2p_mixed_mode;
2287 updateI2PSettingsEnabled();
2289 // Proxy Server
2290 $("peer_proxy_type_select").value = pref.proxy_type;
2291 $("peer_proxy_host_text").value = pref.proxy_ip;
2292 $("peer_proxy_port_value").value = pref.proxy_port;
2293 $("peer_proxy_auth_checkbox").checked = pref.proxy_auth_enabled;
2294 $("peer_proxy_username_text").value = pref.proxy_username;
2295 $("peer_proxy_password_text").value = pref.proxy_password;
2296 $("proxyHostnameLookupCheckbox").checked = pref.proxy_hostname_lookup;
2297 $("proxy_bittorrent_checkbox").checked = pref.proxy_bittorrent;
2298 $("use_peer_proxy_checkbox").checked = pref.proxy_peer_connections;
2299 $("proxy_rss_checkbox").checked = pref.proxy_rss;
2300 $("proxy_misc_checkbox").checked = pref.proxy_misc;
2301 updatePeerProxySettings();
2303 // IP Filtering
2304 $("ipfilter_text_checkbox").checked = pref.ip_filter_enabled;
2305 $("ipfilter_text").value = pref.ip_filter_path;
2306 $("ipfilter_trackers_checkbox").checked = pref.ip_filter_trackers;
2307 $("banned_IPs_textarea").value = pref.banned_IPs;
2308 updateFilterSettings();
2310 // Speed tab
2311 // Global Rate Limits
2312 $("up_limit_value").value = (pref.up_limit.toInt() / 1024);
2313 $("dl_limit_value").value = (pref.dl_limit.toInt() / 1024);
2314 // Alternative Global Rate Limits
2315 $("alt_up_limit_value").value = (pref.alt_up_limit.toInt() / 1024);
2316 $("alt_dl_limit_value").value = (pref.alt_dl_limit.toInt() / 1024);
2318 $("enable_protocol_combobox").value = pref.bittorrent_protocol;
2319 $("limit_utp_rate_checkbox").checked = pref.limit_utp_rate;
2320 $("limit_tcp_overhead_checkbox").checked = pref.limit_tcp_overhead;
2321 $("limit_lan_peers_checkbox").checked = pref.limit_lan_peers;
2323 // Scheduling
2324 $("limitSchedulingCheckbox").checked = pref.scheduler_enabled;
2325 $("schedule_from_hour").value = time_padding(pref.schedule_from_hour);
2326 $("schedule_from_min").value = time_padding(pref.schedule_from_min);
2327 $("schedule_to_hour").value = time_padding(pref.schedule_to_hour);
2328 $("schedule_to_min").value = time_padding(pref.schedule_to_min);
2329 $("schedule_freq_select").value = pref.scheduler_days;
2330 updateSchedulingEnabled();
2332 // Bittorrent tab
2333 // Privacy
2334 $("dht_checkbox").checked = pref.dht;
2335 $("pex_checkbox").checked = pref.pex;
2336 $("lsd_checkbox").checked = pref.lsd;
2337 const encryption = pref.encryption.toInt();
2338 $("encryption_select").getChildren("option")[encryption].selected = true;
2339 $("anonymous_mode_checkbox").checked = pref.anonymous_mode;
2341 $("maxActiveCheckingTorrents").value = pref.max_active_checking_torrents;
2343 // Torrent Queueing
2344 $("queueing_checkbox").checked = pref.queueing_enabled;
2345 $("max_active_dl_value").value = pref.max_active_downloads.toInt();
2346 $("max_active_up_value").value = pref.max_active_uploads.toInt();
2347 $("max_active_to_value").value = pref.max_active_torrents.toInt();
2348 $("dont_count_slow_torrents_checkbox").checked = pref.dont_count_slow_torrents;
2349 $("dl_rate_threshold").value = pref.slow_torrent_dl_rate_threshold.toInt();
2350 $("ul_rate_threshold").value = pref.slow_torrent_ul_rate_threshold.toInt();
2351 $("torrent_inactive_timer").value = pref.slow_torrent_inactive_timer.toInt();
2352 updateQueueingSystem();
2354 // Share Limiting
2355 $("max_ratio_checkbox").checked = pref.max_ratio_enabled;
2356 $("max_ratio_value").value = (pref.max_ratio_enabled ? pref.max_ratio : 1);
2357 $("max_seeding_time_checkbox").checked = pref.max_seeding_time_enabled;
2358 $("max_seeding_time_value").value = (pref.max_seeding_time_enabled ? pref.max_seeding_time.toInt() : 1440);
2359 $("max_inactive_seeding_time_checkbox").checked = pref.max_inactive_seeding_time_enabled;
2360 $("max_inactive_seeding_time_value").value = (pref.max_inactive_seeding_time_enabled ? pref.max_inactive_seeding_time.toInt() : 1440);
2361 let maxRatioAct = 0;
2362 switch (pref.max_ratio_act.toInt()) {
2363 case 0: // Stop
2364 default:
2365 maxRatioAct = 0;
2366 break;
2367 case 1: // Remove
2368 maxRatioAct = 1;
2369 break;
2370 case 2: // Enable super seeding
2371 maxRatioAct = 3;
2372 break;
2373 case 3: // Remove torrent and files
2374 maxRatioAct = 2;
2375 break;
2377 $("max_ratio_act").getChildren("option")[maxRatioAct].selected = true;
2378 updateMaxRatioTimeEnabled();
2380 // Add trackers
2381 $("add_trackers_checkbox").checked = pref.add_trackers_enabled;
2382 $("add_trackers_textarea").value = pref.add_trackers;
2383 updateAddTrackersEnabled();
2385 // RSS Tab
2386 $("enable_fetching_rss_feeds_checkbox").checked = pref.rss_processing_enabled;
2387 $("feed_refresh_interval").value = pref.rss_refresh_interval;
2388 $("feedFetchDelay").value = pref.rss_fetch_delay;
2389 $("maximum_article_number").value = pref.rss_max_articles_per_feed;
2390 $("enable_auto_downloading_rss_torrents_checkbox").checked = pref.rss_auto_downloading_enabled;
2391 $("downlock_repack_proper_episodes").checked = pref.rss_download_repack_proper_episodes;
2392 $("rss_filter_textarea").value = pref.rss_smart_episode_filters;
2394 // WebUI tab
2395 // Language
2396 updateWebuiLocaleSelect(pref.locale);
2397 $("performanceWarning").checked = pref.performance_warning;
2399 // HTTP Server
2400 $("webui_domain_textarea").value = pref.web_ui_domain_list;
2401 $("webui_address_value").value = pref.web_ui_address;
2402 $("webui_port_value").value = pref.web_ui_port;
2403 $("webui_upnp_checkbox").checked = pref.web_ui_upnp;
2404 $("use_https_checkbox").checked = pref.use_https;
2405 $("ssl_cert_text").value = pref.web_ui_https_cert_path;
2406 $("ssl_key_text").value = pref.web_ui_https_key_path;
2407 updateHttpsSettings();
2409 // Authentication
2410 $("webui_username_text").value = pref.web_ui_username;
2411 $("bypass_local_auth_checkbox").checked = pref.bypass_local_auth;
2412 $("bypass_auth_subnet_whitelist_checkbox").checked = pref.bypass_auth_subnet_whitelist_enabled;
2413 $("bypass_auth_subnet_whitelist_textarea").value = pref.bypass_auth_subnet_whitelist;
2414 updateBypasssAuthSettings();
2415 $("webUIMaxAuthFailCountInput").value = pref.web_ui_max_auth_fail_count.toInt();
2416 $("webUIBanDurationInput").value = pref.web_ui_ban_duration.toInt();
2417 $("webUISessionTimeoutInput").value = pref.web_ui_session_timeout.toInt();
2419 // Use alternative WebUI
2420 $("use_alt_webui_checkbox").checked = pref.alternative_webui_enabled;
2421 $("webui_files_location_textarea").value = pref.alternative_webui_path;
2422 updateAlternativeWebUISettings();
2424 // Security
2425 $("clickjacking_protection_checkbox").checked = pref.web_ui_clickjacking_protection_enabled;
2426 $("csrf_protection_checkbox").checked = pref.web_ui_csrf_protection_enabled;
2427 $("secureCookieCheckbox").checked = pref.web_ui_secure_cookie_enabled;
2428 $("host_header_validation_checkbox").checked = pref.web_ui_host_header_validation_enabled;
2429 updateHostHeaderValidationSettings();
2431 // Custom HTTP headers
2432 $("webUIUseCustomHTTPHeadersCheckbox").checked = pref.web_ui_use_custom_http_headers_enabled;
2433 $("webUICustomHTTPHeadersTextarea").value = pref.web_ui_custom_http_headers;
2434 updateWebUICustomHTTPHeadersSettings();
2436 // Reverse Proxy
2437 $("webUIReverseProxySupportCheckbox").checked = pref.web_ui_reverse_proxy_enabled;
2438 $("webUIReverseProxiesListTextarea").value = pref.web_ui_reverse_proxies_list;
2439 updateWebUIReverseProxySettings();
2441 // Update my dynamic domain name
2442 $("use_dyndns_checkbox").checked = pref.dyndns_enabled;
2443 $("dyndns_select").value = pref.dyndns_service;
2444 $("dyndns_domain_text").value = pref.dyndns_domain;
2445 $("dyndns_username_text").value = pref.dyndns_username;
2446 $("dyndns_password_text").value = pref.dyndns_password;
2447 updateDynDnsSettings();
2449 // Advanced settings
2450 // qBittorrent section
2451 $("resumeDataStorageType").value = pref.resume_data_storage_type;
2452 $("torrentContentRemoveOption").value = pref.torrent_content_remove_option;
2453 $("memoryWorkingSetLimit").value = pref.memory_working_set_limit;
2454 updateNetworkInterfaces(pref.current_network_interface, pref.current_interface_name);
2455 updateInterfaceAddresses(pref.current_network_interface, pref.current_interface_address);
2456 $("saveResumeDataInterval").value = pref.save_resume_data_interval;
2457 $("torrentFileSizeLimit").value = (pref.torrent_file_size_limit / 1024 / 1024);
2458 $("recheckTorrentsOnCompletion").checked = pref.recheck_completed_torrents;
2459 $("appInstanceName").value = pref.app_instance_name;
2460 $("refreshInterval").value = pref.refresh_interval;
2461 $("resolvePeerCountries").checked = pref.resolve_peer_countries;
2462 $("reannounceWhenAddressChanged").checked = pref.reannounce_when_address_changed;
2463 // libtorrent section
2464 $("bdecodeDepthLimit").value = pref.bdecode_depth_limit;
2465 $("bdecodeTokenLimit").value = pref.bdecode_token_limit;
2466 $("asyncIOThreads").value = pref.async_io_threads;
2467 $("hashingThreads").value = pref.hashing_threads;
2468 $("filePoolSize").value = pref.file_pool_size;
2469 $("outstandMemoryWhenCheckingTorrents").value = pref.checking_memory_use;
2470 $("diskCache").value = pref.disk_cache;
2471 $("diskCacheExpiryInterval").value = pref.disk_cache_ttl;
2472 $("diskQueueSize").value = (pref.disk_queue_size / 1024);
2473 $("diskIOType").value = pref.disk_io_type;
2474 $("diskIOReadMode").value = pref.disk_io_read_mode;
2475 $("diskIOWriteMode").value = pref.disk_io_write_mode;
2476 $("coalesceReadsAndWrites").checked = pref.enable_coalesce_read_write;
2477 $("pieceExtentAffinity").checked = pref.enable_piece_extent_affinity;
2478 $("sendUploadPieceSuggestions").checked = pref.enable_upload_suggestions;
2479 $("sendBufferWatermark").value = pref.send_buffer_watermark;
2480 $("sendBufferLowWatermark").value = pref.send_buffer_low_watermark;
2481 $("sendBufferWatermarkFactor").value = pref.send_buffer_watermark_factor;
2482 $("connectionSpeed").value = pref.connection_speed;
2483 $("socketSendBufferSize").value = (pref.socket_send_buffer_size / 1024);
2484 $("socketReceiveBufferSize").value = (pref.socket_receive_buffer_size / 1024);
2485 $("socketBacklogSize").value = pref.socket_backlog_size;
2486 $("outgoingPortsMin").value = pref.outgoing_ports_min;
2487 $("outgoingPortsMax").value = pref.outgoing_ports_max;
2488 $("UPnPLeaseDuration").value = pref.upnp_lease_duration;
2489 $("peerToS").value = pref.peer_tos;
2490 $("utpTCPMixedModeAlgorithm").value = pref.utp_tcp_mixed_mode;
2491 $("IDNSupportCheckbox").checked = pref.idn_support_enabled;
2492 $("allowMultipleConnectionsFromTheSameIPAddress").checked = pref.enable_multi_connections_from_same_ip;
2493 $("validateHTTPSTrackerCertificate").checked = pref.validate_https_tracker_certificate;
2494 $("mitigateSSRF").checked = pref.ssrf_mitigation;
2495 $("blockPeersOnPrivilegedPorts").checked = pref.block_peers_on_privileged_ports;
2496 $("enableEmbeddedTracker").checked = pref.enable_embedded_tracker;
2497 $("embeddedTrackerPort").value = pref.embedded_tracker_port;
2498 $("embeddedTrackerPortForwarding").checked = pref.embedded_tracker_port_forwarding;
2499 $("markOfTheWeb").checked = pref.mark_of_the_web;
2500 $("pythonExecutablePath").value = pref.python_executable_path;
2501 $("uploadSlotsBehavior").value = pref.upload_slots_behavior;
2502 $("uploadChokingAlgorithm").value = pref.upload_choking_algorithm;
2503 $("announceAllTrackers").checked = pref.announce_to_all_trackers;
2504 $("announceAllTiers").checked = pref.announce_to_all_tiers;
2505 $("announceIP").value = pref.announce_ip;
2506 $("maxConcurrentHTTPAnnounces").value = pref.max_concurrent_http_announces;
2507 $("stopTrackerTimeout").value = pref.stop_tracker_timeout;
2508 $("peerTurnover").value = pref.peer_turnover;
2509 $("peerTurnoverCutoff").value = pref.peer_turnover_cutoff;
2510 $("peerTurnoverInterval").value = pref.peer_turnover_interval;
2511 $("requestQueueSize").value = pref.request_queue_size;
2512 $("dhtBootstrapNodes").value = pref.dht_bootstrap_nodes;
2513 $("i2pInboundQuantity").value = pref.i2p_inbound_quantity;
2514 $("i2pOutboundQuantity").value = pref.i2p_outbound_quantity;
2515 $("i2pInboundLength").value = pref.i2p_inbound_length;
2516 $("i2pOutboundLength").value = pref.i2p_outbound_length;
2521 const applyPreferences = function() {
2522 const settings = {};
2523 // Validate form data
2525 // Behavior tab
2526 LocalPreferences.set("full_url_tracker_column", document.getElementById("displayFullURLTrackerColumn").checked.toString());
2527 LocalPreferences.set("hide_zero_status_filters", document.getElementById("hideZeroFiltersCheckbox").checked.toString());
2528 LocalPreferences.set("dblclick_download", $("dblclickDownloadSelect").value);
2529 LocalPreferences.set("dblclick_complete", $("dblclickCompleteSelect").value);
2530 settings["confirm_torrent_deletion"] = document.getElementById("confirmTorrentDeletion").checked;
2531 LocalPreferences.set("use_alt_row_colors", document.getElementById("useAltRowColorsInput").checked.toString());
2532 settings["file_log_enabled"] = $("filelog_checkbox").checked;
2533 settings["file_log_path"] = $("filelog_save_path_input").value;
2534 settings["file_log_backup_enabled"] = $("filelog_backup_checkbox").checked;
2535 settings["file_log_max_size"] = Number($("filelog_max_size_input").value);
2536 settings["file_log_delete_old"] = $("filelog_delete_old_checkbox").checked;
2537 settings["file_log_age"] = Number($("filelog_age_input").value);
2538 settings["file_log_age_type"] = Number($("filelog_age_type_select").value);
2540 // Downloads tab
2541 // When adding a torrent
2542 settings["torrent_content_layout"] = $("contentlayout_select").getSelected()[0].value;
2543 settings["add_to_top_of_queue"] = $("addToTopOfQueueCheckbox").checked;
2544 settings["add_stopped_enabled"] = $("dontstartdownloads_checkbox").checked;
2545 settings["torrent_stop_condition"] = $("stopConditionSelect").getSelected()[0].value;
2546 settings["merge_trackers"] = document.getElementById("mergeTrackersInput").checked;
2547 settings["auto_delete_mode"] = Number($("deletetorrentfileafter_checkbox").checked);
2549 settings["preallocate_all"] = $("preallocateall_checkbox").checked;
2550 settings["incomplete_files_ext"] = $("appendext_checkbox").checked;
2551 settings["use_unwanted_folder"] = $("unwantedfolder_checkbox").checked;
2553 // Saving Management
2554 settings["auto_tmm_enabled"] = ($("default_tmm_combobox").value === "true");
2555 settings["torrent_changed_tmm_enabled"] = ($("torrent_changed_tmm_combobox").value === "true");
2556 settings["save_path_changed_tmm_enabled"] = ($("save_path_changed_tmm_combobox").value === "true");
2557 settings["category_changed_tmm_enabled"] = ($("category_changed_tmm_combobox").value === "true");
2558 settings["use_subcategories"] = $("use_subcategories_checkbox").checked;
2559 settings["use_category_paths_in_manual_mode"] = document.getElementById("categoryPathsManualModeCheckbox").checked;
2560 settings["save_path"] = $("savepath_text").value;
2561 settings["temp_path_enabled"] = $("temppath_checkbox").checked;
2562 settings["temp_path"] = $("temppath_text").value;
2563 if ($("exportdir_checkbox").checked)
2564 settings["export_dir"] = $("exportdir_text").value;
2565 else
2566 settings["export_dir"] = "";
2567 if ($("exportdirfin_checkbox").checked)
2568 settings["export_dir_fin"] = $("exportdirfin_text").value;
2569 else
2570 settings["export_dir_fin"] = "";
2572 // Automatically add torrents from
2573 settings["scan_dirs"] = getWatchedFolders();
2575 // Excluded file names
2576 settings["excluded_file_names_enabled"] = $("excludedFileNamesCheckbox").checked;
2577 settings["excluded_file_names"] = $("excludedFileNamesTextarea").value;
2579 // Email notification upon download completion
2580 settings["mail_notification_enabled"] = $("mail_notification_checkbox").checked;
2581 settings["mail_notification_sender"] = $("src_email_txt").value;
2582 settings["mail_notification_email"] = $("dest_email_txt").value;
2583 settings["mail_notification_smtp"] = $("smtp_server_txt").value;
2584 settings["mail_notification_ssl_enabled"] = $("mail_ssl_checkbox").checked;
2585 settings["mail_notification_auth_enabled"] = $("mail_auth_checkbox").checked;
2586 settings["mail_notification_username"] = $("mail_username_text").value;
2587 settings["mail_notification_password"] = $("mail_password_text").value;
2589 // Run an external program on torrent added
2590 settings["autorun_on_torrent_added_enabled"] = $("autorunOnTorrentAddedCheckbox").checked;
2591 settings["autorun_on_torrent_added_program"] = $("autorunOnTorrentAddedProgram").value;
2592 // Run an external program on torrent finished
2593 settings["autorun_enabled"] = $("autorun_checkbox").checked;
2594 settings["autorun_program"] = $("autorunProg_txt").value;
2596 // Connection tab
2597 // Listening Port
2598 const listen_port = $("port_value").value.toInt();
2599 if (isNaN(listen_port) || (listen_port < 0) || (listen_port > 65535)) {
2600 alert("QBT_TR(The port used for incoming connections must be between 0 and 65535.)QBT_TR[CONTEXT=HttpServer]");
2601 return;
2603 settings["listen_port"] = listen_port;
2604 settings["upnp"] = $("upnp_checkbox").checked;
2606 // Connections Limits
2607 let max_connec = -1;
2608 if ($("max_connec_checkbox").checked) {
2609 max_connec = $("max_connec_value").value.toInt();
2610 if (isNaN(max_connec) || (max_connec <= 0)) {
2611 alert("QBT_TR(Maximum number of connections limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2612 return;
2615 settings["max_connec"] = max_connec;
2616 let max_connec_per_torrent = -1;
2617 if ($("max_connec_per_torrent_checkbox").checked) {
2618 max_connec_per_torrent = $("max_connec_per_torrent_value").value.toInt();
2619 if (isNaN(max_connec_per_torrent) || (max_connec_per_torrent <= 0)) {
2620 alert("QBT_TR(Maximum number of connections per torrent limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2621 return;
2624 settings["max_connec_per_torrent"] = max_connec_per_torrent;
2625 let max_uploads = -1;
2626 if ($("max_uploads_checkbox").checked) {
2627 max_uploads = $("max_uploads_value").value.toInt();
2628 if (isNaN(max_uploads) || (max_uploads <= 0)) {
2629 alert("QBT_TR(Global number of upload slots limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2630 return;
2633 settings["max_uploads"] = max_uploads;
2634 let max_uploads_per_torrent = -1;
2635 if ($("max_uploads_per_torrent_checkbox").checked) {
2636 max_uploads_per_torrent = $("max_uploads_per_torrent_value").value.toInt();
2637 if (isNaN(max_uploads_per_torrent) || (max_uploads_per_torrent <= 0)) {
2638 alert("QBT_TR(Maximum number of upload slots per torrent limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2639 return;
2642 settings["max_uploads_per_torrent"] = max_uploads_per_torrent;
2644 // I2P
2645 settings["i2p_enabled"] = $("i2pEnabledCheckbox").checked;
2646 settings["i2p_address"] = $("i2pAddress").value;
2647 settings["i2p_port"] = $("i2pPort").value.toInt();
2648 settings["i2p_mixed_mode"] = $("i2pMixedMode").checked;
2650 // Proxy Server
2651 settings["proxy_type"] = $("peer_proxy_type_select").value;
2652 settings["proxy_ip"] = $("peer_proxy_host_text").value;
2653 settings["proxy_port"] = $("peer_proxy_port_value").value.toInt();
2654 settings["proxy_auth_enabled"] = $("peer_proxy_auth_checkbox").checked;
2655 settings["proxy_username"] = $("peer_proxy_username_text").value;
2656 settings["proxy_password"] = $("peer_proxy_password_text").value;
2657 settings["proxy_hostname_lookup"] = $("proxyHostnameLookupCheckbox").checked;
2658 settings["proxy_bittorrent"] = $("proxy_bittorrent_checkbox").checked;
2659 settings["proxy_peer_connections"] = $("use_peer_proxy_checkbox").checked;
2660 settings["proxy_rss"] = $("proxy_rss_checkbox").checked;
2661 settings["proxy_misc"] = $("proxy_misc_checkbox").checked;
2663 // IP Filtering
2664 settings["ip_filter_enabled"] = $("ipfilter_text_checkbox").checked;
2665 settings["ip_filter_path"] = $("ipfilter_text").value;
2666 settings["ip_filter_trackers"] = $("ipfilter_trackers_checkbox").checked;
2667 settings["banned_IPs"] = $("banned_IPs_textarea").value;
2669 // Speed tab
2670 // Global Rate Limits
2671 const up_limit = $("up_limit_value").value.toInt() * 1024;
2672 if (isNaN(up_limit) || (up_limit < 0)) {
2673 alert("QBT_TR(Global upload rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2674 return;
2676 settings["up_limit"] = up_limit;
2678 const dl_limit = $("dl_limit_value").value.toInt() * 1024;
2679 if (isNaN(dl_limit) || (dl_limit < 0)) {
2680 alert("QBT_TR(Global download rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2681 return;
2683 settings["dl_limit"] = dl_limit;
2685 // Alternative Global Rate Limits
2686 const alt_up_limit = $("alt_up_limit_value").value.toInt() * 1024;
2687 if (isNaN(alt_up_limit) || (alt_up_limit < 0)) {
2688 alert("QBT_TR(Alternative upload rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2689 return;
2691 settings["alt_up_limit"] = alt_up_limit;
2693 const alt_dl_limit = $("alt_dl_limit_value").value.toInt() * 1024;
2694 if (isNaN(alt_dl_limit) || (alt_dl_limit < 0)) {
2695 alert("QBT_TR(Alternative download rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
2696 return;
2698 settings["alt_dl_limit"] = alt_dl_limit;
2700 settings["bittorrent_protocol"] = Number($("enable_protocol_combobox").value);
2701 settings["limit_utp_rate"] = $("limit_utp_rate_checkbox").checked;
2702 settings["limit_tcp_overhead"] = $("limit_tcp_overhead_checkbox").checked;
2703 settings["limit_lan_peers"] = $("limit_lan_peers_checkbox").checked;
2705 // Scheduler
2706 const scheduling_enabled = $("limitSchedulingCheckbox").checked;
2707 settings["scheduler_enabled"] = scheduling_enabled;
2708 if (scheduling_enabled) {
2709 settings["schedule_from_hour"] = $("schedule_from_hour").value.toInt();
2710 settings["schedule_from_min"] = $("schedule_from_min").value.toInt();
2711 settings["schedule_to_hour"] = $("schedule_to_hour").value.toInt();
2712 settings["schedule_to_min"] = $("schedule_to_min").value.toInt();
2713 settings["scheduler_days"] = $("schedule_freq_select").value.toInt();
2716 // Bittorrent tab
2717 // Privacy
2718 settings["dht"] = $("dht_checkbox").checked;
2719 settings["pex"] = $("pex_checkbox").checked;
2720 settings["lsd"] = $("lsd_checkbox").checked;
2721 settings["encryption"] = Number($("encryption_select").getSelected()[0].value);
2722 settings["anonymous_mode"] = $("anonymous_mode_checkbox").checked;
2724 settings["max_active_checking_torrents"] = Number($("maxActiveCheckingTorrents").value);
2726 // Torrent Queueing
2727 settings["queueing_enabled"] = $("queueing_checkbox").checked;
2728 if ($("queueing_checkbox").checked) {
2729 const max_active_downloads = $("max_active_dl_value").value.toInt();
2730 if (isNaN(max_active_downloads) || (max_active_downloads < -1)) {
2731 alert("QBT_TR(Maximum active downloads must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
2732 return;
2734 settings["max_active_downloads"] = max_active_downloads;
2735 const max_active_uploads = $("max_active_up_value").value.toInt();
2736 if (isNaN(max_active_uploads) || (max_active_uploads < -1)) {
2737 alert("QBT_TR(Maximum active uploads must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
2738 return;
2740 settings["max_active_uploads"] = max_active_uploads;
2741 const max_active_torrents = $("max_active_to_value").value.toInt();
2742 if (isNaN(max_active_torrents) || (max_active_torrents < -1)) {
2743 alert("QBT_TR(Maximum active torrents must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
2744 return;
2746 settings["max_active_torrents"] = max_active_torrents;
2747 settings["dont_count_slow_torrents"] = $("dont_count_slow_torrents_checkbox").checked;
2748 const dl_rate_threshold = $("dl_rate_threshold").value.toInt();
2749 if (isNaN(dl_rate_threshold) || (dl_rate_threshold < 1)) {
2750 alert("QBT_TR(Download rate threshold must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
2751 return;
2753 settings["slow_torrent_dl_rate_threshold"] = dl_rate_threshold;
2754 const ul_rate_threshold = $("ul_rate_threshold").value.toInt();
2755 if (isNaN(ul_rate_threshold) || (ul_rate_threshold < 1)) {
2756 alert("QBT_TR(Upload rate threshold must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
2757 return;
2759 settings["slow_torrent_ul_rate_threshold"] = ul_rate_threshold;
2760 const torrent_inactive_timer = $("torrent_inactive_timer").value.toInt();
2761 if (isNaN(torrent_inactive_timer) || (torrent_inactive_timer < 1)) {
2762 alert("QBT_TR(Torrent inactivity timer must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
2763 return;
2765 settings["slow_torrent_inactive_timer"] = torrent_inactive_timer;
2768 // Share Ratio Limiting
2769 let max_ratio = -1;
2770 if ($("max_ratio_checkbox").checked) {
2771 max_ratio = $("max_ratio_value").value.toFloat();
2772 if (isNaN(max_ratio) || (max_ratio < 0) || (max_ratio > 9998)) {
2773 alert("QBT_TR(Share ratio limit must be between 0 and 9998.)QBT_TR[CONTEXT=HttpServer]");
2774 return;
2777 settings["max_ratio_enabled"] = $("max_ratio_checkbox").checked;
2778 settings["max_ratio"] = max_ratio;
2780 let max_seeding_time = -1;
2781 if ($("max_seeding_time_checkbox").checked) {
2782 max_seeding_time = $("max_seeding_time_value").value.toInt();
2783 if (isNaN(max_seeding_time) || (max_seeding_time < 0) || (max_seeding_time > 525600)) {
2784 alert("QBT_TR(Seeding time limit must be between 0 and 525600 minutes.)QBT_TR[CONTEXT=HttpServer]");
2785 return;
2788 settings["max_seeding_time_enabled"] = $("max_seeding_time_checkbox").checked;
2789 settings["max_seeding_time"] = max_seeding_time;
2790 settings["max_ratio_act"] = $("max_ratio_act").value.toInt();
2792 let max_inactive_seeding_time = -1;
2793 if ($("max_inactive_seeding_time_checkbox").checked) {
2794 max_inactive_seeding_time = $("max_inactive_seeding_time_value").value.toInt();
2795 if (isNaN(max_inactive_seeding_time) || (max_inactive_seeding_time < 0) || (max_inactive_seeding_time > 525600)) {
2796 alert("QBT_TR(Seeding time limit must be between 0 and 525600 minutes.)QBT_TR[CONTEXT=HttpServer]");
2797 return;
2800 settings["max_inactive_seeding_time_enabled"] = $("max_inactive_seeding_time_checkbox").checked;
2801 settings["max_inactive_seeding_time"] = max_inactive_seeding_time;
2802 settings["max_ratio_act"] = $("max_ratio_act").value.toInt();
2804 // Add trackers
2805 settings["add_trackers_enabled"] = $("add_trackers_checkbox").checked;
2806 settings["add_trackers"] = $("add_trackers_textarea").value;
2808 // RSS Tab
2809 settings["rss_processing_enabled"] = $("enable_fetching_rss_feeds_checkbox").checked;
2810 settings["rss_refresh_interval"] = Number($("feed_refresh_interval").value);
2811 settings["rss_fetch_delay"] = Number($("feedFetchDelay").value);
2812 settings["rss_max_articles_per_feed"] = Number($("maximum_article_number").value);
2813 settings["rss_auto_downloading_enabled"] = $("enable_auto_downloading_rss_torrents_checkbox").checked;
2814 settings["rss_download_repack_proper_episodes"] = $("downlock_repack_proper_episodes").checked;
2815 settings["rss_smart_episode_filters"] = $("rss_filter_textarea").value;
2817 // WebUI tab
2818 // Language
2819 settings["locale"] = $("locale_select").value;
2820 settings["performance_warning"] = $("performanceWarning").checked;
2822 // HTTP Server
2823 settings["web_ui_domain_list"] = $("webui_domain_textarea").value;
2824 const web_ui_address = $("webui_address_value").value.toString();
2825 const web_ui_port = $("webui_port_value").value.toInt();
2826 if (isNaN(web_ui_port) || (web_ui_port < 1) || (web_ui_port > 65535)) {
2827 alert("QBT_TR(The port used for the WebUI must be between 1 and 65535.)QBT_TR[CONTEXT=HttpServer]");
2828 return;
2830 settings["web_ui_address"] = web_ui_address;
2831 settings["web_ui_port"] = web_ui_port;
2832 settings["web_ui_upnp"] = $("webui_upnp_checkbox").checked;
2834 const useHTTPS = $("use_https_checkbox").checked;
2835 settings["use_https"] = useHTTPS;
2837 const httpsCertificate = $("ssl_cert_text").value;
2838 settings["web_ui_https_cert_path"] = httpsCertificate;
2839 if (useHTTPS && (httpsCertificate.length === 0)) {
2840 alert("QBT_TR(HTTPS certificate should not be empty)QBT_TR[CONTEXT=OptionsDialog]");
2841 return;
2844 const httpsKey = $("ssl_key_text").value;
2845 settings["web_ui_https_key_path"] = httpsKey;
2846 if (useHTTPS && (httpsKey.length === 0)) {
2847 alert("QBT_TR(HTTPS key should not be empty)QBT_TR[CONTEXT=OptionsDialog]");
2848 return;
2851 // Authentication
2852 const web_ui_username = $("webui_username_text").value;
2853 if (web_ui_username.length < 3) {
2854 alert("QBT_TR(The WebUI username must be at least 3 characters long.)QBT_TR[CONTEXT=OptionsDialog]");
2855 return;
2857 const web_ui_password = $("webui_password_text").value;
2858 if ((0 < web_ui_password.length) && (web_ui_password.length < 6)) {
2859 alert("QBT_TR(The WebUI password must be at least 6 characters long.)QBT_TR[CONTEXT=OptionsDialog]");
2860 return;
2863 settings["web_ui_username"] = web_ui_username;
2864 if (web_ui_password.length > 0)
2865 settings["web_ui_password"] = web_ui_password;
2866 settings["bypass_local_auth"] = $("bypass_local_auth_checkbox").checked;
2867 settings["bypass_auth_subnet_whitelist_enabled"] = $("bypass_auth_subnet_whitelist_checkbox").checked;
2868 settings["bypass_auth_subnet_whitelist"] = $("bypass_auth_subnet_whitelist_textarea").value;
2869 settings["web_ui_max_auth_fail_count"] = Number($("webUIMaxAuthFailCountInput").value);
2870 settings["web_ui_ban_duration"] = Number($("webUIBanDurationInput").value);
2871 settings["web_ui_session_timeout"] = Number($("webUISessionTimeoutInput").value);
2873 // Use alternative WebUI
2874 const alternative_webui_enabled = $("use_alt_webui_checkbox").checked;
2875 const webui_files_location_textarea = $("webui_files_location_textarea").value;
2876 if (alternative_webui_enabled && (webui_files_location_textarea.trim() === "")) {
2877 alert("QBT_TR(The alternative WebUI files location cannot be blank.)QBT_TR[CONTEXT=OptionsDialog]");
2878 return;
2880 settings["alternative_webui_enabled"] = alternative_webui_enabled;
2881 settings["alternative_webui_path"] = webui_files_location_textarea;
2883 // Security
2884 settings["web_ui_clickjacking_protection_enabled"] = $("clickjacking_protection_checkbox").checked;
2885 settings["web_ui_csrf_protection_enabled"] = $("csrf_protection_checkbox").checked;
2886 settings["web_ui_secure_cookie_enabled"] = $("secureCookieCheckbox").checked;
2887 settings["web_ui_host_header_validation_enabled"] = $("host_header_validation_checkbox").checked;
2889 // Custom HTTP headers
2890 settings["web_ui_use_custom_http_headers_enabled"] = $("webUIUseCustomHTTPHeadersCheckbox").checked;
2891 settings["web_ui_custom_http_headers"] = $("webUICustomHTTPHeadersTextarea").value;
2893 // Reverse Proxy
2894 settings["web_ui_reverse_proxy_enabled"] = $("webUIReverseProxySupportCheckbox").checked;
2895 settings["web_ui_reverse_proxies_list"] = $("webUIReverseProxiesListTextarea").value;
2897 // Update my dynamic domain name
2898 settings["dyndns_enabled"] = $("use_dyndns_checkbox").checked;
2899 settings["dyndns_service"] = Number($("dyndns_select").value);
2900 settings["dyndns_domain"] = $("dyndns_domain_text").value;
2901 settings["dyndns_username"] = $("dyndns_username_text").value;
2902 settings["dyndns_password"] = $("dyndns_password_text").value;
2904 // Update advanced settings
2905 // qBittorrent section
2906 settings["resume_data_storage_type"] = $("resumeDataStorageType").value;
2907 settings["torrent_content_remove_option"] = $("torrentContentRemoveOption").value;
2908 settings["memory_working_set_limit"] = Number($("memoryWorkingSetLimit").value);
2909 settings["current_network_interface"] = $("networkInterface").value;
2910 settings["current_interface_address"] = $("optionalIPAddressToBind").value;
2911 settings["save_resume_data_interval"] = Number($("saveResumeDataInterval").value);
2912 settings["torrent_file_size_limit"] = ($("torrentFileSizeLimit").value * 1024 * 1024);
2913 settings["recheck_completed_torrents"] = $("recheckTorrentsOnCompletion").checked;
2914 settings["app_instance_name"] = $("appInstanceName").value;
2915 settings["refresh_interval"] = Number($("refreshInterval").value);
2916 settings["resolve_peer_countries"] = $("resolvePeerCountries").checked;
2917 settings["reannounce_when_address_changed"] = $("reannounceWhenAddressChanged").checked;
2919 // libtorrent section
2920 settings["bdecode_depth_limit"] = Number($("bdecodeDepthLimit").value);
2921 settings["bdecode_token_limit"] = Number($("bdecodeTokenLimit").value);
2922 settings["async_io_threads"] = Number($("asyncIOThreads").value);
2923 settings["hashing_threads"] = Number($("hashingThreads").value);
2924 settings["file_pool_size"] = Number($("filePoolSize").value);
2925 settings["checking_memory_use"] = Number($("outstandMemoryWhenCheckingTorrents").value);
2926 settings["disk_cache"] = Number($("diskCache").value);
2927 settings["disk_cache_ttl"] = Number($("diskCacheExpiryInterval").value);
2928 settings["disk_queue_size"] = (Number($("diskQueueSize").value) * 1024);
2929 settings["disk_io_type"] = Number($("diskIOType").value);
2930 settings["disk_io_read_mode"] = Number($("diskIOReadMode").value);
2931 settings["disk_io_write_mode"] = Number($("diskIOWriteMode").value);
2932 settings["enable_coalesce_read_write"] = $("coalesceReadsAndWrites").checked;
2933 settings["enable_piece_extent_affinity"] = $("pieceExtentAffinity").checked;
2934 settings["enable_upload_suggestions"] = $("sendUploadPieceSuggestions").checked;
2935 settings["send_buffer_watermark"] = Number($("sendBufferWatermark").value);
2936 settings["send_buffer_low_watermark"] = Number($("sendBufferLowWatermark").value);
2937 settings["send_buffer_watermark_factor"] = Number($("sendBufferWatermarkFactor").value);
2938 settings["connection_speed"] = Number($("connectionSpeed").value);
2939 settings["socket_send_buffer_size"] = ($("socketSendBufferSize").value * 1024);
2940 settings["socket_receive_buffer_size"] = ($("socketReceiveBufferSize").value * 1024);
2941 settings["socket_backlog_size"] = Number($("socketBacklogSize").value);
2942 settings["outgoing_ports_min"] = Number($("outgoingPortsMin").value);
2943 settings["outgoing_ports_max"] = Number($("outgoingPortsMax").value);
2944 settings["upnp_lease_duration"] = Number($("UPnPLeaseDuration").value);
2945 settings["peer_tos"] = Number($("peerToS").value);
2946 settings["utp_tcp_mixed_mode"] = Number($("utpTCPMixedModeAlgorithm").value);
2947 settings["idn_support_enabled"] = $("IDNSupportCheckbox").checked;
2948 settings["enable_multi_connections_from_same_ip"] = $("allowMultipleConnectionsFromTheSameIPAddress").checked;
2949 settings["validate_https_tracker_certificate"] = $("validateHTTPSTrackerCertificate").checked;
2950 settings["ssrf_mitigation"] = $("mitigateSSRF").checked;
2951 settings["block_peers_on_privileged_ports"] = $("blockPeersOnPrivilegedPorts").checked;
2952 settings["enable_embedded_tracker"] = $("enableEmbeddedTracker").checked;
2953 settings["embedded_tracker_port"] = Number($("embeddedTrackerPort").value);
2954 settings["embedded_tracker_port_forwarding"] = $("embeddedTrackerPortForwarding").checked;
2955 settings["mark_of_the_web"] = $("markOfTheWeb").checked;
2956 settings["python_executable_path"] = $("pythonExecutablePath").value;
2957 settings["upload_slots_behavior"] = Number($("uploadSlotsBehavior").value);
2958 settings["upload_choking_algorithm"] = Number($("uploadChokingAlgorithm").value);
2959 settings["announce_to_all_trackers"] = $("announceAllTrackers").checked;
2960 settings["announce_to_all_tiers"] = $("announceAllTiers").checked;
2961 settings["announce_ip"] = $("announceIP").value;
2962 settings["max_concurrent_http_announces"] = Number($("maxConcurrentHTTPAnnounces").value);
2963 settings["stop_tracker_timeout"] = Number($("stopTrackerTimeout").value);
2964 settings["peer_turnover"] = Number($("peerTurnover").value);
2965 settings["peer_turnover_cutoff"] = Number($("peerTurnoverCutoff").value);
2966 settings["peer_turnover_interval"] = Number($("peerTurnoverInterval").value);
2967 settings["request_queue_size"] = Number($("requestQueueSize").value);
2968 settings["dht_bootstrap_nodes"] = $("dhtBootstrapNodes").value;
2969 settings["i2p_inbound_quantity"] = Number($("i2pInboundQuantity").value);
2970 settings["i2p_outbound_quantity"] = Number($("i2pOutboundQuantity").value);
2971 settings["i2p_inbound_length"] = Number($("i2pInboundLength").value);
2972 settings["i2p_outbound_length"] = Number($("i2pOutboundLength").value);
2974 // Send it to qBT
2975 window.parent.qBittorrent.Cache.preferences.set({
2976 data: settings,
2977 onFailure: function() {
2978 alert("QBT_TR(Unable to save program preferences, qBittorrent is probably unreachable.)QBT_TR[CONTEXT=HttpServer]");
2979 window.parent.qBittorrent.Client.closeWindows();
2981 onSuccess: function() {
2982 // Close window
2983 window.parent.location.reload();
2984 window.parent.qBittorrent.Client.closeWindows();
2989 const setup = () => {
2990 watchedFoldersTable = new HtmlTable($("watched_folders_tab"));
2992 const buildInfo = window.qBittorrent.Cache.buildInfo.get();
2994 // hide entries
2995 const libtorrentVersion = window.qBittorrent.Misc.parseVersion(buildInfo.libtorrent);
2996 if (libtorrentVersion.valid) {
2997 if (libtorrentVersion.major >= 2) {
2998 $("rowDiskCache").style.display = "none";
2999 $("rowDiskCacheExpiryInterval").style.display = "none";
3000 $("rowCoalesceReadsAndWrites").style.display = "none";
3002 else {
3003 $("fieldsetI2p").style.display = "none";
3004 $("rowMemoryWorkingSetLimit").style.display = "none";
3005 $("rowHashingThreads").style.display = "none";
3006 $("rowDiskIOType").style.display = "none";
3007 $("rowI2pInboundQuantity").style.display = "none";
3008 $("rowI2pOutboundQuantity").style.display = "none";
3009 $("rowI2pInboundLength").style.display = "none";
3010 $("rowI2pOutboundLength").style.display = "none";
3013 if (!((libtorrentVersion.major >= 2) && (libtorrentVersion.minor >= 0) && (libtorrentVersion.fix >= 6)))
3014 $("diskIOWriteModeWriteThrough").style.display = "none";
3017 if ((buildInfo.platform !== "macos") && (buildInfo.platform !== "windows"))
3018 $("rowMarkOfTheWeb").style.display = "none";
3020 $("networkInterface").addEventListener("change", function() {
3021 updateInterfaceAddresses($(this).value, "");
3024 loadPreferences();
3026 window.qBittorrent.pathAutofill.attachPathAutofill();
3029 return exports();
3030 })();
3031 Object.freeze(window.qBittorrent.Preferences);
3033 window.qBittorrent.Preferences.setup();
3034 </script>