diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 36f536815..ea51d4e8d 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -2502,7 +2502,15 @@ bool Session::addTorrent_impl(const std::variant &source TorrentImpl *const torrent = m_torrents.value(id); if (torrent) + { + if (hasMetadata) + { + // Trying to set metadata to existing torrent in case if it has none + torrent->setMetadata(std::get(source)); + } + return false; + } LoadTorrentParams loadTorrentParams = initLoadTorrentParams(addTorrentParams); lt::add_torrent_params &p = loadTorrentParams.ltAddTorrentParams; diff --git a/src/base/bittorrent/torrent.h b/src/base/bittorrent/torrent.h index 6b40ef27b..e1872e884 100644 --- a/src/base/bittorrent/torrent.h +++ b/src/base/bittorrent/torrent.h @@ -298,6 +298,7 @@ namespace BitTorrent virtual void removeUrlSeeds(const QVector &urlSeeds) = 0; virtual bool connectPeer(const PeerAddress &peerAddress) = 0; virtual void clearPeers() = 0; + virtual bool setMetadata(const TorrentInfo &torrentInfo) = 0; virtual QString createMagnetURI() const = 0; virtual nonstd::expected exportToBuffer() const = 0; diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index 2c99c09fe..31d0ac322 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -2126,6 +2126,19 @@ lt::torrent_handle TorrentImpl::nativeHandle() const return m_nativeHandle; } +bool TorrentImpl::setMetadata(const TorrentInfo &torrentInfo) +{ + if (hasMetadata()) + return false; + +#ifdef QBT_USES_LIBTORRENT2 + return m_nativeHandle.set_metadata(torrentInfo.nativeInfo()->info_section()); +#else + const std::shared_ptr nativeInfo = torrentInfo.nativeInfo(); + return m_nativeHandle.set_metadata(lt::span(nativeInfo->metadata().get(), nativeInfo->metadata_size())); +#endif +} + bool TorrentImpl::isMoveInProgress() const { return m_storageIsMoving; diff --git a/src/base/bittorrent/torrentimpl.h b/src/base/bittorrent/torrentimpl.h index 166868482..d1305f54f 100644 --- a/src/base/bittorrent/torrentimpl.h +++ b/src/base/bittorrent/torrentimpl.h @@ -225,6 +225,7 @@ namespace BitTorrent void removeUrlSeeds(const QVector &urlSeeds) override; bool connectPeer(const PeerAddress &peerAddress) override; void clearPeers() override; + bool setMetadata(const TorrentInfo &torrentInfo) override; QString createMagnetURI() const override; nonstd::expected exportToBuffer() const override; diff --git a/src/gui/addnewtorrentdialog.cpp b/src/gui/addnewtorrentdialog.cpp index 66dabb1c7..6039aa70a 100644 --- a/src/gui/addnewtorrentdialog.cpp +++ b/src/gui/addnewtorrentdialog.cpp @@ -435,6 +435,9 @@ bool AddNewTorrentDialog::loadTorrentImpl() BitTorrent::Torrent *const torrent = BitTorrent::Session::instance()->findTorrent(torrentID); if (torrent) { + // Trying to set metadata to existing torrent in case if it has none + torrent->setMetadata(m_torrentInfo); + if (torrent->isPrivate() || m_torrentInfo.isPrivate()) { RaisedMessageBox::warning(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers cannot be merged because it is a private torrent.").arg(torrent->name()), QMessageBox::Ok);