mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-23 04:54:18 +00:00
Merge pull request #4225 from glassez/export
Improve torrent export feature. Closes #4205.
This commit is contained in:
commit
78462dfa6c
@ -466,7 +466,8 @@ void Session::configure()
|
|||||||
m_torrentExportEnabled = torrentExportEnabled;
|
m_torrentExportEnabled = torrentExportEnabled;
|
||||||
if (m_torrentExportEnabled) {
|
if (m_torrentExportEnabled) {
|
||||||
qDebug("Torrent export is enabled, exporting the current torrents");
|
qDebug("Torrent export is enabled, exporting the current torrents");
|
||||||
exportTorrentFiles(pref->getTorrentExportDir());
|
for (auto torrent: m_torrents)
|
||||||
|
exportTorrentFile(torrent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1151,57 +1152,22 @@ void Session::exportTorrentFile(TorrentHandle *const torrent, TorrentExportFolde
|
|||||||
Q_ASSERT(((folder == TorrentExportFolder::Regular) && m_torrentExportEnabled) ||
|
Q_ASSERT(((folder == TorrentExportFolder::Regular) && m_torrentExportEnabled) ||
|
||||||
((folder == TorrentExportFolder::Finished) && m_finishedTorrentExportEnabled));
|
((folder == TorrentExportFolder::Finished) && m_finishedTorrentExportEnabled));
|
||||||
|
|
||||||
|
QString validName = Utils::Fs::toValidFileSystemName(torrent->name());
|
||||||
QString torrentFilename = QString("%1.torrent").arg(torrent->hash());
|
QString torrentFilename = QString("%1.torrent").arg(torrent->hash());
|
||||||
|
QString torrentExportFilename = QString("%1.torrent").arg(validName);
|
||||||
QString torrentPath = QDir(m_resumeFolderPath).absoluteFilePath(torrentFilename);
|
QString torrentPath = QDir(m_resumeFolderPath).absoluteFilePath(torrentFilename);
|
||||||
QDir exportPath(folder == TorrentExportFolder::Regular ? Preferences::instance()->getTorrentExportDir() : Preferences::instance()->getFinishedTorrentExportDir());
|
QDir exportPath(folder == TorrentExportFolder::Regular ? Preferences::instance()->getTorrentExportDir() : Preferences::instance()->getFinishedTorrentExportDir());
|
||||||
if (exportPath.exists() || exportPath.mkpath(exportPath.absolutePath())) {
|
if (exportPath.exists() || exportPath.mkpath(exportPath.absolutePath())) {
|
||||||
QString newTorrentPath = exportPath.absoluteFilePath(torrentFilename);
|
QString newTorrentPath = exportPath.absoluteFilePath(torrentExportFilename);
|
||||||
if (QFile::exists(newTorrentPath) && Utils::Fs::sameFiles(torrentPath, newTorrentPath)) {
|
int counter = 0;
|
||||||
// Append hash to torrent name to make it unique
|
while (QFile::exists(newTorrentPath) && !Utils::Fs::sameFiles(torrentPath, newTorrentPath)) {
|
||||||
newTorrentPath = exportPath.absoluteFilePath(torrent->name() + "-" + torrentFilename);
|
// Append number to torrent name to make it unique
|
||||||
}
|
torrentExportFilename = QString("%1 %2.torrent").arg(validName).arg(++counter);
|
||||||
QFile::copy(torrentPath, newTorrentPath);
|
newTorrentPath = exportPath.absoluteFilePath(torrentExportFilename);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Session::exportTorrentFiles(QString path)
|
|
||||||
{
|
|
||||||
// NOTE: Maybe create files from current metadata here?
|
|
||||||
Q_ASSERT(m_torrentExportEnabled);
|
|
||||||
|
|
||||||
QDir exportDir(path);
|
|
||||||
if (!exportDir.exists()) {
|
|
||||||
if (!exportDir.mkpath(exportDir.absolutePath())) {
|
|
||||||
Logger::instance()->addMessage(tr("Error: Could not create torrent export directory: '%1'").arg(exportDir.absolutePath()), Log::CRITICAL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QDir resumeDataDir(m_resumeFolderPath);
|
|
||||||
foreach (TorrentHandle *const torrent, m_torrents) {
|
|
||||||
if (!torrent->isValid()) {
|
|
||||||
Logger::instance()->addMessage(tr("Torrent Export: torrent is invalid, skipping..."), Log::CRITICAL);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString srcPath(resumeDataDir.absoluteFilePath(QString("%1.torrent").arg(torrent->hash())));
|
if (!QFile::exists(newTorrentPath))
|
||||||
if (QFile::exists(srcPath)) {
|
QFile::copy(torrentPath, newTorrentPath);
|
||||||
QString dstPath = exportDir.absoluteFilePath(QString("%1.torrent").arg(torrent->name()));
|
|
||||||
if (QFile::exists(dstPath)) {
|
|
||||||
if (!Utils::Fs::sameFiles(srcPath, dstPath)) {
|
|
||||||
dstPath = exportDir.absoluteFilePath(QString("%1-%2.torrent").arg(torrent->name()).arg(torrent->hash()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qDebug("Torrent Export: Destination file exists, skipping...");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
qDebug("Export Torrent: %s -> %s", qPrintable(srcPath), qPrintable(dstPath));
|
|
||||||
QFile::copy(srcPath, dstPath);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Logger::instance()->addMessage(tr("Error: could not export torrent '%1', maybe it has not metadata yet.").arg(torrent->hash()), Log::CRITICAL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +293,6 @@ namespace BitTorrent
|
|||||||
|
|
||||||
void updateRatioTimer();
|
void updateRatioTimer();
|
||||||
void exportTorrentFile(TorrentHandle *const torrent, TorrentExportFolder folder = TorrentExportFolder::Regular);
|
void exportTorrentFile(TorrentHandle *const torrent, TorrentExportFolder folder = TorrentExportFolder::Regular);
|
||||||
void exportTorrentFiles(QString path);
|
|
||||||
void saveTorrentResumeData(TorrentHandle *const torrent);
|
void saveTorrentResumeData(TorrentHandle *const torrent);
|
||||||
|
|
||||||
void handleAlert(libtorrent::alert *a);
|
void handleAlert(libtorrent::alert *a);
|
||||||
|
@ -250,13 +250,15 @@ bool Utils::Fs::sameFiles(const QString& path1, const QString& path2)
|
|||||||
return same;
|
return same;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Utils::Fs::toValidFileSystemName(QString filename)
|
QString Utils::Fs::toValidFileSystemName(const QString &filename)
|
||||||
{
|
{
|
||||||
qDebug("toValidFSName: %s", qPrintable(filename));
|
static const QRegExp regex("[\\\\/:?\"*<>|]");
|
||||||
const QRegExp regex("[\\\\/:?\"*<>|]");
|
|
||||||
filename.replace(regex, " ");
|
QString validName = filename.trimmed();
|
||||||
qDebug("toValidFSName, result: %s", qPrintable(filename));
|
validName.replace(regex, " ");
|
||||||
return filename.trimmed();
|
qDebug() << "toValidFileSystemName:" << filename << "=>" << validName;
|
||||||
|
|
||||||
|
return validName;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Utils::Fs::isValidFileSystemName(const QString& filename)
|
bool Utils::Fs::isValidFileSystemName(const QString& filename)
|
||||||
|
@ -48,7 +48,7 @@ namespace Utils
|
|||||||
QString folderName(const QString& file_path);
|
QString folderName(const QString& file_path);
|
||||||
qint64 computePathSize(const QString& path);
|
qint64 computePathSize(const QString& path);
|
||||||
bool sameFiles(const QString& path1, const QString& path2);
|
bool sameFiles(const QString& path1, const QString& path2);
|
||||||
QString toValidFileSystemName(QString filename);
|
QString toValidFileSystemName(const QString &filename);
|
||||||
bool isValidFileSystemName(const QString& filename);
|
bool isValidFileSystemName(const QString& filename);
|
||||||
qlonglong freeDiskSpaceOnPath(QString path);
|
qlonglong freeDiskSpaceOnPath(QString path);
|
||||||
QString branchPath(const QString& file_path, QString* removed = 0);
|
QString branchPath(const QString& file_path, QString* removed = 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user