diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index bfe451c5c9d5..03518d10acf9 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -118,6 +118,7 @@ using namespace std::chrono_literals; using namespace BitTorrent; const Path CATEGORIES_FILE_NAME {u"categories.json"_s}; +const Path ADDITIONAL_TRACKERS_FROM_URL_FILE_NAME {u"additional_trackers_from_url.txt"_s}; const int MAX_PROCESSING_RESUMEDATA_COUNT = 50; const std::chrono::seconds FREEDISKSPACE_CHECK_TIMEOUT = 30s; @@ -682,8 +683,10 @@ SessionImpl::SessionImpl(QObject *parent) m_updateTrackersFromURLTimer = new QTimer(this); m_updateTrackersFromURLTimer->setInterval(24h); connect(m_updateTrackersFromURLTimer, &QTimer::timeout, this, &SessionImpl::updateTrackersFromURL); + if (isAddTrackersFromURLEnabled()) { + updateTrackersFromFile(); updateTrackersFromURL(); m_updateTrackersFromURLTimer->start(); } @@ -3998,6 +4001,8 @@ void SessionImpl::setAddTrackersFromURLEnabled(const bool enabled) { m_updateTrackersFromURLTimer->stop(); setAdditionalTrackersFromURL({}); + const Path path = specialFolderLocation(SpecialFolder::Data) / Path(ADDITIONAL_TRACKERS_FROM_URL_FILE_NAME); + Utils::Fs::removeFile(path); } } } @@ -4040,7 +4045,8 @@ void SessionImpl::updateTrackersFromURL() } else { - Net::DownloadManager::instance()->download(Net::DownloadRequest(url) + const Path path = specialFolderLocation(SpecialFolder::Data) / ADDITIONAL_TRACKERS_FROM_URL_FILE_NAME; + Net::DownloadManager::instance()->download(Net::DownloadRequest(url).saveToFile(true).destFileName(path) , Preferences::instance()->useProxyForGeneralPurposes(), this, [this](const Net::DownloadResult &result) { if (result.status == Net::DownloadStatus::Success) @@ -6624,3 +6630,23 @@ void SessionImpl::handleRemovedTorrent(const TorrentID &torrentID, const QString m_removingTorrents.erase(removingTorrentDataIter); } + +void SessionImpl::updateTrackersFromFile() +{ + const qint64 fileMaxSize = 1024 * 1024; + const Path path = specialFolderLocation(SpecialFolder::Data) / Path(ADDITIONAL_TRACKERS_FROM_URL_FILE_NAME); + + const auto readResult = Utils::IO::readFile(path, fileMaxSize); + if (!readResult) + { + if (readResult.error().status == Utils::IO::ReadError::NotExist) + { + return; + } + + LogMsg(tr("Failed to load additional trackers from file. Reason: %1").arg(readResult.error().message), Log::WARNING); + return; + } + + setAdditionalTrackersFromURL(QString::fromUtf8(readResult.value())); +} diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index a6d337dfe1a8..4ebce63a5397 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -650,6 +650,7 @@ namespace BitTorrent void setAdditionalTrackersFromURL(const QString &trackers); void updateTrackersFromURL(); + void updateTrackersFromFile(); CachedSettingValue m_DHTBootstrapNodes; CachedSettingValue m_isDHTEnabled;