bool QueueScriptCoordinator::UsableScript(ScriptConfig::Script& script, NzbInfo* nzbInfo, EEvent event) { if (!script.GetQueueScript()) { return false; } if (!Util::EmptyStr(script.GetQueueEvents()) && !strstr(script.GetQueueEvents(), QUEUE_EVENT_NAMES[event])) { return false; } // check extension scripts assigned for that nzb for (NzbParameter& parameter : nzbInfo->GetParameters()) { const char* varname = parameter.GetName(); if (strlen(varname) > 0 && varname[0] != '*' && varname[strlen(varname)-1] == ':' && (!strcasecmp(parameter.GetValue(), "yes") || !strcasecmp(parameter.GetValue(), "on") || !strcasecmp(parameter.GetValue(), "1"))) { BString<1024> scriptName = varname; scriptName[strlen(scriptName)-1] = '\0'; // remove trailing ':' if (FileSystem::SameFilename(scriptName, script.GetName())) { return true; } } } // for URL-events the extension scripts are not assigned yet; // instead we take the default extension scripts for the category (or global) if (event == qeUrlCompleted) { const char* postScript = g_Options->GetExtensions(); if (!Util::EmptyStr(nzbInfo->GetCategory())) { Options::Category* categoryObj = g_Options->FindCategory(nzbInfo->GetCategory(), false); if (categoryObj && !Util::EmptyStr(categoryObj->GetExtensions())) { postScript = categoryObj->GetExtensions(); } } if (!Util::EmptyStr(postScript)) { Tokenizer tok(postScript, ",;"); while (const char* scriptName = tok.Next()) { if (FileSystem::SameFilename(scriptName, script.GetName())) { return true; } } } } return false; }
void Scanner::InitPPParameters(const char* szCategory, NZBParameterList* pParameters, bool bReset) { bool bUnpack = g_pOptions->GetUnpack(); const char* szPostScript = g_pOptions->GetPostScript(); if (!Util::EmptyStr(szCategory)) { Options::Category* pCategory = g_pOptions->FindCategory(szCategory, false); if (pCategory) { bUnpack = pCategory->GetUnpack(); if (!Util::EmptyStr(pCategory->GetPostScript())) { szPostScript = pCategory->GetPostScript(); } } } if (bReset) { for (Options::Scripts::iterator it = g_pOptions->GetScripts()->begin(); it != g_pOptions->GetScripts()->end(); it++) { Options::Script* pScript = *it; char szParam[1024]; snprintf(szParam, 1024, "%s:", pScript->GetName()); szParam[1024-1] = '\0'; pParameters->SetParameter(szParam, NULL); } } pParameters->SetParameter("*Unpack:", bUnpack ? "yes" : "no"); if (!Util::EmptyStr(szPostScript)) { // split szPostScript into tokens and create pp-parameter for each token Tokenizer tok(szPostScript, ",;"); while (const char* szScriptName = tok.Next()) { char szParam[1024]; snprintf(szParam, 1024, "%s:", szScriptName); szParam[1024-1] = '\0'; pParameters->SetParameter(szParam, "yes"); } } }
void QueueEditor::SetNzbCategory(NzbInfo* nzbInfo, const char* category, bool applyParams) { debug("QueueEditor: setting category '%s' for '%s'", category, nzbInfo->GetName()); bool oldUnpack = g_Options->GetUnpack(); const char* oldPostScript = g_Options->GetPostScript(); if (applyParams && !Util::EmptyStr(nzbInfo->GetCategory())) { Options::Category* categoryObj = g_Options->FindCategory(nzbInfo->GetCategory(), false); if (categoryObj) { oldUnpack = categoryObj->GetUnpack(); if (!Util::EmptyStr(categoryObj->GetPostScript())) { oldPostScript = categoryObj->GetPostScript(); } } } g_QueueCoordinator->SetQueueEntryCategory(m_downloadQueue, nzbInfo, category); if (!applyParams) { return; } bool newUnpack = g_Options->GetUnpack(); const char* newPostScript = g_Options->GetPostScript(); if (!Util::EmptyStr(nzbInfo->GetCategory())) { Options::Category* categoryObj = g_Options->FindCategory(nzbInfo->GetCategory(), false); if (categoryObj) { newUnpack = categoryObj->GetUnpack(); if (!Util::EmptyStr(categoryObj->GetPostScript())) { newPostScript = categoryObj->GetPostScript(); } } } if (oldUnpack != newUnpack) { nzbInfo->GetParameters()->SetParameter("*Unpack:", newUnpack ? "yes" : "no"); } if (strcasecmp(oldPostScript, newPostScript)) { // add new params not existed in old category Tokenizer tokNew(newPostScript, ",;"); while (const char* newScriptName = tokNew.Next()) { bool found = false; const char* oldScriptName; Tokenizer tokOld(oldPostScript, ",;"); while ((oldScriptName = tokOld.Next()) && !found) { found = !strcasecmp(newScriptName, oldScriptName); } if (!found) { nzbInfo->GetParameters()->SetParameter(BString<1024>("%s:", newScriptName), "yes"); } } // remove old params not existed in new category Tokenizer tokOld(oldPostScript, ",;"); while (const char* oldScriptName = tokOld.Next()) { bool found = false; const char* newScriptName; Tokenizer tokNew(newPostScript, ",;"); while ((newScriptName = tokNew.Next()) && !found) { found = !strcasecmp(newScriptName, oldScriptName); } if (!found) { nzbInfo->GetParameters()->SetParameter(BString<1024>("%s:", oldScriptName), "no"); } } } }
Scanner::EAddStatus Scanner::AddExternalFile(const char* szNZBName, const char* szCategory, int iPriority, const char* szDupeKey, int iDupeScore, EDupeMode eDupeMode, NZBParameterList* pParameters, bool bAddTop, bool bAddPaused, NZBInfo* pUrlInfo, const char* szFileName, const char* szBuffer, int iBufSize, int* pNZBID) { bool bNZB = false; char szTempFileName[1024]; if (szFileName) { strncpy(szTempFileName, szFileName, 1024); szTempFileName[1024-1] = '\0'; } else { int iNum = 1; while (iNum == 1 || Util::FileExists(szTempFileName)) { snprintf(szTempFileName, 1024, "%snzb-%i.tmp", g_pOptions->GetTempDir(), iNum); szTempFileName[1024-1] = '\0'; iNum++; } if (!Util::SaveBufferIntoFile(szTempFileName, szBuffer, iBufSize)) { error("Could not create file %s", szTempFileName); return asFailed; } char buf[1024]; strncpy(buf, szBuffer, 1024); buf[1024-1] = '\0'; bNZB = !strncmp(buf, "<?xml", 5) && strstr(buf, "<nzb"); } // move file into NzbDir, make sure the file name is unique char szValidNZBName[1024]; strncpy(szValidNZBName, Util::BaseFileName(szNZBName), 1024); szValidNZBName[1024-1] = '\0'; Util::MakeValidFilename(szValidNZBName, '_', false); #ifdef WIN32 WebUtil::Utf8ToAnsi(szValidNZBName, 1024); #endif const char* szExtension = strrchr(szNZBName, '.'); if (bNZB && (!szExtension || strcasecmp(szExtension, ".nzb"))) { strncat(szValidNZBName, ".nzb", 1024 - strlen(szValidNZBName) - 1); } char szScanFileName[1024]; snprintf(szScanFileName, 1024, "%s%s", g_pOptions->GetNzbDir(), szValidNZBName); char *szExt = strrchr(szValidNZBName, '.'); if (szExt) { *szExt = '\0'; szExt++; } int iNum = 2; while (Util::FileExists(szScanFileName)) { if (szExt) { snprintf(szScanFileName, 1024, "%s%s_%i.%s", g_pOptions->GetNzbDir(), szValidNZBName, iNum, szExt); } else { snprintf(szScanFileName, 1024, "%s%s_%i", g_pOptions->GetNzbDir(), szValidNZBName, iNum); } szScanFileName[1024-1] = '\0'; iNum++; } m_mutexScan.Lock(); if (!Util::MoveFile(szTempFileName, szScanFileName)) { char szSysErrStr[256]; error("Could not move file %s to %s: %s", szTempFileName, szScanFileName, Util::GetLastErrorMessage(szSysErrStr, sizeof(szSysErrStr))); remove(szTempFileName); m_mutexScan.Unlock(); // UNLOCK return asFailed; } char* szUseCategory = strdup(szCategory ? szCategory : ""); Options::Category *pCategory = g_pOptions->FindCategory(szUseCategory, true); if (pCategory && strcmp(szUseCategory, pCategory->GetName())) { free(szUseCategory); szUseCategory = strdup(pCategory->GetName()); detail("Category %s matched to %s for %s", szCategory, szUseCategory, szNZBName); } EAddStatus eAddStatus = asSkipped; QueueData* pQueueData = new QueueData(szScanFileName, szNZBName, szUseCategory, iPriority, szDupeKey, iDupeScore, eDupeMode, pParameters, bAddTop, bAddPaused, pUrlInfo, &eAddStatus, pNZBID); free(szUseCategory); m_QueueList.push_back(pQueueData); m_mutexScan.Unlock(); ScanNZBDir(true); return eAddStatus; }