BOOL CSVPNet::CheckUpdaterExe(CString szFileVerHash, CString szPath){ FILE* stream_updater_exe; CString szTmpFilename = this->svpToolBox.getTmpFileName(); if ( _wfopen_s( &stream_updater_exe, szTmpFilename, _T("wb") ) != 0){ return 0; //input file open error } CURL *curl; CURLcode res; CString szPostPerm; szPostPerm.Format(_T( "branch=updater%s¤t=%s" ), BRANCHVER, szFileVerHash); int rret = 0; curl = curl_easy_init(); if(curl) { long respcode; this->SetCURLopt(curl); curl_easy_setopt(curl, CURLOPT_URL, GetUrlByType('upda' , iTryID)); int iDescLen = 0; char* szPostFields = svpToolBox.CStringToUTF8(szPostPerm, &iDescLen) ; curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (void *)szPostFields); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)stream_updater_exe); res = curl_easy_perform(curl); if(res == 0){ curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &respcode); if(respcode == 200){ //good to go rret = 1; }else{ //error SVP_LogMsg(_T("None Update Required For Updater")); } }else{ //error SVP_LogMsg5(_T("HTTP connection error %d %s ") , res, CStringW(curl_easy_strerror(res))); //TODO handle this } curl_easy_cleanup(curl); } fclose(stream_updater_exe); if (rret){ if ( this->svpToolBox.unpackGZfile( szTmpFilename , szPath) == 0 ){ SVP_LogMsg(_T("Copy Updater.exe Sucesssed")); }else{ SVP_LogMsg(_T("Copy Updater.exe Failed")); rret = 0; } } return rret; }
int CSVPNet::WetherNeedUploadSub(CString fnVideoFilePath, CString szFileHash,CString fnSubHash, int iDelayMS){ CURL *curl; CURLcode res; CString szPostPerm ; szPostPerm.Format(_T( "pathinfo=%s&filehash=%s&subhash=%s&subdelay=%d" ) , fnVideoFilePath ,szFileHash , fnSubHash, iDelayMS); int rret = -1; curl = curl_easy_init(); if(curl) { long respcode; this->SetCURLopt(curl); curl_easy_setopt(curl, CURLOPT_URL, GetUrlByType('upsb', iTryID)); int iDescLen = 0; char* szPostFields = svpToolBox.CStringToUTF8(szPostPerm, &iDescLen) ; curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (void *)szPostFields); res = curl_easy_perform(curl); if(res == 0){ curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &respcode); if(respcode == 200){ //good to go // continues to upload sub rret = 1; }if(respcode == 404){ //error rret = 0; SVP_LogMsg(_T("Already Have same sub in databases")); } }else{ //error SVP_LogMsg5(_T("HTTP connection error %d %s ") , res, CStringW(curl_easy_strerror(res))); //TODO handle this } curl_easy_cleanup(curl); } return rret; }
int CSVPNet::QuerySubByVideoPathOrHash_STL(std::wstring szFilePath, std::wstring szFileHash, std::wstring szVHash, std::wstring szLang) { CURL *curl; CURLcode res; int ret = 0; std::wstring szPostPerm = L"pathinfo=" + szFilePath + L"&filehash=" + szFileHash + L"&vhash=" + szVHash + L"&lang=" + szLang + L"&shortname=" + svpToolBox.GetShortFileNameForSearch_STL(szFilePath); struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; curl_global_init(CURL_GLOBAL_ALL); char* szTerm2; char* szTerm3; int iDescLen = 0; szTerm2 = svpToolBox.CStringToUTF8(szFilePath.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "pathinfo", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); szTerm3 = svpToolBox.CStringToUTF8(szFileHash.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "filehash", CURLFORM_COPYCONTENTS, szTerm3,CURLFORM_END); szVHash = genVHash(szTerm2, szTerm3, uniqueIDHash); free(szTerm2); free(szTerm3); if (!szVHash.empty()) { szTerm2 = svpToolBox.CStringToUTF8(szVHash.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "vhash", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); } AppSettings& s = AfxGetAppSettings(); std::wstring szSVPSubPerf = (LPCTSTR)s.szSVPSubPerf; if (!szSVPSubPerf.empty()) { szTerm2 = svpToolBox.CStringToUTF8(szSVPSubPerf.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "perf", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); } if (!szLang.empty()) { szTerm2 = svpToolBox.CStringToUTF8(szLang.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "lang", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); } szTerm2 = svpToolBox.CStringToUTF8(svpToolBox.GetShortFileNameForSearch_STL(szFilePath).c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "shortname", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); FILE *stream_http_recv_buffer = svpToolBox.getTmpFileSteam(); if (!stream_http_recv_buffer) { SVP_LogMsg(_T("TmpFile Creation for http recv buff fail")); //// TODO: 1. warning!! OR switch to memfile system return -1; } int err = 0; curl = curl_easy_init(); if (curl) { long respcode; wchar_t szFailMsg[1024]; SetCURLopt(curl); curl_easy_setopt(curl, CURLOPT_URL, GetUrlByType('sapi', iTryID)); //curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION , &(this->handleSubQuery)); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)stream_http_recv_buffer); //int iDescLen = 0; //char* szPostFields = svpToolBox.CStringToUTF8(szPostPerm, &iDescLen) ; //curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (void *)szPostFields); //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, iDescLen); res = curl_easy_perform(curl); if (res == 0) { curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &respcode); //double contentlength; //curl_easy_getinfo(curl,CURLINFO_SIZE_DOWNLOAD, &contentlength); //SVP_LogMsg5(L" contentlength %f", contentlength); if (respcode == 200) { //good to go //SVP_LogMsg(_T("字幕已经找到,正在处理..."), 31); ret = 1; } else { //error SVP_LogMsg5(_T("HTTP return code is not 200 but %d") , respcode); err = 1; } } else { //error LONG l_oserr = 0; curl_easy_getinfo(curl,CURLINFO_OS_ERRNO,&l_oserr); err = 2; swprintf_s(szFailMsg, 1024, L"%s", CStringW(curl_easy_strerror(res))); //szFailMsg.Format(L"%s",CStringW(curl_easy_strerror(res))); if(!lstrcmp(szFailMsg, L"Couldn't connect to server")); lstrcat(szFailMsg, ResStr(IDS_LOG_MSG_SVPSUB_PLEASE_CHECK_FIREWALL)); SVP_LogMsg5(_T("HTTP connection error %s %d"), szFailMsg, l_oserr); //TODO handle this } /* always cleanup */ curl_easy_cleanup(curl); //free(szPostFields); //if not error, process data if (ret) { int extErr = ExtractDataFromAiSubRecvBuffer_STL(szFilePath, stream_http_recv_buffer); if (extErr && extErr != -2) { // -2 if there is none match subtile SVP_LogMsg(_T("Error On Extract DataFromAiSubRecvBuffer ")); //TODO handle this err = 3; } } else { wchar_t szMsg[1024]; swprintf_s(szMsg, 1024, ResStr(IDS_LOG_MSG_SVPSUB_NETWORK_FAIL), szFailMsg); SVP_LogMsg(szMsg);//,31 m_lastFailedMsg = szMsg; err = 4; } /* if (this->mainBufferSize > 0){ char statCode = this->mainBuffer[0]; if(statCode <= 0){ //error handle }else{ //handSubFiles } } if (this->mainBuffer){ free(this->mainBuffer); }*/ } //this->mainBuffer = NULL; //this->mainBufferSize = 0; fclose(stream_http_recv_buffer); return err; }
int CSVPNet::UploadSubFileByVideoAndHash(std::wstring fnVideoFilePath, std::wstring szFileHash, std::wstring szSubHash, std::vector<std::wstring>* fnSubPaths, int iDelayMS, std::vector<std::wstring>* szaPostTerms) { CURL *curl; CURLcode res; //CString szPostPerm = _T( "pathinfo=" ) + fnVideoFilePath + _T("&filehash=") + szFileHash ; int iTotalFiles = fnSubPaths -> size(); SVP_LogMsg(_T("Upload Begin")); struct curl_httppost *formpost = NULL; struct curl_httppost *lastptr = NULL; char errorbuf[CURL_ERROR_SIZE]; curl_global_init(CURL_GLOBAL_ALL); char* szTerm2; char* szTerm3; int iDescLen = 0; szTerm2 = svpToolBox.CStringToUTF8(fnVideoFilePath.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "pathinfo", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); szTerm2 = svpToolBox.CStringToUTF8(szSubHash.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "subhash", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); szTerm3 = svpToolBox.CStringToUTF8(szFileHash.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "filehash", CURLFORM_COPYCONTENTS, szTerm3,CURLFORM_END); free(szTerm3); std::wstring szVHash = (LPCTSTR)genVHash(szTerm2, szTerm3, uniqueIDHash); if (!szVHash.empty()) { szTerm2 = svpToolBox.CStringToUTF8(szVHash.c_str(), &iDescLen); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "vhash", CURLFORM_COPYCONTENTS, szTerm2,CURLFORM_END); free(szTerm2); } szTerm2 = (char*)malloc(64); _itoa_s(iDelayMS , szTerm2, 64, 10); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "subdelay", CURLFORM_COPYCONTENTS, szTerm2, CURLFORM_END); free(szTerm2); for (int i = 0; i < fnSubPaths -> size(); i++) { char szFname[22]; /* Fill in the file upload field */ std::wstring szgzFile = svpToolBox.getSameTmpName(fnSubPaths -> at(i).c_str()) ; SVP_LogMsg(_T("Gziping ") + CString(fnSubPaths -> at(i).c_str()) + _T(" to ") + szgzFile.c_str()); svpToolBox.packGZfile(fnSubPaths -> at(i).c_str(), szgzFile.c_str()); szTerm2 = svpToolBox.CStringToUTF8(szgzFile.c_str(), &iDescLen, CP_ACP); //SVP_LogMsg(fnSubPaths->GetAt(i)); sprintf_s(szFname, 22, "subfile[%d]", i); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, szFname, CURLFORM_FILE, szTerm2,CURLFORM_END); free(szTerm2); } int retx = -1; curl = curl_easy_init(); if (curl) { long respcode; SetCURLopt(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorbuf ); curl_easy_setopt(curl, CURLOPT_URL, GetUrlByType('upsb',iTryID)); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); res = curl_easy_perform(curl); if (res == 0) { curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &respcode); if (respcode == 200) { //good to go // continues to upload sub retx = 0; SVP_LogMsg(ResStr(IDS_LOG_MSG_SVPSUB_UPLOAD_FINISHED), 31); } else if (respcode == 404) { //error retx = 0; SVP_LogMsg(_T("Already Have same sub in databases")); } } else //error SVP_LogMsg5(_T("HTTP connection error %d %s ") , res, CStringW(curl_easy_strerror(res))); //TODO handle this curl_easy_cleanup(curl); } /* then cleanup the formpost chain */ curl_formfree(formpost); return retx; }
int main(int argc, char* argv[]) { if (argc!=2) { printf("Usage:GetSubtitle videopath\n"); return 0; } printf("Please wait...\n"); setlocale(LC_ALL,""); SubTransFormat SubTF; char* strfilepath=argv[1]; std::wstring filepath=MutliByte2WideChar(strfilepath); std::wstring filehash=SubTF.ComputerFileHash_STL(strfilepath); std::wstring shortname= SubTF.GetShortFileNameForSearch(filepath); char* strfilehash=WideChar2MultiByte(filehash.c_str()); char* strshortname=WideChar2MultiByte(shortname.c_str()); std::wstring uniqueIDHash2=SubTF.genVHash(strfilepath,strfilehash); char* struniqueIDHash2=WideChar2MultiByte(uniqueIDHash2.c_str()); printf("hash:%s\nshortname:%s\nuniqueIDHash:%s\n",strfilehash,strshortname,struniqueIDHash2); struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; char* form; form=WideChar2MultiByte(filepath.c_str()); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "pathinfo", CURLFORM_COPYCONTENTS, form,CURLFORM_END); free(form); form=WideChar2MultiByte(filehash.c_str()); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "filehash", CURLFORM_COPYCONTENTS, form,CURLFORM_END); free(form); form=WideChar2MultiByte(uniqueIDHash2.c_str()); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "vhash", CURLFORM_COPYCONTENTS, form,CURLFORM_END); free(form); form=WideChar2MultiByte(shortname.c_str()); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "shortname", CURLFORM_COPYCONTENTS, form,CURLFORM_END); free(form); CURL* curl = curl_easy_init(); SetCURLopt(curl); char url[100]; char filename[L_tmpnam]; tmpnam(filename); FILE* fp=fopen(filename,"wb+"); //FILE* fp=tmpfile(); if(fp==NULL) return 0; printf("Searching for subtitles\n\n"); for (int i=1;i<=7;i++) { GetUrlByType('sapi',i,url); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); CURLcode res = curl_easy_perform(curl); if (res==0) { int respcode=0; curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &respcode); if (respcode==200) { ExtractDataFromAiSubRecvBuffer_STL(fp); } break; } else { long l_oserr = 0; curl_easy_getinfo(curl,CURLINFO_OS_ERRNO,&l_oserr); printf(curl_easy_strerror(res)); } } curl_easy_cleanup(curl); std::wstring szSubFilePath; for (int i = 0; i < toolbox.szaSubTmpFileList.size(); i++) { szSubFilePath = toolbox.getSubFileByTempid_STL(i,strfilepath); if (szSubFilePath == L"EXIST") printf("\nThe same subtitle already existed!\n"); else if (!szSubFilePath.empty()) printf("\nSubtitle downloaded to %s\n\n",WideChar2MultiByte(szSubFilePath.c_str())); else printf("\nFail to get sub file\n"); } return 0; }