Improve torrent export feature. Closes #4205.

This commit is contained in:
Vladimir Golovnev (Glassez) 2015-12-01 17:41:56 +03:00
parent f4ef0633c9
commit 7cc5a3e050
4 changed files with 21 additions and 54 deletions

View file

@ -466,7 +466,8 @@ void Session::configure()
m_torrentExportEnabled = torrentExportEnabled;
if (m_torrentExportEnabled) {
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) ||
((folder == TorrentExportFolder::Finished) && m_finishedTorrentExportEnabled));
QString validName = Utils::Fs::toValidFileSystemName(torrent->name());
QString torrentFilename = QString("%1.torrent").arg(torrent->hash());
QString torrentExportFilename = QString("%1.torrent").arg(validName);
QString torrentPath = QDir(m_resumeFolderPath).absoluteFilePath(torrentFilename);
QDir exportPath(folder == TorrentExportFolder::Regular ? Preferences::instance()->getTorrentExportDir() : Preferences::instance()->getFinishedTorrentExportDir());
if (exportPath.exists() || exportPath.mkpath(exportPath.absolutePath())) {
QString newTorrentPath = exportPath.absoluteFilePath(torrentFilename);
if (QFile::exists(newTorrentPath) && Utils::Fs::sameFiles(torrentPath, newTorrentPath)) {
// Append hash to torrent name to make it unique
newTorrentPath = exportPath.absoluteFilePath(torrent->name() + "-" + torrentFilename);
}
QFile::copy(torrentPath, newTorrentPath);
}
}
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;
QString newTorrentPath = exportPath.absoluteFilePath(torrentExportFilename);
int counter = 0;
while (QFile::exists(newTorrentPath) && !Utils::Fs::sameFiles(torrentPath, newTorrentPath)) {
// Append number to torrent name to make it unique
torrentExportFilename = QString("%1 %2.torrent").arg(validName).arg(++counter);
newTorrentPath = exportPath.absoluteFilePath(torrentExportFilename);
}
const QString srcPath(resumeDataDir.absoluteFilePath(QString("%1.torrent").arg(torrent->hash())));
if (QFile::exists(srcPath)) {
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);
}
if (!QFile::exists(newTorrentPath))
QFile::copy(torrentPath, newTorrentPath);
}
}

View file

@ -293,7 +293,6 @@ namespace BitTorrent
void updateRatioTimer();
void exportTorrentFile(TorrentHandle *const torrent, TorrentExportFolder folder = TorrentExportFolder::Regular);
void exportTorrentFiles(QString path);
void saveTorrentResumeData(TorrentHandle *const torrent);
void handleAlert(libtorrent::alert *a);

View file

@ -250,13 +250,15 @@ bool Utils::Fs::sameFiles(const QString& path1, const QString& path2)
return same;
}
QString Utils::Fs::toValidFileSystemName(QString filename)
QString Utils::Fs::toValidFileSystemName(const QString &filename)
{
qDebug("toValidFSName: %s", qPrintable(filename));
const QRegExp regex("[\\\\/:?\"*<>|]");
filename.replace(regex, " ");
qDebug("toValidFSName, result: %s", qPrintable(filename));
return filename.trimmed();
static const QRegExp regex("[\\\\/:?\"*<>|]");
QString validName = filename.trimmed();
validName.replace(regex, " ");
qDebug() << "toValidFileSystemName:" << filename << "=>" << validName;
return validName;
}
bool Utils::Fs::isValidFileSystemName(const QString& filename)

View file

@ -48,7 +48,7 @@ namespace Utils
QString folderName(const QString& file_path);
qint64 computePathSize(const QString& path);
bool sameFiles(const QString& path1, const QString& path2);
QString toValidFileSystemName(QString filename);
QString toValidFileSystemName(const QString &filename);
bool isValidFileSystemName(const QString& filename);
qlonglong freeDiskSpaceOnPath(QString path);
QString branchPath(const QString& file_path, QString* removed = 0);