mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-03-10 20:31:47 +00:00
Merge pull request #7985 from Chocobo1/source
Add source field in Torrent creator
This commit is contained in:
commit
c8a5ef8c5d
@ -59,8 +59,6 @@ using namespace BitTorrent;
|
|||||||
|
|
||||||
TorrentCreatorThread::TorrentCreatorThread(QObject *parent)
|
TorrentCreatorThread::TorrentCreatorThread(QObject *parent)
|
||||||
: QThread(parent)
|
: QThread(parent)
|
||||||
, m_private(false)
|
|
||||||
, m_pieceSize(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,97 +68,91 @@ TorrentCreatorThread::~TorrentCreatorThread()
|
|||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentCreatorThread::create(const QString &inputPath, const QString &savePath, const QStringList &trackers,
|
void TorrentCreatorThread::create(const TorrentCreatorParams ¶ms)
|
||||||
const QStringList &urlSeeds, const QString &comment, bool isPrivate, int pieceSize)
|
|
||||||
{
|
{
|
||||||
m_inputPath = Utils::Fs::fromNativePath(inputPath);
|
m_params = params;
|
||||||
m_savePath = Utils::Fs::fromNativePath(savePath);
|
|
||||||
if (QFile(m_savePath).exists())
|
|
||||||
Utils::Fs::forceRemove(m_savePath);
|
|
||||||
m_trackers = trackers;
|
|
||||||
m_urlSeeds = urlSeeds;
|
|
||||||
m_comment = comment;
|
|
||||||
m_private = isPrivate;
|
|
||||||
m_pieceSize = pieceSize;
|
|
||||||
|
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentCreatorThread::sendProgressSignal(int numHashes, int numPieces)
|
void TorrentCreatorThread::sendProgressSignal(int currentPieceIdx, int totalPieces)
|
||||||
{
|
{
|
||||||
emit updateProgress(static_cast<int>((numHashes * 100.) / numPieces));
|
emit updateProgress(static_cast<int>((currentPieceIdx * 100.) / totalPieces));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentCreatorThread::run()
|
void TorrentCreatorThread::run()
|
||||||
{
|
{
|
||||||
|
const QString creatorStr("qBittorrent " QBT_VERSION);
|
||||||
|
|
||||||
emit updateProgress(0);
|
emit updateProgress(0);
|
||||||
|
|
||||||
QString creator_str("qBittorrent " QBT_VERSION);
|
|
||||||
try {
|
try {
|
||||||
libt::file_storage fs;
|
libt::file_storage fs;
|
||||||
// Adding files to the torrent
|
// Adding files to the torrent
|
||||||
libt::add_files(fs, Utils::Fs::toNativePath(m_inputPath).toStdString(), fileFilter);
|
libt::add_files(fs, Utils::Fs::toNativePath(m_params.inputPath).toStdString(), fileFilter);
|
||||||
|
|
||||||
if (isInterruptionRequested()) return;
|
if (isInterruptionRequested()) return;
|
||||||
|
|
||||||
libt::create_torrent t(fs, m_pieceSize);
|
libt::create_torrent newTorrent(fs, m_params.pieceSize);
|
||||||
|
|
||||||
// Add url seeds
|
// Add url seeds
|
||||||
foreach (const QString &seed, m_urlSeeds)
|
foreach (QString seed, m_params.urlSeeds) {
|
||||||
t.add_url_seed(seed.trimmed().toStdString());
|
seed = seed.trimmed();
|
||||||
|
if (!seed.isEmpty())
|
||||||
|
newTorrent.add_url_seed(seed.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
int tier = 0;
|
int tier = 0;
|
||||||
bool newline = false;
|
foreach (const QString &tracker, m_params.trackers) {
|
||||||
foreach (const QString &tracker, m_trackers) {
|
if (tracker.isEmpty())
|
||||||
if (tracker.isEmpty()) {
|
|
||||||
if (newline)
|
|
||||||
continue;
|
|
||||||
++tier;
|
++tier;
|
||||||
newline = true;
|
else
|
||||||
continue;
|
newTorrent.add_tracker(tracker.trimmed().toStdString(), tier);
|
||||||
}
|
|
||||||
t.add_tracker(tracker.trimmed().toStdString(), tier);
|
|
||||||
newline = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isInterruptionRequested()) return;
|
if (isInterruptionRequested()) return;
|
||||||
|
|
||||||
// calculate the hash for all pieces
|
// calculate the hash for all pieces
|
||||||
const QString parentPath = Utils::Fs::branchPath(m_inputPath) + "/";
|
const QString parentPath = Utils::Fs::branchPath(m_params.inputPath) + "/";
|
||||||
libt::set_piece_hashes(t, Utils::Fs::toNativePath(parentPath).toStdString(), boost::bind(&TorrentCreatorThread::sendProgressSignal, this, _1, t.num_pieces()));
|
libt::set_piece_hashes(newTorrent, Utils::Fs::toNativePath(parentPath).toStdString()
|
||||||
|
, [this, &newTorrent](const int n) { sendProgressSignal(n, newTorrent.num_pieces()); });
|
||||||
// Set qBittorrent as creator and add user comment to
|
// Set qBittorrent as creator and add user comment to
|
||||||
// torrent_info structure
|
// torrent_info structure
|
||||||
t.set_creator(creator_str.toUtf8().constData());
|
newTorrent.set_creator(creatorStr.toUtf8().constData());
|
||||||
t.set_comment(m_comment.toUtf8().constData());
|
newTorrent.set_comment(m_params.comment.toUtf8().constData());
|
||||||
// Is private ?
|
// Is private ?
|
||||||
t.set_priv(m_private);
|
newTorrent.set_priv(m_params.isPrivate);
|
||||||
|
|
||||||
if (isInterruptionRequested()) return;
|
if (isInterruptionRequested()) return;
|
||||||
|
|
||||||
// create the torrent and print it to out
|
libt::entry entry = newTorrent.generate();
|
||||||
qDebug("Saving to %s", qUtf8Printable(m_savePath));
|
|
||||||
|
// add source field
|
||||||
|
if (!m_params.source.isEmpty())
|
||||||
|
entry["info"]["source"] = m_params.source.toStdString();
|
||||||
|
|
||||||
|
if (isInterruptionRequested()) return;
|
||||||
|
|
||||||
|
// create the torrent
|
||||||
|
std::ofstream outfile(
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
wchar_t *savePathW = new wchar_t[m_savePath.length() + 1];
|
Utils::Fs::toNativePath(m_params.savePath).toStdWString().c_str()
|
||||||
int len = Utils::Fs::toNativePath(m_savePath).toWCharArray(savePathW);
|
|
||||||
savePathW[len] = L'\0';
|
|
||||||
std::ofstream outfile(savePathW, std::ios_base::out | std::ios_base::binary);
|
|
||||||
delete[] savePathW;
|
|
||||||
#else
|
#else
|
||||||
std::ofstream outfile(Utils::Fs::toNativePath(m_savePath).toLocal8Bit().constData(), std::ios_base::out | std::ios_base::binary);
|
Utils::Fs::toNativePath(m_params.savePath).toUtf8().constData()
|
||||||
#endif
|
#endif
|
||||||
|
, (std::ios_base::out | std::ios_base::binary | std::ios_base::trunc));
|
||||||
if (outfile.fail())
|
if (outfile.fail())
|
||||||
throw std::exception();
|
throw std::runtime_error(tr("create new torrent file failed").toStdString());
|
||||||
|
|
||||||
if (isInterruptionRequested()) return;
|
if (isInterruptionRequested()) return;
|
||||||
|
|
||||||
libt::bencode(std::ostream_iterator<char>(outfile), t.generate());
|
libt::bencode(std::ostream_iterator<char>(outfile), entry);
|
||||||
outfile.close();
|
outfile.close();
|
||||||
|
|
||||||
emit updateProgress(100);
|
emit updateProgress(100);
|
||||||
emit creationSuccess(m_savePath, parentPath);
|
emit creationSuccess(m_params.savePath, parentPath);
|
||||||
}
|
}
|
||||||
catch (std::exception& e) {
|
catch (const std::exception &e) {
|
||||||
emit creationFailure(QString::fromStdString(e.what()));
|
emit creationFailure(e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,16 +36,27 @@
|
|||||||
|
|
||||||
namespace BitTorrent
|
namespace BitTorrent
|
||||||
{
|
{
|
||||||
|
struct TorrentCreatorParams
|
||||||
|
{
|
||||||
|
bool isPrivate;
|
||||||
|
int pieceSize;
|
||||||
|
QString inputPath;
|
||||||
|
QString savePath;
|
||||||
|
QString comment;
|
||||||
|
QString source;
|
||||||
|
QStringList trackers;
|
||||||
|
QStringList urlSeeds;
|
||||||
|
};
|
||||||
|
|
||||||
class TorrentCreatorThread : public QThread
|
class TorrentCreatorThread : public QThread
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TorrentCreatorThread(QObject *parent = 0);
|
TorrentCreatorThread(QObject *parent = nullptr);
|
||||||
~TorrentCreatorThread();
|
~TorrentCreatorThread();
|
||||||
|
|
||||||
void create(const QString &inputPath, const QString &savePath, const QStringList &trackers,
|
void create(const TorrentCreatorParams ¶ms);
|
||||||
const QStringList &urlSeeds, const QString &comment, bool isPrivate, int pieceSize);
|
|
||||||
|
|
||||||
static int calculateTotalPieces(const QString &inputPath, const int pieceSize);
|
static int calculateTotalPieces(const QString &inputPath, const int pieceSize);
|
||||||
|
|
||||||
@ -58,15 +69,9 @@ namespace BitTorrent
|
|||||||
void updateProgress(int progress);
|
void updateProgress(int progress);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void sendProgressSignal(int numHashes, int numPieces);
|
void sendProgressSignal(int currentPieceIdx, int totalPieces);
|
||||||
|
|
||||||
QString m_inputPath;
|
TorrentCreatorParams m_params;
|
||||||
QString m_savePath;
|
|
||||||
QStringList m_trackers;
|
|
||||||
QStringList m_urlSeeds;
|
|
||||||
QString m_comment;
|
|
||||||
bool m_private;
|
|
||||||
int m_pieceSize;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +60,7 @@ TorrentCreatorDlg::TorrentCreatorDlg(QWidget *parent, const QString &defaultPath
|
|||||||
, m_storeWebSeedList(SETTINGS_KEY("WebSeedList"))
|
, m_storeWebSeedList(SETTINGS_KEY("WebSeedList"))
|
||||||
, m_storeComments(SETTINGS_KEY("Comments"))
|
, m_storeComments(SETTINGS_KEY("Comments"))
|
||||||
, m_storeLastSavePath(SETTINGS_KEY("LastSavePath"), QDir::homePath())
|
, m_storeLastSavePath(SETTINGS_KEY("LastSavePath"), QDir::homePath())
|
||||||
|
, m_storeSource(SETTINGS_KEY("Source"))
|
||||||
{
|
{
|
||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
@ -161,12 +162,15 @@ void TorrentCreatorDlg::onCreateButtonClicked()
|
|||||||
setInteractionEnabled(false);
|
setInteractionEnabled(false);
|
||||||
setCursor(QCursor(Qt::WaitCursor));
|
setCursor(QCursor(Qt::WaitCursor));
|
||||||
|
|
||||||
QStringList trackers = m_ui->trackersList->toPlainText().split("\n");
|
const QStringList trackers = m_ui->trackersList->toPlainText().trimmed()
|
||||||
QStringList urlSeeds = m_ui->URLSeedsList->toPlainText().split("\n");
|
.replace(QRegularExpression("\n\n[\n]+"), "\n\n").split('\n');
|
||||||
QString comment = m_ui->txtComment->toPlainText();
|
const QStringList urlSeeds = m_ui->URLSeedsList->toPlainText().split('\n', QString::SkipEmptyParts);
|
||||||
|
const QString comment = m_ui->txtComment->toPlainText();
|
||||||
|
const QString source = m_ui->lineEditSource->text();
|
||||||
|
|
||||||
// run the creator thread
|
// run the creator thread
|
||||||
m_creatorThread->create(input, destination, trackers, urlSeeds, comment, m_ui->checkPrivate->isChecked(), getPieceSize());
|
m_creatorThread->create({ m_ui->checkPrivate->isChecked(), getPieceSize()
|
||||||
|
, input, destination, comment, source, trackers, urlSeeds });
|
||||||
}
|
}
|
||||||
|
|
||||||
void TorrentCreatorDlg::handleCreationFailure(const QString &msg)
|
void TorrentCreatorDlg::handleCreationFailure(const QString &msg)
|
||||||
@ -240,6 +244,7 @@ void TorrentCreatorDlg::saveSettings()
|
|||||||
m_storeTrackerList = m_ui->trackersList->toPlainText();
|
m_storeTrackerList = m_ui->trackersList->toPlainText();
|
||||||
m_storeWebSeedList = m_ui->URLSeedsList->toPlainText();
|
m_storeWebSeedList = m_ui->URLSeedsList->toPlainText();
|
||||||
m_storeComments = m_ui->txtComment->toPlainText();
|
m_storeComments = m_ui->txtComment->toPlainText();
|
||||||
|
m_storeSource = m_ui->lineEditSource->text();
|
||||||
|
|
||||||
m_storeDialogSize = size();
|
m_storeDialogSize = size();
|
||||||
}
|
}
|
||||||
@ -257,6 +262,7 @@ void TorrentCreatorDlg::loadSettings()
|
|||||||
m_ui->trackersList->setPlainText(m_storeTrackerList);
|
m_ui->trackersList->setPlainText(m_storeTrackerList);
|
||||||
m_ui->URLSeedsList->setPlainText(m_storeWebSeedList);
|
m_ui->URLSeedsList->setPlainText(m_storeWebSeedList);
|
||||||
m_ui->txtComment->setPlainText(m_storeComments);
|
m_ui->txtComment->setPlainText(m_storeComments);
|
||||||
|
m_ui->lineEditSource->setText(m_storeSource);
|
||||||
|
|
||||||
if (m_storeDialogSize.value().isValid())
|
if (m_storeDialogSize.value().isValid())
|
||||||
resize(m_storeDialogSize);
|
resize(m_storeDialogSize);
|
||||||
|
@ -85,6 +85,7 @@ private:
|
|||||||
CachedSettingValue<QString> m_storeWebSeedList;
|
CachedSettingValue<QString> m_storeWebSeedList;
|
||||||
CachedSettingValue<QString> m_storeComments;
|
CachedSettingValue<QString> m_storeComments;
|
||||||
CachedSettingValue<QString> m_storeLastSavePath;
|
CachedSettingValue<QString> m_storeLastSavePath;
|
||||||
|
CachedSettingValue<QString> m_storeSource;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -273,6 +273,16 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="labelSource">
|
||||||
|
<property name="text">
|
||||||
|
<string>Source:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEditSource"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user