unsigned RDFeed::postFile(RDStation *station,const QString &srcfile,Error *err, bool log_debug,RDConfig *config) { QString sql; RDSqlQuery *q; QString cmd; QString tmpfile; QString tmpfile2; QString destfile; int time_length=0; RDUpload *upload=NULL; RDUpload::ErrorCode upload_err; RDWaveFile *wave=NULL; unsigned audio_time=0; emit postProgressChanged(0); emit postProgressChanged(1); qApp->processEvents(); // // Convert Cut // tmpfile=GetTempFilename(); RDAudioConvert *conv=new RDAudioConvert(station->name(),this); conv->setSourceFile(srcfile); conv->setDestinationFile(tmpfile); RDSettings *settings=new RDSettings(); settings->setFormat(uploadFormat()); settings->setChannels(uploadChannels()); settings->setSampleRate(uploadSampleRate()); settings->setBitRate(uploadBitRate()); settings->setNormalizationLevel(normalizeLevel()/100); conv->setDestinationSettings(settings); switch(conv->convert()) { case RDAudioConvert::ErrorOk: wave=new RDWaveFile(tmpfile); if(wave->openWave()) { audio_time=wave->getExtTimeLength(); } delete wave; break; case RDAudioConvert::ErrorInvalidSettings: case RDAudioConvert::ErrorFormatNotSupported: emit postProgressChanged(totalPostSteps()); delete settings; delete conv; *err=RDFeed::ErrorUnsupportedType; unlink(tmpfile); return 0; case RDAudioConvert::ErrorNoSource: case RDAudioConvert::ErrorNoDestination: case RDAudioConvert::ErrorInternal: case RDAudioConvert::ErrorInvalidSource: case RDAudioConvert::ErrorNoDisc: case RDAudioConvert::ErrorNoTrack: case RDAudioConvert::ErrorInvalidSpeed: case RDAudioConvert::ErrorFormatError: case RDAudioConvert::ErrorNoSpace: emit postProgressChanged(totalPostSteps()); delete settings; delete conv; *err=RDFeed::ErrorGeneral; unlink(tmpfile); return 0; } delete settings; delete conv; // // Upload // emit postProgressChanged(2); emit postProgressChanged(3); qApp->processEvents(); QFile file(tmpfile); int length=file.size(); unsigned cast_id=CreateCast(&destfile,length,time_length); RDPodcast *cast=new RDPodcast(cast_id); upload=new RDUpload(station->name(),this); upload->setSourceFile(tmpfile); upload->setDestinationUrl(purgeUrl()+"/"+cast->audioFilename()); switch((upload_err=upload->runUpload(purgeUsername(),purgePassword(), log_debug))) { case RDUpload::ErrorOk: sql=QString().sprintf("update PODCASTS set AUDIO_TIME=%u where ID=%u", audio_time,cast_id); q=new RDSqlQuery(sql); delete q; break; default: emit postProgressChanged(totalPostSteps()); *err=RDFeed::ErrorUploadFailed; printf("Upload Error: %s\n",(const char *)RDUpload::errorText(upload_err)); sql=QString().sprintf("delete from PODCASTS where ID=%u",cast_id); q=new RDSqlQuery(sql); delete q; delete upload; delete cast; *err=RDFeed::ErrorUploadFailed; unlink(tmpfile); return 0; } delete upload; delete cast; unlink(QString().sprintf("%s.wav",(const char *)tmpfile)); unlink(tmpfile); emit postProgressChanged(totalPostSteps()); *err=RDFeed::ErrorOk; return cast_id; }
QString RDFeed::GetExportCommand(RDStation *station,const QString &srcfile, QString *destfile,RDFeed::Error *err) const { int format_in=0; int len; RDSettings settings; QString custom_cmd; *destfile=GetTempFilename(); QFile file(srcfile); if(!file.exists()) { *err=RDFeed::ErrorCannotOpenFile; return QString(); } RDWaveFile *wave=new RDWaveFile(srcfile); if(!wave->openWave()) { *err=RDFeed::ErrorUnsupportedType; delete wave; return QString(); } int samplerate=wave->getSamplesPerSec(); switch(wave->getFormatTag()) { case WAVE_FORMAT_PCM: format_in=0; len=wave->getSampleLength()*wave->getChannels()* (wave->getBitsPerSample()/8); break; case WAVE_FORMAT_MPEG: format_in=wave->getHeadLayer(); len=wave->getSampleLength()*wave->getChannels()*2; break; } wave->closeWave(); delete wave; QString cmd; float normal=0.0; RDLibraryConf *rdlibrary=new RDLibraryConf(station->name(),0); if(normalizeLevel()<=0) { normal=pow(10.0,(double)(normalizeLevel()/20000.0)); cmd=QString(). sprintf("rd_export_file %6.4f %d %d %s %d %d %d %d %d %s %s.dat %s.%s %d", normal, format_in, samplerate, (const char *)srcfile, uploadFormat(), uploadChannels(), uploadSampleRate(), uploadBitRate()/1000, uploadQuality(), (const char *)RDEscapeString(*destfile), (const char *)(*destfile), (const char *)(*destfile), RDConfiguration()->audioExtension().ascii(), rdlibrary->srcConverter()); } else { cmd=QString(). sprintf("rd_export_file 0 %d %d %s %d %d %d %d %d %s %s.dat %s.%s %d", format_in, samplerate, (const char *)srcfile, uploadFormat(), uploadChannels(), uploadSampleRate(), uploadBitRate()/1000, uploadQuality(), (const char *)RDEscapeString(*destfile), (const char *)(*destfile), (const char *)(*destfile), RDConfiguration()->audioExtension().ascii(), rdlibrary->srcConverter()); } delete rdlibrary; switch(uploadFormat()) { // Custom format? case RDSettings::Pcm16: case RDSettings::MpegL1: case RDSettings::MpegL2: case RDSettings::MpegL3: case RDSettings::Flac: case RDSettings::OggVorbis: break; default: settings.setFormat(uploadFormat()); settings.setChannels(uploadChannels()); settings.setSampleRate(uploadSampleRate()); settings.setBitRate(uploadBitRate()); custom_cmd=settings.resolvedCustomCommandLine(*destfile); if(custom_cmd.isEmpty()) { return QString(); } cmd+=" \""+custom_cmd+"\""; break; } // printf("CMD: %s",(const char *)cmd); *err=RDFeed::ErrorOk; return cmd; }
unsigned RDFeed::postCut(RDUser *user,RDStation *station, const QString &cutname,Error *err,bool log_debug, RDConfig *config) { QString tmpfile; QString destfile; QString sql; RDSqlQuery *q; RDPodcast *cast=NULL; RDUpload *upload=NULL; RDUpload::ErrorCode upload_err; RDAudioConvert::ErrorCode audio_conv_err; emit postProgressChanged(0); emit postProgressChanged(1); // // Export Cut // tmpfile=GetTempFilename(); RDCut *cut=new RDCut(cutname); if(!cut->exists()) { delete cut; *err=RDFeed::ErrorCannotOpenFile; return 0; } RDAudioExport *conv=new RDAudioExport(station,config,this); conv->setCartNumber(cut->cartNumber()); conv->setCutNumber(cut->cutNumber()); conv->setDestinationFile(tmpfile); conv->setRange(cut->startPoint(),cut->endPoint()); RDSettings *settings=new RDSettings(); settings->setFormat(uploadFormat()); settings->setChannels(uploadChannels()); settings->setSampleRate(uploadSampleRate()); settings->setBitRate(uploadBitRate()); settings->setNormalizationLevel(normalizeLevel()/100); conv->setDestinationSettings(settings); switch(conv->runExport(user->name(),user->password(),&audio_conv_err)) { case RDAudioExport::ErrorOk: break; case RDAudioExport::ErrorInvalidSettings: delete settings; delete conv; *err=RDFeed::ErrorUnsupportedType; unlink(tmpfile); return 0; case RDAudioExport::ErrorNoSource: case RDAudioExport::ErrorNoDestination: case RDAudioExport::ErrorInternal: case RDAudioExport::ErrorUrlInvalid: case RDAudioExport::ErrorService: case RDAudioExport::ErrorInvalidUser: case RDAudioExport::ErrorAborted: case RDAudioExport::ErrorConverter: delete settings; delete conv; *err=RDFeed::ErrorGeneral; unlink(tmpfile); return 0; } delete settings; delete conv; // // Upload // emit postProgressChanged(2); QFile file(tmpfile); int length=file.size(); unsigned cast_id=CreateCast(&destfile,length,cut->length()); delete cut; cast=new RDPodcast(cast_id); upload=new RDUpload(station->name(),this); upload->setSourceFile(tmpfile); upload->setDestinationUrl(purgeUrl()+"/"+cast->audioFilename()); switch((upload_err=upload->runUpload(purgeUsername(),purgePassword(), log_debug))) { case RDUpload::ErrorOk: *err=RDFeed::ErrorOk; break; default: emit postProgressChanged(totalPostSteps()); *err=RDFeed::ErrorUploadFailed; sql=QString().sprintf("delete from PODCASTS where ID=%u",cast_id); q=new RDSqlQuery(sql); delete q; delete upload; delete cast; *err=RDFeed::ErrorUploadFailed; unlink(tmpfile); return 0; } emit postProgressChanged(3); unlink(tmpfile); delete upload; delete cast; emit postProgressChanged(totalPostSteps()); return cast_id; }