mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-08-20 21:33:27 -07:00
Merge branch 'master' into webui-virtual-list-avoid-forced-reflow
This commit is contained in:
commit
a76447e2be
30 changed files with 309 additions and 288 deletions
2
.github/workflows/ci_macos.yaml
vendored
2
.github/workflows/ci_macos.yaml
vendored
|
@ -20,7 +20,7 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
libt_version: ["2.0.11", "1.2.20"]
|
libt_version: ["2.0.11", "1.2.20"]
|
||||||
qbt_gui: ["GUI=ON", "GUI=OFF"]
|
qbt_gui: ["GUI=ON", "GUI=OFF"]
|
||||||
qt_version: ["6.9.0"]
|
qt_version: ["6.9.1"]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
boost_path: "${{ github.workspace }}/../boost"
|
boost_path: "${{ github.workspace }}/../boost"
|
||||||
|
|
2
.github/workflows/ci_windows.yaml
vendored
2
.github/workflows/ci_windows.yaml
vendored
|
@ -106,7 +106,7 @@ jobs:
|
||||||
- name: Install Qt
|
- name: Install Qt
|
||||||
uses: jurplel/install-qt-action@v4
|
uses: jurplel/install-qt-action@v4
|
||||||
with:
|
with:
|
||||||
version: "6.9.0"
|
version: "6.9.1"
|
||||||
arch: win64_msvc2022_64
|
arch: win64_msvc2022_64
|
||||||
archives: qtbase qtsvg qttools
|
archives: qtbase qtsvg qttools
|
||||||
cache: true
|
cache: true
|
||||||
|
|
4
.github/workflows/coverity-scan.yaml
vendored
4
.github/workflows/coverity-scan.yaml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
libt_version: ["2.0.11"]
|
libt_version: ["2.0.11"]
|
||||||
qbt_gui: ["GUI=ON"]
|
qbt_gui: ["GUI=ON"]
|
||||||
qt_version: ["6.6.3"]
|
qt_version: ["6.9.1"]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
boost_path: "${{ github.workspace }}/../boost"
|
boost_path: "${{ github.workspace }}/../boost"
|
||||||
|
@ -39,7 +39,7 @@ jobs:
|
||||||
- name: Install boost
|
- name: Install boost
|
||||||
env:
|
env:
|
||||||
BOOST_MAJOR_VERSION: "1"
|
BOOST_MAJOR_VERSION: "1"
|
||||||
BOOST_MINOR_VERSION: "86"
|
BOOST_MINOR_VERSION: "88"
|
||||||
BOOST_PATCH_VERSION: "0"
|
BOOST_PATCH_VERSION: "0"
|
||||||
run: |
|
run: |
|
||||||
boost_url="https://archives.boost.io/release/${{ env.BOOST_MAJOR_VERSION }}.${{ env.BOOST_MINOR_VERSION }}.${{ env.BOOST_PATCH_VERSION }}/source/boost_${{ env.BOOST_MAJOR_VERSION }}_${{ env.BOOST_MINOR_VERSION }}_${{ env.BOOST_PATCH_VERSION }}.tar.gz"
|
boost_url="https://archives.boost.io/release/${{ env.BOOST_MAJOR_VERSION }}.${{ env.BOOST_MINOR_VERSION }}.${{ env.BOOST_PATCH_VERSION }}/source/boost_${{ env.BOOST_MAJOR_VERSION }}_${{ env.BOOST_MINOR_VERSION }}_${{ env.BOOST_PATCH_VERSION }}.tar.gz"
|
||||||
|
|
|
@ -189,8 +189,13 @@ void BitTorrent::BencodeResumeDataStorage::loadQueue(const Path &queueFilename)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QHash<TorrentID, qsizetype> registeredTorrentsIndexes;
|
||||||
|
registeredTorrentsIndexes.reserve(m_registeredTorrents.length());
|
||||||
|
for (qsizetype i = 0; i < m_registeredTorrents.length(); ++i)
|
||||||
|
registeredTorrentsIndexes.insert(m_registeredTorrents.at(i), i);
|
||||||
|
|
||||||
const QRegularExpression hashPattern {u"^([A-Fa-f0-9]{40})$"_s};
|
const QRegularExpression hashPattern {u"^([A-Fa-f0-9]{40})$"_s};
|
||||||
int start = 0;
|
qsizetype queuePos = 0;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
const auto line = QString::fromLatin1(queueFile.readLine(lineMaxLength).trimmed());
|
const auto line = QString::fromLatin1(queueFile.readLine(lineMaxLength).trimmed());
|
||||||
|
@ -201,11 +206,15 @@ void BitTorrent::BencodeResumeDataStorage::loadQueue(const Path &queueFilename)
|
||||||
if (rxMatch.hasMatch())
|
if (rxMatch.hasMatch())
|
||||||
{
|
{
|
||||||
const auto torrentID = BitTorrent::TorrentID::fromString(rxMatch.captured(1));
|
const auto torrentID = BitTorrent::TorrentID::fromString(rxMatch.captured(1));
|
||||||
const int pos = m_registeredTorrents.indexOf(torrentID, start);
|
const qsizetype pos = registeredTorrentsIndexes.value(torrentID, -1);
|
||||||
if (pos != -1)
|
if (pos != -1)
|
||||||
{
|
{
|
||||||
std::swap(m_registeredTorrents[start], m_registeredTorrents[pos]);
|
if (pos != queuePos)
|
||||||
++start;
|
{
|
||||||
|
m_registeredTorrents.swapItemsAt(pos, queuePos);
|
||||||
|
registeredTorrentsIndexes.insert(m_registeredTorrents.at(pos), pos);
|
||||||
|
}
|
||||||
|
++queuePos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Add Peers)QBT_TR[CONTEXT=PeersAdditionDialog]</title>
|
<title>QBT_TR(Add Peers)QBT_TR[CONTEXT=PeersAdditionDialog]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Add trackers)QBT_TR[CONTEXT=TrackersAdditionDialog]</title>
|
<title>QBT_TR(Add trackers)QBT_TR[CONTEXT=TrackersAdditionDialog]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Add web seeds)QBT_TR[CONTEXT=HttpServer]</title>
|
<title>QBT_TR(Add web seeds)QBT_TR[CONTEXT=HttpServer]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=RSSWidget]</title>
|
<title>QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=RSSWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Clear downloaded episodes)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
<title>QBT_TR(Clear downloaded episodes)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Rule deletion confirmation)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
<title>QBT_TR(Rule deletion confirmation)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Remove tracker)QBT_TR[CONTEXT=confirmDeletionDlg]</title>
|
<title>QBT_TR(Remove tracker)QBT_TR[CONTEXT=confirmDeletionDlg]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,41 @@
|
||||||
<title>QBT_TR(Add Torrent Links)QBT_TR[CONTEXT=downloadFromURL]</title>
|
<title>QBT_TR(Add Torrent Links)QBT_TR[CONTEXT=downloadFromURL]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<link rel="stylesheet" href="css/Window.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/Window.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/download.js?v=${CACHEID}"></script>
|
<script defer src="scripts/download.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
<script defer src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
window.addEventListener("DOMContentLoaded", (event) => {
|
||||||
|
const encodedUrls = new URLSearchParams(window.location.search).get("urls");
|
||||||
|
if (encodedUrls !== null) {
|
||||||
|
const urls = encodedUrls.split("|").map(decodeURIComponent);
|
||||||
|
if (urls.length > 0)
|
||||||
|
document.getElementById("urls").value = urls.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
let submitted = false;
|
||||||
|
|
||||||
|
document.getElementById("downloadForm").addEventListener("submit", (event) => {
|
||||||
|
document.getElementById("startTorrentHidden").value = document.getElementById("startTorrent").checked ? "false" : "true";
|
||||||
|
|
||||||
|
document.getElementById("dlLimitHidden").value = Number(document.getElementById("dlLimitText").value) * 1024;
|
||||||
|
document.getElementById("upLimitHidden").value = Number(document.getElementById("upLimitText").value) * 1024;
|
||||||
|
|
||||||
|
document.getElementById("download_spinner").style.display = "block";
|
||||||
|
submitted = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("download_frame").addEventListener("load", (event) => {
|
||||||
|
if (submitted)
|
||||||
|
window.parent.qBittorrent.Client.closeFrameWindow(window);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.qBittorrent.pathAutofill.attachPathAutofill();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -156,36 +187,6 @@
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<div id="download_spinner" class="mochaSpinner"></div>
|
<div id="download_spinner" class="mochaSpinner"></div>
|
||||||
|
|
||||||
<script>
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
const encodedUrls = new URLSearchParams(window.location.search).get("urls");
|
|
||||||
if (encodedUrls !== null) {
|
|
||||||
const urls = encodedUrls.split("|").map(decodeURIComponent);
|
|
||||||
if (urls.length > 0)
|
|
||||||
document.getElementById("urls").value = urls.join("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
let submitted = false;
|
|
||||||
|
|
||||||
document.getElementById("downloadForm").addEventListener("submit", (event) => {
|
|
||||||
document.getElementById("startTorrentHidden").value = document.getElementById("startTorrent").checked ? "false" : "true";
|
|
||||||
|
|
||||||
document.getElementById("dlLimitHidden").value = Number(document.getElementById("dlLimitText").value) * 1024;
|
|
||||||
document.getElementById("upLimitHidden").value = Number(document.getElementById("upLimitText").value) * 1024;
|
|
||||||
|
|
||||||
document.getElementById("download_spinner").style.display = "block";
|
|
||||||
submitted = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("download_frame").addEventListener("load", (event) => {
|
|
||||||
if (submitted)
|
|
||||||
window.parent.qBittorrent.Client.closeFrameWindow(window);
|
|
||||||
});
|
|
||||||
|
|
||||||
window.qBittorrent.pathAutofill.attachPathAutofill();
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Please type a RSS feed URL)QBT_TR[CONTEXT=RSSWidget]</title>
|
<title>QBT_TR(Please type a RSS feed URL)QBT_TR[CONTEXT=RSSWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Tracker editing)QBT_TR[CONTEXT=TrackerListWidget]</title>
|
<title>QBT_TR(Tracker editing)QBT_TR[CONTEXT=TrackerListWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Edit web seed)QBT_TR[CONTEXT=HttpServer]</title>
|
<title>QBT_TR(Edit web seed)QBT_TR[CONTEXT=HttpServer]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget]</title>
|
<title>QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/misc.js?locale=${LANG}&v=${CACHEID}"></script>
|
<script defer src="scripts/misc.js?locale=${LANG}&v=${CACHEID}"></script>
|
||||||
<script src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
<script defer src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Please type a RSS feed URL)QBT_TR[CONTEXT=RSSWidget]</title>
|
<title>QBT_TR(Please type a RSS feed URL)QBT_TR[CONTEXT=RSSWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Please choose a folder name)QBT_TR[CONTEXT=RSSWidget]</title>
|
<title>QBT_TR(Please choose a folder name)QBT_TR[CONTEXT=RSSWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(New rule name)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
<title>QBT_TR(New rule name)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Add tags)QBT_TR[CONTEXT=TransferListWidget]</title>
|
<title>QBT_TR(Add tags)QBT_TR[CONTEXT=TransferListWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/misc.js?locale=${LANG}&v=${CACHEID}"></script>
|
<script defer src="scripts/misc.js?locale=${LANG}&v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Rename)QBT_TR[CONTEXT=TransferListWidget]</title>
|
<title>QBT_TR(Rename)QBT_TR[CONTEXT=TransferListWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Please choose a new name for this RSS feed)QBT_TR[CONTEXT=RSSWidget]</title>
|
<title>QBT_TR(Please choose a new name for this RSS feed)QBT_TR[CONTEXT=RSSWidget]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Renaming)QBT_TR[CONTEXT=TorrentContentTreeView]</title>
|
<title>QBT_TR(Renaming)QBT_TR[CONTEXT=TorrentContentTreeView]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/filesystem.js?v=${CACHEID}"></script>
|
<script defer src="scripts/filesystem.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Renaming)QBT_TR[CONTEXT=TorrentContentTreeView]</title>
|
<title>QBT_TR(Renaming)QBT_TR[CONTEXT=TorrentContentTreeView]</title>
|
||||||
<script src="scripts/filesystem.js?v=${CACHEID}"></script>
|
<script defer src="scripts/filesystem.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/misc.js?locale=${LANG}&v=${CACHEID}"></script>
|
<script defer src="scripts/misc.js?locale=${LANG}&v=${CACHEID}"></script>
|
||||||
<script src="scripts/file-tree.js?v=${CACHEID}"></script>
|
<script defer src="scripts/file-tree.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/dynamicTable.js?locale=${LANG}&v=${CACHEID}"></script>
|
<script defer src="scripts/dynamicTable.js?locale=${LANG}&v=${CACHEID}"></script>
|
||||||
<script src="scripts/rename-files.js?v=${CACHEID}"></script>
|
<script defer src="scripts/rename-files.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Rule renaming)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
<title>QBT_TR(Rule renaming)QBT_TR[CONTEXT=AutomatedRssDownloader]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -861,42 +861,49 @@ window.qBittorrent.DynamicTable ??= (() => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const trs = [...this.getTrs()];
|
const trs = [...this.getTrs()];
|
||||||
|
const trMap = new Map(trs.map(tr => [tr.rowId, tr]));
|
||||||
|
|
||||||
for (let rowPos = 0; rowPos < rows.length; ++rowPos) {
|
for (let rowPos = 0; rowPos < rows.length; ++rowPos) {
|
||||||
const rowId = rows[rowPos].rowId;
|
const rowId = rows[rowPos].rowId;
|
||||||
let tr_found = false;
|
const existingTr = trMap.get(rowId);
|
||||||
for (let j = rowPos; j < trs.length; ++j) {
|
if (existingTr !== undefined) {
|
||||||
if (trs[j].rowId === rowId) {
|
this.updateRow(existingTr, fullUpdate);
|
||||||
tr_found = true;
|
|
||||||
if (rowPos === j)
|
|
||||||
break;
|
|
||||||
trs[j].inject(trs[rowPos], "before");
|
|
||||||
const tmpTr = trs[j];
|
|
||||||
trs.splice(j, 1);
|
|
||||||
trs.splice(rowPos, 0, tmpTr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tr_found) { // row already exists in the table
|
|
||||||
this.updateRow(trs[rowPos], fullUpdate);
|
|
||||||
}
|
|
||||||
else { // else create a new row in the table
|
|
||||||
const tr = this.createRowElement(rows[rowPos]);
|
|
||||||
|
|
||||||
// Insert
|
|
||||||
if (rowPos >= trs.length) {
|
|
||||||
tr.inject(this.tableBody);
|
|
||||||
trs.push(tr);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tr.inject(trs[rowPos], "before");
|
const tr = this.createRowElement(rows[rowPos]);
|
||||||
trs.splice(rowPos, 0, tr);
|
|
||||||
}
|
// TODO look into using DocumentFragment or appending all trs at once for add'l performance gains
|
||||||
|
// add to end of table - we'll move into the proper order later
|
||||||
|
this.tableBody.appendChild(tr);
|
||||||
|
trMap.set(rowId, tr);
|
||||||
|
|
||||||
this.updateRow(tr, true);
|
this.updateRow(tr, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reorder table rows
|
||||||
|
let prevTr = null;
|
||||||
|
for (let rowPos = 0; rowPos < rows.length; ++rowPos) {
|
||||||
|
const { rowId } = rows[rowPos];
|
||||||
|
const tr = trMap.get(rowId);
|
||||||
|
|
||||||
|
const isInCorrectLocation = rowId === trs[rowPos]?.rowId;
|
||||||
|
if (!isInCorrectLocation) {
|
||||||
|
// move row into correct location
|
||||||
|
if (prevTr === null) {
|
||||||
|
// insert as first row in table
|
||||||
|
if (trs.length === 0)
|
||||||
|
this.tableBody.append(tr);
|
||||||
|
else
|
||||||
|
trs[0].before(tr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prevTr.after(tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prevTr = tr;
|
||||||
|
}
|
||||||
|
|
||||||
const rowPos = rows.length;
|
const rowPos = rows.length;
|
||||||
|
|
||||||
while ((rowPos < trs.length) && (trs.length > 0))
|
while ((rowPos < trs.length) && (trs.length > 0))
|
||||||
|
@ -914,8 +921,8 @@ window.qBittorrent.DynamicTable ??= (() => {
|
||||||
|
|
||||||
if (this.renderedHeight === 0)
|
if (this.renderedHeight === 0)
|
||||||
return;
|
return;
|
||||||
// show extra 6 rows at top/bottom to reduce flickering
|
// show extra rows at top/bottom to reduce flickering
|
||||||
const extraRowCount = 6;
|
const extraRowCount = 20;
|
||||||
// how many rows can be shown in the visible area
|
// how many rows can be shown in the visible area
|
||||||
const visibleRowCount = Math.ceil(this.renderedHeight / this.rowHeight) + (extraRowCount * 2);
|
const visibleRowCount = Math.ceil(this.renderedHeight / this.rowHeight) + (extraRowCount * 2);
|
||||||
// start position of visible rows, offsetted by renderedOffset
|
// start position of visible rows, offsetted by renderedOffset
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Set location)QBT_TR[CONTEXT=HttpServer]</title>
|
<title>QBT_TR(Set location)QBT_TR[CONTEXT=HttpServer]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
<script defer src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Torrent Upload/Download Ratio Limiting)QBT_TR[CONTEXT=UpDownRatioDialog]</title>
|
<title>QBT_TR(Torrent Upload/Download Ratio Limiting)QBT_TR[CONTEXT=UpDownRatioDialog]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
|
@ -5,31 +5,19 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>QBT_TR(Speed limit)QBT_TR[CONTEXT=SpeedLimit]</title>
|
<title>QBT_TR(Speed limit)QBT_TR[CONTEXT=SpeedLimit]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div style="padding-top: 10px; width: 100%; text-align: center; margin: 0 auto; overflow: hidden">
|
|
||||||
<div class="slider">
|
|
||||||
<div class="update">
|
|
||||||
<label id="limitUpdateLabel" for="limitUpdateValue">QBT_TR(Limit:)QBT_TR[CONTEXT=SpeedLimit]</label>
|
|
||||||
<input type="text" id="limitUpdateValue" size="6" placeholder="∞" style="text-align: center;">
|
|
||||||
<span id="limitUnit">QBT_TR(KiB/s)QBT_TR[CONTEXT=SpeedLimit]</span>
|
|
||||||
</div>
|
|
||||||
<input type="range" id="limitSliderInput" min="0" value="0" style="width: 100%;" aria-label="QBT_TR(Speed limit)QBT_TR[CONTEXT=SpeedLimit]">
|
|
||||||
</div>
|
|
||||||
<input type="button" id="applyButton" value="QBT_TR(Apply)QBT_TR[CONTEXT=HttpServer]" onclick="saveLimit()">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
window.addEventListener("DOMContentLoaded", (event) => {
|
||||||
|
const applyButton = document.getElementById("applyButton");
|
||||||
|
|
||||||
window.addEventListener("keydown", (event) => {
|
window.addEventListener("keydown", (event) => {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case "Enter":
|
case "Enter":
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
document.getElementById("applyButton").click();
|
applyButton.click();
|
||||||
break;
|
break;
|
||||||
case "Escape":
|
case "Escape":
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
@ -74,7 +62,7 @@
|
||||||
setLimitUpdateValue(limit);
|
setLimitUpdateValue(limit);
|
||||||
};
|
};
|
||||||
|
|
||||||
const saveLimit = () => {
|
applyButton.addEventListener("click", (event) => {
|
||||||
const limit = Number(limitUpdateValue.value) * 1024;
|
const limit = Number(limitUpdateValue.value) * 1024;
|
||||||
if (isGlobal) {
|
if (isGlobal) {
|
||||||
fetch(`api/v2/transfer/${setLimitMethod}`, {
|
fetch(`api/v2/transfer/${setLimitMethod}`, {
|
||||||
|
@ -106,7 +94,7 @@
|
||||||
window.parent.qBittorrent.Client.closeFrameWindow(window);
|
window.parent.qBittorrent.Client.closeFrameWindow(window);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
document.getElementById("limitUpdateLabel").textContent =
|
document.getElementById("limitUpdateLabel").textContent =
|
||||||
isUpload
|
isUpload
|
||||||
|
@ -153,7 +141,22 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
limitUpdateValue.focus();
|
limitUpdateValue.focus();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="padding-top: 10px; width: 100%; text-align: center; margin: 0 auto; overflow: hidden">
|
||||||
|
<div class="slider">
|
||||||
|
<div class="update">
|
||||||
|
<label id="limitUpdateLabel" for="limitUpdateValue">QBT_TR(Limit:)QBT_TR[CONTEXT=SpeedLimit]</label>
|
||||||
|
<input type="text" id="limitUpdateValue" size="6" placeholder="∞" style="text-align: center;">
|
||||||
|
<span id="limitUnit">QBT_TR(KiB/s)QBT_TR[CONTEXT=SpeedLimit]</span>
|
||||||
|
</div>
|
||||||
|
<input type="range" id="limitSliderInput" min="0" value="0" style="width: 100%;" aria-label="QBT_TR(Speed limit)QBT_TR[CONTEXT=SpeedLimit]">
|
||||||
|
</div>
|
||||||
|
<input type="button" id="applyButton" value="QBT_TR(Apply)QBT_TR[CONTEXT=HttpServer]">
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -6,10 +6,38 @@
|
||||||
<title>QBT_TR(Upload local torrent)QBT_TR[CONTEXT=HttpServer]</title>
|
<title>QBT_TR(Upload local torrent)QBT_TR[CONTEXT=HttpServer]</title>
|
||||||
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/style.css?v=${CACHEID}" type="text/css">
|
||||||
<link rel="stylesheet" href="css/Window.css?v=${CACHEID}" type="text/css">
|
<link rel="stylesheet" href="css/Window.css?v=${CACHEID}" type="text/css">
|
||||||
<script src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
<script defer src="scripts/localpreferences.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
<script defer src="scripts/color-scheme.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/download.js?v=${CACHEID}"></script>
|
<script defer src="scripts/download.js?v=${CACHEID}"></script>
|
||||||
<script src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
<script defer src="scripts/pathAutofill.js?v=${CACHEID}"></script>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
window.addEventListener("DOMContentLoaded", (event) => {
|
||||||
|
let submitted = false;
|
||||||
|
|
||||||
|
document.getElementById("uploadForm").addEventListener("submit", (event) => {
|
||||||
|
document.getElementById("startTorrentHidden").value = document.getElementById("startTorrent").checked ? "false" : "true";
|
||||||
|
|
||||||
|
document.getElementById("dlLimitHidden").value = Number(document.getElementById("dlLimitText").value) * 1024;
|
||||||
|
document.getElementById("upLimitHidden").value = Number(document.getElementById("upLimitText").value) * 1024;
|
||||||
|
|
||||||
|
document.getElementById("upload_spinner").style.display = "block";
|
||||||
|
submitted = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("upload_frame").addEventListener("load", (event) => {
|
||||||
|
if (submitted)
|
||||||
|
window.parent.qBittorrent.Client.closeFrameWindow(window);
|
||||||
|
});
|
||||||
|
|
||||||
|
const userAgent = (navigator.userAgentData?.platform ?? navigator.platform).toLowerCase();
|
||||||
|
if (userAgent.includes("ipad") || userAgent.includes("iphone") || (userAgent.includes("mac") && (navigator.maxTouchPoints > 1)))
|
||||||
|
document.getElementById("fileselect").accept = ".torrent";
|
||||||
|
|
||||||
|
window.qBittorrent.pathAutofill.attachPathAutofill();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -153,33 +181,6 @@
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
<div id="upload_spinner" class="mochaSpinner"></div>
|
<div id="upload_spinner" class="mochaSpinner"></div>
|
||||||
|
|
||||||
<script>
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
let submitted = false;
|
|
||||||
|
|
||||||
document.getElementById("uploadForm").addEventListener("submit", (event) => {
|
|
||||||
document.getElementById("startTorrentHidden").value = document.getElementById("startTorrent").checked ? "false" : "true";
|
|
||||||
|
|
||||||
document.getElementById("dlLimitHidden").value = Number(document.getElementById("dlLimitText").value) * 1024;
|
|
||||||
document.getElementById("upLimitHidden").value = Number(document.getElementById("upLimitText").value) * 1024;
|
|
||||||
|
|
||||||
document.getElementById("upload_spinner").style.display = "block";
|
|
||||||
submitted = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("upload_frame").addEventListener("load", (event) => {
|
|
||||||
if (submitted)
|
|
||||||
window.parent.qBittorrent.Client.closeFrameWindow(window);
|
|
||||||
});
|
|
||||||
|
|
||||||
const userAgent = (navigator.userAgentData?.platform ?? navigator.platform).toLowerCase();
|
|
||||||
if (userAgent.includes("ipad") || userAgent.includes("iphone") || (userAgent.includes("mac") && (navigator.maxTouchPoints > 1)))
|
|
||||||
document.getElementById("fileselect").accept = ".torrent";
|
|
||||||
|
|
||||||
window.qBittorrent.pathAutofill.attachPathAutofill();
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue