/** * Avvia un Job in coda * * @param array $params * @param LoggerInterface $logger (optional) * @return bool */ public function run() { $fs = new Filesystem(); $taskId = $this->getParam('taskId'); $taskModel = TaskModel::where('id', '=', $taskId)->firstOrFail(); $this->setLogContext($taskModel->toArray()); $jobModel = $taskModel->job()->first(); $fileModel = $jobModel->files()->first(); //prendi il jobservice col dao del job associato al task settato $job = $taskModel->job()->firstOrFail(); $this->logInfo("Controllo della directory "); $service = new JobService(); $service->setDao($job); $folder = $service->resolveArtifactsPath(); $fsM = SymfonyFileSystemManager::getInstance(); $fsM->createDir($folder, '0700', true); $input = $fileModel->path; $output = $folder . DIRECTORY_SEPARATOR . BinaryFile::resolveName(); //transcoding $transcoder = JambonCoreFactory::getInstance(); $resolution = $this->resolveResolution($taskModel); $taskModel->updateResolution($resolution); $taskModel->setStarted(); $transcoder->initTranscodeOperation($taskModel->format, false, $resolution, 2, $input, $output); $ffprobeInfo = $transcoder->performTranscodeOperation(); $output = $transcoder->getOutputPath(); $taskModel->setCompleted(); $ffprobeInfoArray = @json_decode($ffprobeInfo, true); if (!empty($ffprobeInfoArray)) { //risoluzione del filename in output $fileName = $fileModel->getName(); $vanillaName = pathinfo($fileName, PATHINFO_FILENAME); $extension = pathinfo($output, PATHINFO_EXTENSION); $name = $vanillaName . '_' . $resolution . '.' . $extension; //salvataggio del model file in db $fileModel = FileModel::create($output, FileModel::FILE_ROLE_ARTIFACT, $name); //salvataggio del ffprobe $fileModel->setMeta(FileModel::META_FFPROBE_KEY, $ffprobeInfoArray, true); $fileModel->updateFileHash(); $taskModel->files()->attach($fileModel->id); $taskModel->save(); } else { throw new \Exception("Error Processing transcoding"); } //se non ci sono task aperti chiudo il job //$shouldCloseJob = (TaskModel::where('completed_at', '=', null)->count() === 0); //dump($shouldCloseJob); // if($shouldCloseJob) { // } }
/** * Scarica il file e ne crea una entry in database * * @throw Exception * @param string $url * @param string $fileName (optional) * @return FileModel */ public function downloadSource($url, $fileName = null) { $fsM = SymfonyFileSystemManager::getInstance(); $basePath = $this->resolveSourcePath(); //risoluzione del path $fsM->createDir($basePath, '0700', true); $file = BinaryFile::fromDownloadChunked($url, null, $basePath, function ($bytesCount, $totalSize) { if ($totalSize) { $perc = $bytesCount * 100 / $totalSize; $string = "Downloading: {$perc}%"; $back = strlen($string); echo "[{$back}D" . $string; } else { echo $bytesCount . '\\n'; } }); $path = $file->getPath(); $fileModel = FileModel::create($path, FileModel::FILE_ROLE_SOURCE, $fileName); $ffprobeInfo = shell_exec("ffprobe -v quiet -print_format json -show_format -show_streams {$path} 2>&1"); $fileModel->setMeta(FileModel::META_FFPROBE_KEY, json_decode($ffprobeInfo, true), true); return $fileModel; }
/** * fromDownload * * Create a BinaryFile from Globals * * @param string $url * @param array|string $allowedExtensions (optional) * @param Request $httpProvider (optional) Mockable Dependency Injection * @return BinaryFile * * @throw InvalidExtensionException */ public static function fromDownload($url, $allowedExtensions = null, $folder = self::TMP_FOLDER_NAME, $httpProvider = null) { $path = null; $httpProvider = $httpProvider ? $httpProvider : Request::get($url); $resp = $httpProvider->send(); $content = $resp->body; $mime = @$resp->headers['content-type']; if ($allowedExtensions && !self::checkExtensions($mime, $allowedExtensions)) { throw new InvalidExtensionException("Invalid Extension", 1); } $filename = self::resolveName($mime); $binary = BinaryFile::put($filename, $content, $folder); if (empty($mime)) { $binary->rename(self::resolveName($binary->getMime())); } return $binary; }