* */ /** * video_scheduler.php configuration */ // number of conversion jobs active at the same time defined('VIDEO_RENDERING_FFMPEG_INSTANCES') or define('VIDEO_RENDERING_FFMPEG_INSTANCES', 5); /** * video_scheduler.php configuration ends. * DO NOT EDIT BELOW THIS LINE */ /** * Define some constants */ defined('VIDEO_RENDERING_PENDING') or define('VIDEO_RENDERING_PENDING', 1); defined('VIDEO_RENDERING_ACTIVE') or define('VIDEO_RENDERING_ACTIVE', 5); defined('VIDEO_RENDERING_COMPLETE') or define('VIDEO_RENDERING_COMPLETE', 10); defined('VIDEO_RENDERING_FAILED') or define('VIDEO_RENDERING_FAILED', 20); if (isset($_SERVER['argv'][1])) { $url = parse_url($_SERVER['argv'][1]); $_SERVER['SCRIPT_NAME'] = $url['path']; $_SERVER['HTTP_HOST'] = $url['host']; } include_once('./includes/bootstrap.inc'); //module_load_include('/includes/bootstrap.inc', 'video_scheduler', 'includes/bootstrap'); // disable error reporting for bootstrap process error_reporting(E_ERROR); // let's bootstrap: we will be able to use drupal apis drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); // enable full error reporting again error_reporting(E_ALL); //watchdog('video_scheduler', 'starting video conversion jobs.', array(), WATCHDOG_DEBUG); // allow execution only from the command line! if(empty($_SERVER['REQUEST_METHOD'])) { video_scheduler_main(); } else { print ('This script is only executable from the command line.'); die(); } /** * Main for video_scheduler.php */ function video_scheduler_main() { // echo 'ok'; if($jobs = video_scheduler_select()) { foreach ($jobs as $job) { video_scheduler_start($job); } } else { watchdog('video_scheduler', 'no video conversion jobs to schedule.', array(), WATCHDOG_DEBUG); } } /** * Starts rendering for a job */ function video_scheduler_start($job) { // $url = (isset($_SERVER['argv'][1])) ? escapeshellarg($_SERVER['argv'][1]) : ''; // watchdog('video_scheduler', 'Execute video_render.php %url and %job', array('%url'=>$url, '%job'=>$job->fid), WATCHDOG_DEBUG); // exec("/usr/local/bin/php /home/freja/public_html/v5-dev/video_render.php $job->fid $url > /dev/null &"); video_render_main($job->fid); } /** * Select VIDEO_RENDERING_FFMPEG_INSTANCES jobs from the queue * * @return an array containing jobs */ function video_scheduler_select() { // load node and its file object module_load_include('inc', 'uploadfield', '/uploadfield_convert'); $jobs = array(); $i = 0; $result = db_query_range('SELECT f.fid, f.filepath, f.filesize, f.filename, f.filemime, f.status FROM {video_rendering} vr INNER JOIN {files} f ON vr.fid = f.fid WHERE vr.fid = f.fid AND vr.status = %d AND f.status = %d ORDER BY f.timestamp', VIDEO_RENDERING_PENDING, FILE_STATUS_PERMANENT, 0, VIDEO_RENDERING_FFMPEG_INSTANCES); while($job = db_fetch_object($result)) { $jobs[] = $job; } // print_r($jobs); // exit; return $jobs; } /** * Video Rendering Process * */ function video_render_main($job_fid) { // get parameters passed from command line $fid = $job_fid; $job = NULL; // set the status to active _video_render_job_change_status($fid, VIDEO_RENDERING_ACTIVE); // load the job object $job = _video_render_load_job($fid); if(empty($job)) { watchdog('video_render', 'video_render.php has been called with an invalid job resource. exiting.', array(), WATCHDOG_ERROR); die; } // get file object _video_render_get_converted_file(&$job); $file = $job->converted; if(empty($file)) { watchdog('video_render', 'converted file is an empty file.', array(), WATCHDOG_ERROR); _video_render_job_change_status($fid, VIDEO_RENDERING_FAILED); die; } $tmpfile = $file->filepath; // the above no more works as token supports - use dirname $dest_dir = dirname($job->filepath) . '/'; if (file_copy($file, $dest_dir)) { //update the file table entry and copy file content to new one $file->fid = $fid; //update file with new drupal_write_record ('files', $file, 'fid'); //add new file entry drupal_write_record ('files', $job); // TODO : add data of rendering _video_render_job_change_status($fid, VIDEO_RENDERING_COMPLETE); // clear all cacahe data // cache_clear_all(); // drupal_flush_all_caches(); cache_clear_all("*", 'cache_content', true); watchdog('video_render', 'successfully converted %orig to %dest', array('%orig' => $job->filepath, '%dest' => $file->filepath), WATCHDOG_INFO); // delete the temp file // unlink($tmpfile); } else { _video_render_job_change_status($fid, VIDEO_RENDERING_FAILED); // get the username of the process owner $ownerarray = posix_getpwuid(posix_getuid()); $owner=$ownerarray['name']; // get the username of the destination folder owner $fownerarray = posix_getpwuid(fileowner($dest_dir)); $fowner=$fownerarray['name']; // get destination folder permissions $perms = substr(sprintf('%o', fileperms($dest_dir)), -4); watchdog('video_render', 'error moving video %vid_file with nid = %nid to %dir the final directory. Check folder permissions.
The script was run by %uname .
The folder owner is %fowner .
The folder permissions are %perms .', array('%vid_file' => $job->origfile, '%nid' => $job->nid, '%dir' => $dest_dir, '%uname' => $owner, '%fowner' => $fowner, '%perms' => $perms), WATCHDOG_ERROR); } } /** * Get a string cointaining the command to be executed including options */ function _video_render_get_converted_file(&$job) { $transcoder = variable_get('vid_convertor', 'ffmpeg'); module_load_include('inc', 'video', '/plugins/' . $transcoder); $function = variable_get('vid_convertor', 'ffmpeg') . '_auto_convert'; if (function_exists($function)) { // $thumbs = ffmpeg_auto_thumbnail($file); // watchdog('video_render', 'calling to converter API %conv', array('%conv' => $transcoder)); $function(&$job); // if(! $success) { // watchdog('video_render', 'error transcoding vide. existing.', array(), WATCHDOG_ERROR); // } } else { // drupal_set_message(t('Transcoder not configured properly'), 'error'); print ('Transcoder not configured properly'); } } /** * Load a job */ function _video_render_load_job($fid) { // watchdog('video_render', 'Loading contents for file id %fid', array('%fid' => $fid)); $result = db_query('SELECT f.filepath, f.filesize, f.filename, f.filemime, f.filesize, f.status, f.uid FROM {video_rendering} vr INNER JOIN {files} f ON vr.fid = f.fid WHERE vr.fid = f.fid AND f.status = %d AND f.fid = %d', FILE_STATUS_PERMANENT, $fid); return db_fetch_object($result); } /** * Change the status to $status of the job having nid=$nid and vid=$vid */ function _video_render_job_change_status($fid, $status) { $result = db_query('UPDATE {video_rendering} SET status = %d WHERE fid = %d ', $status, $fid); } ?>