Browse Source

Merge pull request #8954 from Chocobo1/firstlast

Relax behavior of "Download first and last piece first"
adaptive-webui-19844
Mike Tzou 7 years ago committed by GitHub
parent
commit
cd21071c69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 66
      src/base/bittorrent/torrenthandle.cpp
  2. 2
      src/base/bittorrent/torrenthandle.h

66
src/base/bittorrent/torrenthandle.cpp

@ -781,28 +781,18 @@ bool TorrentHandle::hasFirstLastPiecePriority() const
if (!hasMetadata()) if (!hasMetadata())
return m_needsToSetFirstLastPiecePriority; return m_needsToSetFirstLastPiecePriority;
// Get int first media file const std::vector<int> filePriorities = nativeHandle().file_priorities();
std::vector<int> fp; for (int i = 0; i < static_cast<int>(filePriorities.size()); ++i) {
fp = m_nativeHandle.file_priorities(); if (filePriorities[i] <= 0)
continue;
TorrentInfo::PieceRange extremities; const TorrentInfo::PieceRange extremities = info().filePieces(i);
bool found = false; const int firstPiecePrio = nativeHandle().piece_priority(extremities.first());
int count = static_cast<int>(fp.size()); const int lastPiecePrio = nativeHandle().piece_priority(extremities.last());
for (int i = 0; i < count; ++i) { return ((firstPiecePrio == 7) && (lastPiecePrio == 7));
const QString ext = Utils::Fs::fileExtension(filePath(i));
if (Utils::Misc::isPreviewable(ext) && (fp[i] > 0)) {
extremities = info().filePieces(i);
found = true;
break;
} }
}
if (!found) return false; // No media file
int first = m_nativeHandle.piece_priority(extremities.first()); return false;
int last = m_nativeHandle.piece_priority(extremities.last());
return ((first == 7) && (last == 7));
} }
TorrentState TorrentHandle::state() const TorrentState TorrentHandle::state() const
@ -1302,39 +1292,37 @@ void TorrentHandle::toggleSequentialDownload()
setSequentialDownload(!isSequentialDownload()); setSequentialDownload(!isSequentialDownload());
} }
void TorrentHandle::setFirstLastPiecePriority(bool b) void TorrentHandle::setFirstLastPiecePriority(const bool enabled)
{ {
if (!hasMetadata()) { if (!hasMetadata()) {
m_needsToSetFirstLastPiecePriority = b; m_needsToSetFirstLastPiecePriority = enabled;
return; return;
} }
std::vector<int> fp = m_nativeHandle.file_priorities(); // Download first and last pieces first for every file in the torrent
std::vector<int> pp = m_nativeHandle.piece_priorities(); const std::vector<int> filePriorities = nativeHandle().file_priorities();
std::vector<int> piecePriorities = nativeHandle().piece_priorities();
// Download first and last pieces first for all media files in the torrent for (int index = 0; index < static_cast<int>(filePriorities.size()); ++index) {
int nbfiles = static_cast<int>(fp.size()); const int filePrio = filePriorities[index];
for (int index = 0; index < nbfiles; ++index) { if (filePrio <= 0)
const QString path = filePath(index); continue;
const QString ext = Utils::Fs::fileExtension(path);
if (Utils::Misc::isPreviewable(ext) && (fp[index] > 0)) {
qDebug() << "File" << path << "is previewable, toggle downloading of first/last pieces first";
// Determine the priority to set // Determine the priority to set
int prio = b ? 7 : fp[index]; const int newPrio = enabled ? 7 : filePrio;
const TorrentInfo::PieceRange extremities = info().filePieces(index);
TorrentInfo::PieceRange extremities = info().filePieces(index);
// worst case: AVI index = 1% of total file size (at the end of the file) // worst case: AVI index = 1% of total file size (at the end of the file)
int nNumPieces = ceil(fileSize(index) * 0.01 / pieceLength()); const int nNumPieces = std::ceil(fileSize(index) * 0.01 / pieceLength());
for (int i = 0; i < nNumPieces; ++i) { for (int i = 0; i < nNumPieces; ++i) {
pp[extremities.first() + i] = prio; piecePriorities[extremities.first() + i] = newPrio;
pp[extremities.last() - i] = prio; piecePriorities[extremities.last() - i] = newPrio;
}
} }
} }
m_nativeHandle.prioritize_pieces(pp); m_nativeHandle.prioritize_pieces(piecePriorities);
LogMsg(tr("Download first and last piece first: %1, torrent: '%2'")
.arg((enabled ? tr("On") : tr("Off")), name()));
} }
void TorrentHandle::toggleFirstLastPiecePriority() void TorrentHandle::toggleFirstLastPiecePriority()

2
src/base/bittorrent/torrenthandle.h

@ -333,7 +333,7 @@ namespace BitTorrent
void setName(const QString &name); void setName(const QString &name);
void setSequentialDownload(bool b); void setSequentialDownload(bool b);
void toggleSequentialDownload(); void toggleSequentialDownload();
void setFirstLastPiecePriority(bool b); void setFirstLastPiecePriority(bool enabled);
void toggleFirstLastPiecePriority(); void toggleFirstLastPiecePriority();
void pause(); void pause();
void resume(bool forced = false); void resume(bool forced = false);

Loading…
Cancel
Save