diff --git a/daemon/postprocess/ParParser.cpp b/daemon/postprocess/ParParser.cpp index d537c042..81c94277 100644 --- a/daemon/postprocess/ParParser.cpp +++ b/daemon/postprocess/ParParser.cpp @@ -44,7 +44,7 @@ bool ParParser::FindMainPars(const char* path, ParFileList* fileList) bool exists = false; for (CString& filename2 : fileList) { - exists = SameParCollection(filename, filename2); + exists = SameParCollection(filename, filename2, true); if (exists) { break; @@ -59,11 +59,11 @@ bool ParParser::FindMainPars(const char* path, ParFileList* fileList) return fileList && !fileList->empty(); } -bool ParParser::SameParCollection(const char* filename1, const char* filename2) +bool ParParser::SameParCollection(const char* filename1, const char* filename2, bool confirmedFilenames) { int baseLen1 = 0, baseLen2 = 0; - return ParseParFilename(filename1, false, &baseLen1, nullptr) && - ParseParFilename(filename2, false, &baseLen2, nullptr) && + return ParseParFilename(filename1, confirmedFilenames, &baseLen1, nullptr) && + ParseParFilename(filename2, confirmedFilenames, &baseLen2, nullptr) && baseLen1 == baseLen2 && !strncasecmp(filename1, filename2, baseLen1); } diff --git a/daemon/postprocess/ParParser.h b/daemon/postprocess/ParParser.h index 5c815b06..82157e22 100644 --- a/daemon/postprocess/ParParser.h +++ b/daemon/postprocess/ParParser.h @@ -31,7 +31,7 @@ public: static bool FindMainPars(const char* path, ParFileList* fileList); static bool ParseParFilename(const char* parFilename, bool confirmedFilename, int* baseNameLen, int* blocks); - static bool SameParCollection(const char* filename1, const char* filename2); + static bool SameParCollection(const char* filename1, const char* filename2, bool confirmedFilenames); }; #endif diff --git a/daemon/postprocess/Repair.cpp b/daemon/postprocess/Repair.cpp index d6731d6a..760d6e9e 100644 --- a/daemon/postprocess/Repair.cpp +++ b/daemon/postprocess/Repair.cpp @@ -410,7 +410,8 @@ void RepairController::FindPars(DownloadQueue* downloadQueue, NzbInfo* nzbInfo, if (exactParName) { - useFile = ParParser::SameParCollection(fileInfo->GetFilename(), FileSystem::BaseFileName(parFilename)); + useFile = ParParser::SameParCollection(fileInfo->GetFilename(), + FileSystem::BaseFileName(parFilename), fileInfo->GetFilenameConfirmed()); } else if (strictParName) { diff --git a/daemon/queue/QueueEditor.cpp b/daemon/queue/QueueEditor.cpp index a6d57896..2eccdbbc 100644 --- a/daemon/queue/QueueEditor.cpp +++ b/daemon/queue/QueueEditor.cpp @@ -29,6 +29,7 @@ #include "PrePostProcessor.h" #include "HistoryCoordinator.h" #include "UrlCoordinator.h" +#include "ParParser.h" const int MAX_ID = 1000000000; @@ -1272,14 +1273,42 @@ void QueueEditor::SortGroupFiles(NzbInfo* nzbInfo) { if (!fileInfo1->GetParFile() && !fileInfo2->GetParFile()) { - return strcmp(fileInfo1->GetFilename(), fileInfo2->GetFilename()) < 0; + // ".rar"-files are ordered before ".r01", etc. files + int len1 = strlen(fileInfo1->GetFilename()); + int len2 = strlen(fileInfo2->GetFilename()); + const char* ext1 = strrchr(fileInfo1->GetFilename(), '.'); + const char* ext2 = strrchr(fileInfo2->GetFilename(), '.'); + int ext1len = ext1 ? strlen(ext1) : 0; + int ext2len = ext2 ? strlen(ext2) : 0; + bool sameBaseName = len1 == len2 && ext1len == 4 && ext2len == 4 && + !strncmp(fileInfo1->GetFilename(), fileInfo2->GetFilename(), len1 - 4); + if (sameBaseName && !strcmp(ext1, ".rar") && ext2[1] == 'r' && + isnumber(ext2[2]) && isnumber(ext2[3])) + { + return true; + } + else if (sameBaseName && !strcmp(ext2, ".rar") && ext1[1] == 'r' && + isnumber(ext1[2]) && isnumber(ext1[3])) + { + return false; + } } - else if (fileInfo1->GetParFile() && fileInfo2->GetParFile()) + else if (fileInfo1->GetParFile() && fileInfo2->GetParFile() && + ParParser::SameParCollection(fileInfo1->GetFilename(), fileInfo2->GetFilename(), + fileInfo1->GetFilenameConfirmed() && fileInfo2->GetFilenameConfirmed())) { return fileInfo1->GetSize() < fileInfo2->GetSize(); } + else if (!fileInfo1->GetParFile() && fileInfo2->GetParFile()) + { + return true; + } + else if (fileInfo1->GetParFile() && !fileInfo2->GetParFile()) + { + return false; + } - return !fileInfo1->GetParFile() && fileInfo2->GetParFile(); + return strcmp(fileInfo1->GetFilename(), fileInfo2->GetFilename()) < 0; }); }