mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-01-06 15:04:34 +08:00
Improve strip torrent root folder
Fix issue when you rename the "root item" in the "Add New Torrent" dialog and uncheck "Create subfolder", it will create the subfolder with the renamed name. Fix PropertiesWidget first folder is expanded after app restart. Strip root folder if torrent was added via magnet link. Fix crash when you get name of torrent without metadata.
This commit is contained in:
parent
4b2d8a7941
commit
d413bc65ef
@ -1652,11 +1652,9 @@ bool Session::addTorrent_impl(AddTorrentData addData, const MagnetUri &magnetUri
|
||||
p = magnetUri.addTorrentParams();
|
||||
}
|
||||
else if (torrentInfo.isValid()) {
|
||||
if (!addData.resumed && !addData.createSubfolder && torrentInfo.filesCount() > 1) {
|
||||
libtorrent::file_storage files = torrentInfo.files();
|
||||
files.set_name("");
|
||||
torrentInfo.remapFiles(files);
|
||||
}
|
||||
if (!addData.resumed && !addData.hasRootFolder)
|
||||
torrentInfo.stripRootFolder();
|
||||
|
||||
// Metadata
|
||||
if (!addData.resumed && !addData.hasSeedStatus)
|
||||
findIncompleteFiles(torrentInfo, savePath);
|
||||
@ -3651,6 +3649,7 @@ namespace
|
||||
torrentData.name = QString::fromStdString(fast.dict_find_string_value("qBt-name"));
|
||||
torrentData.hasSeedStatus = fast.dict_find_int_value("qBt-seedStatus");
|
||||
torrentData.disableTempPath = fast.dict_find_int_value("qBt-tempPathDisabled");
|
||||
torrentData.hasRootFolder = fast.dict_find_int_value("qBt-hasRootFolder");
|
||||
|
||||
magnetUri = MagnetUri(QString::fromStdString(fast.dict_find_string_value("qBt-magnetUri")));
|
||||
torrentData.addPaused = fast.dict_find_int_value("qBt-paused");
|
||||
|
@ -89,6 +89,7 @@ AddTorrentData::AddTorrentData(const AddTorrentParams ¶ms)
|
||||
, sequential(params.sequential)
|
||||
, hasSeedStatus(params.skipChecking) // do not react on 'torrent_finished_alert' when skipping
|
||||
, skipChecking(params.skipChecking)
|
||||
, hasRootFolder(params.createSubfolder)
|
||||
, addForced(params.addForced)
|
||||
, addPaused(params.addPaused)
|
||||
, filePriorities(params.filePriorities)
|
||||
@ -152,7 +153,6 @@ TorrentState::operator int() const
|
||||
return m_value;
|
||||
}
|
||||
|
||||
, createSubfolder(in.createSubfolder)
|
||||
// TorrentHandle
|
||||
|
||||
const qreal TorrentHandle::USE_GLOBAL_RATIO = -2.;
|
||||
@ -200,6 +200,7 @@ TorrentHandle::TorrentHandle(Session *session, const libtorrent::torrent_handle
|
||||
, m_ratioLimit(data.ratioLimit)
|
||||
, m_tempPathDisabled(data.disableTempPath)
|
||||
, m_hasMissingFiles(false)
|
||||
, m_hasRootFolder(data.hasRootFolder)
|
||||
, m_pauseAfterRecheck(false)
|
||||
, m_needSaveResumeData(false)
|
||||
{
|
||||
@ -209,8 +210,13 @@ TorrentHandle::TorrentHandle(Session *session, const libtorrent::torrent_handle
|
||||
updateStatus();
|
||||
m_hash = InfoHash(m_nativeStatus.info_hash);
|
||||
|
||||
if (!data.resumed)
|
||||
if (!data.resumed) {
|
||||
setSequentialDownload(data.sequential);
|
||||
if (hasMetadata()) {
|
||||
if (filesCount() == 1)
|
||||
m_hasRootFolder = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TorrentHandle::~TorrentHandle() {}
|
||||
@ -231,8 +237,8 @@ QString TorrentHandle::name() const
|
||||
if (name.isEmpty())
|
||||
name = QString::fromStdString(m_nativeStatus.name);
|
||||
|
||||
if (name.isEmpty())
|
||||
name = QString::fromStdString(m_torrentInfo.origFiles().name());
|
||||
if (name.isEmpty() && hasMetadata())
|
||||
name = QString::fromStdString(m_torrentInfo.nativeInfo()->orig_files().name());
|
||||
|
||||
if (name.isEmpty())
|
||||
name = m_hash;
|
||||
@ -338,6 +344,11 @@ void TorrentHandle::setAutoTMMEnabled(bool enabled)
|
||||
move_impl(m_session->categorySavePath(m_category));
|
||||
}
|
||||
|
||||
bool TorrentHandle::hasRootFolder() const
|
||||
{
|
||||
return m_hasRootFolder;
|
||||
}
|
||||
|
||||
QString TorrentHandle::nativeActualSavePath() const
|
||||
{
|
||||
return QString::fromStdString(m_nativeStatus.save_path);
|
||||
@ -1493,6 +1504,7 @@ void TorrentHandle::handleSaveResumeDataAlert(libtorrent::save_resume_data_alert
|
||||
resumeData["qBt-seedStatus"] = m_hasSeedStatus;
|
||||
resumeData["qBt-tempPathDisabled"] = m_tempPathDisabled;
|
||||
resumeData["qBt-queuePosition"] = queuePosition();
|
||||
resumeData["qBt-hasRootFolder"] = m_hasRootFolder;
|
||||
|
||||
m_session->handleTorrentResumeDataReady(this, resumeData);
|
||||
}
|
||||
@ -1594,6 +1606,10 @@ void TorrentHandle::handleMetadataReceivedAlert(libt::metadata_received_alert *p
|
||||
updateStatus();
|
||||
if (m_session->isAppendExtensionEnabled())
|
||||
manageIncompleteFiles();
|
||||
if (!m_hasRootFolder)
|
||||
m_torrentInfo.stripRootFolder();
|
||||
if (filesCount() == 1)
|
||||
m_hasRootFolder = false;
|
||||
m_session->handleTorrentMetadataReceived(this);
|
||||
|
||||
if (isPaused()) {
|
||||
|
@ -98,7 +98,7 @@ namespace BitTorrent
|
||||
bool sequential;
|
||||
bool hasSeedStatus;
|
||||
bool skipChecking;
|
||||
bool createSubfolder;
|
||||
bool hasRootFolder;
|
||||
TriStateBool addForced;
|
||||
TriStateBool addPaused;
|
||||
// for new torrents
|
||||
@ -236,6 +236,8 @@ namespace BitTorrent
|
||||
bool belongsToCategory(const QString &category) const;
|
||||
bool setCategory(const QString &category);
|
||||
|
||||
bool hasRootFolder() const;
|
||||
|
||||
int filesCount() const;
|
||||
int piecesCount() const;
|
||||
int piecesHave() const;
|
||||
@ -396,7 +398,7 @@ namespace BitTorrent
|
||||
Session *const m_session;
|
||||
libtorrent::torrent_handle m_nativeHandle;
|
||||
libtorrent::torrent_status m_nativeStatus;
|
||||
TorrentState m_state;
|
||||
TorrentState m_state;
|
||||
TorrentInfo m_torrentInfo;
|
||||
SpeedMonitor m_speedMonitor;
|
||||
|
||||
@ -422,6 +424,7 @@ namespace BitTorrent
|
||||
qreal m_ratioLimit;
|
||||
bool m_tempPathDisabled;
|
||||
bool m_hasMissingFiles;
|
||||
bool m_hasRootFolder;
|
||||
|
||||
bool m_pauseAfterRecheck;
|
||||
bool m_needSaveResumeData;
|
||||
|
@ -276,22 +276,10 @@ TorrentInfo::PieceRange TorrentInfo::filePieces(int fileIndex) const
|
||||
static_cast<int>((firstOffset + fileSize - 1) / pieceLength()));
|
||||
}
|
||||
|
||||
libtorrent::file_storage TorrentInfo::files() const
|
||||
{
|
||||
if (!isValid()) return libtorrent::file_storage();
|
||||
return m_nativeInfo->files();
|
||||
}
|
||||
|
||||
libtorrent::file_storage TorrentInfo::origFiles() const
|
||||
{
|
||||
if (!isValid()) return libtorrent::file_storage();
|
||||
return m_nativeInfo->orig_files();
|
||||
}
|
||||
|
||||
void TorrentInfo::renameFile(uint index, const QString &newPath)
|
||||
{
|
||||
if (!isValid()) return;
|
||||
nativeInfo()->rename_file(index, newPath.toStdString());
|
||||
nativeInfo()->rename_file(index, Utils::Fs::toNativePath(newPath).toStdString());
|
||||
}
|
||||
|
||||
int BitTorrent::TorrentInfo::fileIndex(const QString& fileName) const
|
||||
@ -305,10 +293,22 @@ int BitTorrent::TorrentInfo::fileIndex(const QString& fileName) const
|
||||
return -1;
|
||||
}
|
||||
|
||||
void TorrentInfo::remapFiles(libtorrent::file_storage const &fileStorage)
|
||||
void TorrentInfo::stripRootFolder()
|
||||
{
|
||||
if (!isValid()) return;
|
||||
m_nativeInfo->remap_files(fileStorage);
|
||||
if (filesCount() <= 1) return;
|
||||
|
||||
libtorrent::file_storage files = m_nativeInfo->files();
|
||||
|
||||
// Solution for case of renamed root folder
|
||||
std::string testName = filePath(0).split('/').value(0).toStdString();
|
||||
if (files.name() != testName) {
|
||||
files.set_name(testName);
|
||||
for (int i = 0; i < files.num_files(); ++i)
|
||||
files.rename_file(i, files.file_path(i));
|
||||
}
|
||||
|
||||
files.set_name("");
|
||||
m_nativeInfo->remap_files(files);
|
||||
}
|
||||
|
||||
TorrentInfo::NativePtr TorrentInfo::nativeInfo() const
|
||||
|
@ -98,12 +98,9 @@ namespace BitTorrent
|
||||
PieceRange filePieces(const QString &file) const;
|
||||
PieceRange filePieces(int fileIndex) const;
|
||||
|
||||
libtorrent::file_storage files() const;
|
||||
libtorrent::file_storage origFiles() const;
|
||||
|
||||
void renameFile(uint index, const QString &newPath);
|
||||
void stripRootFolder();
|
||||
|
||||
void remapFiles(libtorrent::file_storage const &fileStorage);
|
||||
NativePtr nativeInfo() const;
|
||||
|
||||
private:
|
||||
|
@ -315,10 +315,8 @@ void PropertiesWidget::loadTorrentInfos(BitTorrent::TorrentHandle *const torrent
|
||||
label_created_by_val->setText(m_torrent->creator().toHtmlEscaped());
|
||||
|
||||
// List files in torrent
|
||||
BitTorrent::TorrentInfo info = m_torrent->info();
|
||||
libtorrent::file_storage files = info.files();
|
||||
PropListModel->model()->setupModelData(info);
|
||||
if (!(info.filesCount() > 1 && files.name().empty()))
|
||||
PropListModel->model()->setupModelData(m_torrent->info());
|
||||
if ((m_torrent->filesCount() > 1) && (PropListModel->model()->rowCount() == 1))
|
||||
filesList->setExpanded(PropListModel->index(0, 0), true);
|
||||
|
||||
// Load file priorities
|
||||
|
Loading…
Reference in New Issue
Block a user