From 8041073c8d74e5d24e3b9f10143f3e4bd04db2de Mon Sep 17 00:00:00 2001 From: Heshan Wanigasooriya Date: Tue, 23 Mar 2010 04:17:29 +0000 Subject: removing old files and commenting new file field and other files to the vidoe module page. --- plugins/video_ffmpeg_helper/README.txt | 47 -- .../video_ffmpeg_helper/video_ffmpeg_helper.info | 8 - .../video_ffmpeg_helper.install | 89 ---- .../video_ffmpeg_helper/video_ffmpeg_helper.module | 539 --------------------- plugins/video_ffmpeg_helper/video_render.php | 256 ---------- plugins/video_ffmpeg_helper/video_scheduler.php | 115 ----- 6 files changed, 1054 deletions(-) delete mode 100644 plugins/video_ffmpeg_helper/README.txt delete mode 100644 plugins/video_ffmpeg_helper/video_ffmpeg_helper.info delete mode 100644 plugins/video_ffmpeg_helper/video_ffmpeg_helper.install delete mode 100644 plugins/video_ffmpeg_helper/video_ffmpeg_helper.module delete mode 100644 plugins/video_ffmpeg_helper/video_render.php delete mode 100644 plugins/video_ffmpeg_helper/video_scheduler.php (limited to 'plugins/video_ffmpeg_helper') diff --git a/plugins/video_ffmpeg_helper/README.txt b/plugins/video_ffmpeg_helper/README.txt deleted file mode 100644 index fb63547..0000000 --- a/plugins/video_ffmpeg_helper/README.txt +++ /dev/null @@ -1,47 +0,0 @@ -FFMPEG Video.module helper -========================== - -See : http://video.heidisoft.com/docs/users-guide-26 - -This helper module facilitates uploading new videos using the video module. It -features a batch processing queue for videos to be transcoded and automatic -thumbnail generation. - -IMPORTANT: the ffmpeg helper currently only works on unix based environment. It currently doesn't support Windows based servers. - -Install instructions --------------------- - -1. Activate the video_ffmpeg_helper module -2. Setup it's advanced options to meet your needs -3. Move (or symlink) video_render.php and video_scheduler.php into your Drupal root -4. Edit the first "Configuration" code lines of those files to meet your needs (IMPORTANT: path to ffmpeg executable on your server) -5. Check permissions of the files and folders (/tmp/video and files/* must be writable by the webserver or the user executling the cron job) -6. You now have two options to execute the video_scheduler.php script: - - 6.1 (default) Enable the execution of video_scheduler.php using standard drupal cron. - GMM: 07/23/2009 Note: ** Do not use this method if your Apache server is running with suPHP ** - As of this writing, suPHP will cause the Drupal cron to loop infinitely and no video - will be rendered. In this case crontab should be used instead of Drupal cron! - - 6.2 Schedule the execution of video_scheduler.php using unix cron - - The crontab should look something like this: - - # m h dom mon dow user command - */20 * * * * www-data cd /absolute/path/to/drupal/ ; php video_scheduler.php http://www.example.com/path_to_drupal - - This will execute the video_scheduler every 20 minutes. - - Note that the video_scheduler doesn't produce any output and cannot be called - from the web. It will, however, put some information in the watchdog. - - - -Troubleshooting ------------------------- - -Configuring and installing ffmpeg in a web server environment might be pretty difficult. In order to help you troubleshoot the transcoding process the ffmpeg helper puts debugging informations on the drupal logs. I strongly suggest to have a look at them if you are experiencing problems with transcoding. - -The ffmpeg puts in the drupal logs the commands it was trying to execute. You might try to rerun them on a command shell in order understand what went wrong. - diff --git a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.info b/plugins/video_ffmpeg_helper/video_ffmpeg_helper.info deleted file mode 100644 index 9706e09..0000000 --- a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.info +++ /dev/null @@ -1,8 +0,0 @@ -;$Id$ -name = Video ffmpeg Helper -description = Provide apis for ffmpeg. Simplify video nodes creation. -dependencies[] = video -dependencies[] = video_upload -package = "Video" -core = 6.x - diff --git a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.install b/plugins/video_ffmpeg_helper/video_ffmpeg_helper.install deleted file mode 100644 index aa76914..0000000 --- a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.install +++ /dev/null @@ -1,89 +0,0 @@ - - * - * @todo - */ - -/** - * Implementation of hook_schema(). - */ -function video_ffmpeg_helper_schema() { - $schema['video_rendering'] = array( - 'description' => t('Store video transcoding queue'), - 'fields' => array( - 'vid' => array( - 'description' => t('video id : primary key'), - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'nid' => array( - 'description' => t('Node id : index of the {node}.nid'), - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'origfile' => array( - 'description' => t('original file path'), - 'type' => 'text', - 'not null' => TRUE, - 'default' => '', - ), - 'pid' => array( - 'description' => t('Pid'), - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'status' => array( - 'description' => t('status of the transcoding'), - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'started' => array( - 'description' => t('Started transcodings'), - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'completed' => array( - 'description' => t('Transcoding completed'), - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - ), - 'indexes' => array( - 'nid' => array('nid'), - ), - 'primary key' => array('vid'), - ); - - return $schema; -} - - -/** - * Implementation of hook_install(). - */ -function video_ffmpeg_helper_install() { - // Create tables. - drupal_install_schema('video_ffmpeg_helper'); -} - -/** - * Implementation of hook_uninstall(). - */ -function video_ffmpeg_helper_uninstall() { - drupal_uninstall_schema('video_ffmpeg_helper'); -} \ No newline at end of file diff --git a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.module b/plugins/video_ffmpeg_helper/video_ffmpeg_helper.module deleted file mode 100644 index 0adb3de..0000000 --- a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.module +++ /dev/null @@ -1,539 +0,0 @@ - - * @author Heshan Wanigasooriya - * @todo - * 1. Remove modules and user existing ffmpeg wrapper module - */ - -/** - * Define some constants -*/ -define('VIDEO_RENDERING_PENDING', 1); -define('VIDEO_RENDERING_ACTIVE', 5); -define('VIDEO_RENDERING_COMPLETE', 10); -define('VIDEO_RENDERING_FAILED', 20); - - - -function video_ffmpeg_helper_cron() { - global $base_url; - - if(variable_get('video_ffmpeg_helper_auto_cvr_cron', true)) { - exec("php video_scheduler.php $base_url > /dev/null &"); - } -} - - -/** - * Implementatio of hook_perm() -*/ -function video_ffmpeg_helper_perm() { - return array('bypass automatic video conversion'); -} - - -/** - * Implementation of hook_help(). - */ -function video_ffmpeg_helper_help($path, $arg) { - switch ($path) { - case 'admin/modules#description': - return t('Enable ffmpeg support for video module.'); - } -} - -/** - * Implementation of hook_menu() - */ -function video_ffmpeg_helper_menu() { - $items = array(); - $items['admin/settings/video/ffmpeg_helper'] = array( - 'title' => 'Video ffmpeg Helper', - 'description' => 'Administer video_ffmpeg_helper module settings', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('video_ffmpeg_helper_admin_settings'), - 'access arguments' => array('administer site configuration'), - 'type' => MENU_NORMAL_ITEM, - ); - - return $items; -} - -/** - * Validation for settings form - */ -function video_ffmpeg_helper_admin_settings_validate($form, &$form_state) { - if (variable_get('video_image_auto_thumbnail', 0)) { - if (!_video_ffmpeg_helper_check_exe_path($form_state['values']['video_ffmpeg_helper_ffmpeg_path'])) { - form_set_error('video_ffmpeg_helper_ffmpeg_path', t('Set correct path for ffmpeg')); - } - if (!is_numeric($form_state['values']['video_ffmpeg_helper_auto_thumbnail_seek'])) { - form_set_error('video_ffmpeg_helper_auto_thumbnail_seek', t('Seek time must be an integer')); - } - $options = $form_state['values']['video_ffmpeg_helper_thumbnailer_options']; - if (!strstr($options, '%videofile') || !strstr($options, '%thumbfile')) { - form_set_error('video_ffmpeg_helper_thumbnailer_options', t('Thumbnail options must contain mandatory arguments %videofile and %thumbfile')); - } - } -} - - -/** - * Settings form - */ -function video_ffmpeg_helper_admin_settings() { - // let's execute after video_image and video_upload - if (module_exists('video_image') && variable_get('video_image_auto_thumbnail', 0)) { - $weight = db_result(db_query("SELECT weight FROM {system} WHERE name='video_image'")); - } else { // video_image might be disabled.. execute after video_upload - $weight = db_result(db_query("SELECT weight FROM {system} WHERE name='video_upload'")); - } - // update the weight in the system table - db_query("UPDATE {system} SET weight=".($weight+1)." WHERE name='video_ffmpeg_helper'"); - - $form['video_ffmpeg_helper_ffmpeg_path'] = array( - '#type' => 'textfield', - '#title' => t('FFmpeg executable path'), - '#description' => t('Set the full path to the ffmpeg executable here.'), - '#default_value' => variable_get('video_ffmpeg_helper_ffmpeg_path', '/usr/bin/ffmpeg'), - ); - - - $form['video_ffmpeg_helper_auto_resolution'] = array( - '#type' => 'checkbox', - '#title' => t('Enable resolution helper'), - '#description' => t('Use ffmpeg Helper to automatically get the resolution from the video.'), - '#default_value' => variable_get('video_ffmpeg_helper_auto_resolution', false), - ); - - $form['video_ffmpeg_helper_auto_playtime'] = array( - '#type' => 'checkbox', - '#title' => t('Enable playtime helper'), - '#description' => t('Use ffmpeg Helper to automaticcally get the playtime from the video.'), - '#default_value' => variable_get('video_ffmpeg_helper_auto_playtime', false), - ); - - $form['autothumb'] = array( - '#type' => 'fieldset', - '#title' => t('Automatic video thumbnailing'), - '#collapsible' => TRUE, - '#collapsed' => TRUE - ); - $form['autothumb']['video_ffmpeg_helper_thumbnailer_options'] = array( - '#type' => 'textfield', - '#title' => t('Video thumbnailer options'), - '#description' => t('Provide the options for the thumbnailer. Available argument values are: ').'
  1. '.t('%videofile (the video file to thumbnail)').'
  2. '.t('%thumbfile (a newly created temporary file to overwrite with the thumbnail)').'
  3. '.t('%seek (seconds to seek into video before extracting image).').'
'.t('Only the first two are mandatory. For example, older versions of ffmpeg should use something like: !old While newer versions should use something like: !new', array('!old' => "
-i %videofile -y -an -f mjpeg -ss %seek -t 0.001 %thumbfile
", '!new' => '
-i %videofile -an -y -f mjpeg -ss %seek -vframes 1 %thumbfile
')), - '#default_value' => variable_get('video_ffmpeg_helper_thumbnailer_options', '-i %videofile -an -y -f mjpeg -ss %seek -vframes 1 %thumbfile'), - ); - $form['autothumb']['video_ffmpeg_helper_auto_thumbnail_seek'] = array( - '#type' => 'textfield', - '#title' => t('Video seek offset for thumbnail'), - '#description' => t('Time in seconds to seek into video before extracting the thumbnail'), - '#default_value' => variable_get('video_ffmpeg_helper_auto_thumbnail_seek', 2), - ); - // automatic video conversion settings - $form['autoconv'] = array( - '#type' => 'fieldset', - '#title' => t('Automatic video conversion'), - '#collapsible' => TRUE, - '#collapsed' => TRUE - ); - $form['autoconv']['video_ffmpeg_helper_auto_cvr_cron'] = array( - '#type' => 'checkbox', - '#title' => t('Use drupal cron for autoconversion'), - '#description' => t('Click this if you want to execute the video_scheduler.php from the standard drupal cron. If you want to use distributed encodings you might want to disable this.'), - '#default_value' => variable_get('video_ffmpeg_helper_auto_cvr_cron', true), - ); - $form['autoconv']['video_ffmpeg_helper_auto_conversion'] = array( - '#type' => 'checkbox', - '#title' => t('Auto conversion for videos'), - '#description' => t('If set up correctly, this will auto-convert each uploaded video to the configured format.') . '
' . t("IMPORTANT: you will need the video_render.php correctly configured and run by cron. See README.txt in the video_ffmpeg_helper folder or click here for more informations."), - '#default_value' => variable_get('video_ffmpeg_helper_auto_conversion', false), - ); - $form['autoconv']['video_ffmpeg_helper_auto_cvr_width'] = array( - '#type' => 'textfield', - '#title' => t('Video rendering width'), - '#description' => t('The width of the converted video. The height will be automatically calculated to maintain aspect ratio.'), - '#size' => 3, - '#maxlength' => 3, - '#default_value' => variable_get('video_ffmpeg_helper_auto_cvr_width', 400), - ); - $form['autoconv']['video_ffmpeg_helper_auto_cvr_video_bitrate'] = array( - '#type' => 'textfield', - '#title' => t('Video bitrate'), - '#description' => t('The video bitrate in bit/s of the converted video.'), - '#size' => 10, - '#maxlength' => 10, - '#default_value' => variable_get('video_ffmpeg_helper_auto_cvr_video_bitrate', 200000), - ); - $form['autoconv']['video_ffmpeg_helper_auto_cvr_audio_bitrate'] = array( - '#type' => 'textfield', - '#title' => t('Audio bitrate'), - '#description' => t('The audio bitrate in bit/s of the converted video.'), - '#size' => 10, - '#maxlength' => 10, - '#default_value' => variable_get('video_ffmpeg_helper_auto_cvr_audio_bitrate', 64000), - ); - $form['autoconv']['advanced'] = array( - '#type' => 'fieldset', - '#title' => t('Advanced settings'), - '#collapsible' => TRUE, - '#collapsed' => TRUE - ); - $form['autoconv']['advanced']['video_ffmpeg_helper_auto_cvr_options'] = array( - '#type' => 'textfield', - '#title' => t('Video converter options'), - '#description' => t('Provide the ffmpeg options to configure the video conversion. Available argument values are: ').'
    '. - '
  • '.t('%videofile (the video file to convert)'). - '
  • '.t('%convertfile (a newly created file to store the converted file)'). - '
  • '.t('%size (video resolution of the converted file)'). - '
'. - t('For further informations refer to the !ffmpegdoc', array('!ffmpegdoc' => l(t('Official FFMpeg documentation.'), 'http://ffmpeg.mplayerhq.hu/ffmpeg-doc.html', array('fragment' => TRUE)))), - '#default_value' => variable_get('video_ffmpeg_helper_auto_cvr_options', '-y -i %videofile -f flv -ar 22050 -ab %audiobitrate -s %size -b %videobitrate -qscale 1 %convertfile'), - ); - return system_settings_form($form); -} - - -/** - * Implementation of hook_form_alter() - */ -function video_ffmpeg_helper_form_alter(&$form, &$form_state, $form_id) { - - $node = $form['#node']; - - //print_r($form); - if($form_id == 'video_node_form') { - - if (function_exists('_image_check_settings')) { - _image_check_settings(); - $form['#attributes'] = array("enctype" => "multipart/form-data"); - - } - - - if($node->vtype == 'upload' && user_access('bypass automatic video conversion') && variable_get('video_ffmpeg_helper_auto_conversion', false)) { - $form['video']['video_ffmpeg_helper_convertion_bypass'] = array( - '#type' => 'checkbox', - '#title' => t('Bypass automatic video conversion'), - '#description' => t('Check this if you want that your video is submitted as it is, without being converted.'), - '#default_value' => $node->video_ffmpeg_helper_convertion_bypass, // for node previews - ); - } - } - -} - - -/** - * Implementation of hook_nodeapi() - * - * NOTE: video_ffmpeg nodeapi is executed after video_player rendering - */ -function video_ffmpeg_helper_nodeapi(&$node, $op, $teaser) { - if($node->type == 'video' && $node->vtype == 'upload') { - switch ($op) { - case 'load': - // let's check if we have a valid encoded video - if(isset($node->serial_data['video_encoded_fid']) && - is_numeric($node->serial_data['video_encoded_fid']) && - $node->serial_data['video_encoded_fid'] > 0) { - // this video have an encoded version. let's use it insted of the original one. We can safely do this as video_ffmpeg_helper will be scheduled by Drupal after video and video_upload modules - $output = array(); - $file = _video_upload_get_file($node->serial_data['video_encoded_fid']); - $output['current_video_rendered_file'] = $file; - $output['vidfile'] = file_create_url($file->filepath); - // set the filesize - $output['size'] = $file->filesize; - - return $output; - } - //print $node->serial_data['video_encoded_fid']; die; - - if(variable_get('video_ffmpeg_helper_auto_resolution', false) || variable_get('video_ffmpeg_helper_auto_playtime', false)) { - _video_ffmpeg_helper_get_video_info($node); - } - break; - - case 'presve': - break; - - case 'update': - /* delete the already existing batch script, we'll recreate it below */ - if(variable_get('video_ffmpeg_helper_auto_conversion', false)) { - db_query('DELETE FROM {video_rendering} WHERE vid = %d AND nid = %d', $node->vid, $node->nid); - } - /* FALLTHROUGH */ - case 'insert': - if(variable_get('video_ffmpeg_helper_auto_conversion', false) && $node->new_video_upload_file_fid > 0 && !$node->video_ffmpeg_helper_convertion_bypass) { - // add rendering job to queue - _video_ffmpeg_helper_add_rendering($node); - } - - break; - - case 'prepare': - ; // for future uses - break; - - case 'view': - if($teaser == FALSE) { - if(_video_ffmpeg_helper_is_being_processed($node)) { - // if the video is still being processed we display a "rendering in progress" message - $node->content['video_player']['#value'] = theme('video_ffmpeg_helper_inprogress', $node); - } - else if($node->serial_data['video_encoded_fid'] == -1) { // conversion failed - $node->content['video_player']['#value'] = theme('video_ffmpeg_helper_encoding_failed', $node); - } - } - //print_r($node); die; - break; - - case 'alter': - ; // for future uses - break; - - case 'delete': - db_query('DELETE FROM {video_rendering} WHERE vid = %d AND nid = %d', $node->vid, $node->nid); - if($node->serial_data['video_encoded_fid'] > 0) { - $file = _video_upload_get_file($node->serial_data['video_encoded_fid']); - _video_upload_delete_file($file); - } - break; - - } - } -} - - -/** - * Add a video conversion rendering process to the queue -*/ -function _video_ffmpeg_helper_add_rendering(&$node) { - $file = _video_upload_get_file($node->new_video_upload_file_fid); - //print_r($node); die; - db_query('INSERT INTO {video_rendering} (vid, nid, origfile, pid, status, started, completed) VALUES (%d, %d, "%s", %d, %d, %d, %d)', $node->vid, $node->nid, $file->filepath, 0, VIDEO_RENDERING_PENDING, 0, 0); - - drupal_set_message(t('Video submission queued for processing. Please wait: our servers are preparing your video for web displaying.')); - - // let's add the rendering in progress video - $node->vidfile = variable_get('video_ffmpeg_helper_auto_cvr_busy_video_path', 'busy.flv'); - db_query('UPDATE {video} SET vidfile = "%s" WHERE nid=%d AND vid=%d', $node->vidfile, $node->nid, $node->vid); - -} - - -/** - * Returns true if the video is being encoded or queeded -*/ -function _video_ffmpeg_helper_is_being_processed($node) { - $result = db_query("SELECT status FROM {video_rendering} WHERE vid = %d AND nid = %d", $node->vid, $node->nid); - $status = db_result($result); - if($status == VIDEO_RENDERING_PENDING || $status == VIDEO_RENDERING_ACTIVE) { // video is still being converted - return TRUE; - } - return FALSE; -} - - - -/** - * Get some informations from the video file -*/ -function _video_ffmpeg_helper_get_video_info(&$node, $value=null) { - static $ffmpeg_info; - - if (isset($value)) { - $ffmpeg_info[$node->nid] = $value; - return; - } - - $fileobj = $node->new_video_upload_file ? $node->new_video_upload_file : _video_upload_get_file($node->new_video_upload_file_fid); - - // check if we have some info in the cache for the given node - if(isset($ffmpeg_info[$fileobj->filename])) { - return $ffmpeg_info[$fileobj->filename]; - } - - // escape file name for safety - $file = escapeshellarg($fileobj->filepath); - // create the full command to execute - $command = variable_get('video_ffmpeg_helper_ffmpeg_path', '/usr/bin/ffmpeg') . ' -i ' . $file; - - //execute the command - ob_start(); - passthru($command." 2>&1", $command_return); - $command_output = ob_get_contents(); - ob_end_clean(); - - // cache the result for further calls - $ffmpeg_info[$node->nid] = $command_output; - - return $command_output; -} - - -/** - * Return the video resolution - */ -function _video_ffmpeg_helper_auto_resolution(&$node) { - - if(variable_get('video_ffmpeg_helper_auto_resolution', false)) { - - // call ffmpeg -i - $ffmpeg_output = _video_ffmpeg_helper_get_video_info($node); - - // get resolution - $pattern = '/Video: .*, ([0-9]{2,4}x[0-9]{2,4})/'; - preg_match_all($pattern, $ffmpeg_output, $matches, PREG_PATTERN_ORDER); - $resolution = $matches[1][0]; - - return explode("x", $resolution); - } - return null; -} - - -/** - * Return the playtime seconds of a video -*/ -function _video_ffmpeg_helper_auto_playtime(&$node) { - - if(variable_get('video_ffmpeg_helper_auto_playtime', false)) { - - // call ffmpeg -i - $ffmpeg_output = _video_ffmpeg_helper_get_video_info($node); - - // get playtime - $pattern = '/Duration: ([0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9])/'; - preg_match_all($pattern, $ffmpeg_output, $matches, PREG_PATTERN_ORDER); - $playtime = $matches[1][0]; - - // ffmpeg return lenght as 00:00:31.1 Let's get playtime from that - $hmsmm = explode(":", $playtime); - - $tmp = explode(".", $hmsmm[2]); - $seconds = $tmp[0]; - - $hours = $hmsmm[0]; - $minutes = $hmsmm[1]; - - return $seconds + ($hours * 3600) + ($minutes * 60); - } -} - -/** - * Generates a thumbnail from the video file - * - * @param $node - * object with node information - * - * @return - * a drupal file object - */ -function _video_ffmpeg_helper_auto_thumbnail(&$node) { - if (!$node->new_video_upload_file || - ($node->new_video_upload_file && count($_POST) && $_POST['new_video_upload_file_fid'])) { - // we have already thumbnailed this new upload file - return NULL; - } - if (!$node->new_video_upload_file && $node->current_video_upload_file_fid) { // no new files uploaded. skipping thumnailing stuff - _video_image_thumbnail_debug(t('No new files to thumbnail')); - return NULL; - } - // gets the newly uploaded file object - $uploaded_file = $node->new_video_upload_file; - - // are we debugging? - // escape the filename for safety - $videofile = escapeshellarg($uploaded_file->filepath); - // let's create a temp filename into the drupal temp directory - $thumbfile = tempnam(file_directory_temp(), 'tnail-thumb'); - // get ffmpeg configurations - $seek = variable_get('video_ffmpeg_helper_auto_thumbnail_seek', 2); - $tnail = variable_get('video_ffmpeg_helper_ffmpeg_path', '/usr/bin/ffmpeg'); - $options = preg_replace(array('/%videofile/', '/%thumbfile/', '/%seek/'), array($videofile, $thumbfile, $seek), variable_get('video_image_thumbnailer_options', '-i %videofile -an -y -f mjpeg -ss %seek -vframes 1 %thumbfile')); - - // executes the command - $command = "$tnail $options"; - ob_start(); - passthru($command." 2>&1", $tnail_return); - $tnail_output = ob_get_contents(); - ob_end_clean(); - _video_ffmpeg_helper_get_video_info($node, $tnail_output); - - _video_image_thumbnail_debug(t('Thumbnailer command: ').$command); - _video_image_thumbnail_debug(t('Thumbnailer output: ')."
\n$tnail_output\n
"); - if (!file_exists($thumbfile)) { - $error_param = array( - '%file' => $thumbfile, - '%cmd' => $command, - '%out' => $tnail_output, - ); - $error_msg = t("error generating thumbnail for video: generated file %file does not exist.
Command Executed:
%cmd
Command Output:
%out", $error_param); - // let's log this - watchdog('video_ffmpeg_helper',$error_msg); - return false; - } - $file = array( - 'filename' => $uploaded_file->filename . ".video-thumb.jpg", - 'filemime' => 'image/jpeg', - 'filesize' => filesize($thumbfile), - 'filepath' => $thumbfile, - 'nid' => $node->nid, - ); - - if ($tnail_return) { - _video_image_thumbnail_debug(t('Failed to thumbnail video')); - return $false; - } - _video_image_thumbnail_debug(t('Successfully thumbnailed video')); - return (object)$file; -} - -function _video_ffmpeg_helper_check_exe_path($path=NULL) { - if (!$path) { - $path = variable_get('video_ffmpeg_helper_ffmpeg_path', '/usr/bin/ffmpeg'); - } - if (function_exists('is_executable')) { - $test = 'is_executable'; - } else { - $test = 'file_exists'; - } - return $test($path); -} - -/** - * Displays a "encoding in progress message" -*/ -function theme_video_ffmpeg_helper_inprogress($node) { - return '
'. t('This video is currently being processed. Please wait.') . '
'; -} - - -/** - * Display an "encoding failed" message" -*/ -function theme_video_ffmpeg_helper_encoding_failed($node) { - return '
'. t('The video conversion process has failed. You might want to submit a simpler video format like mpeg or divx avi.
If the problem persists please contact website administrators.') . '
'; -} - - -/** - * Implementation of hook_theme(). - */ -function video_ffmpeg_helper_theme() { - return array( - 'video_ffmpeg_helper_encoding_failed' => array( - 'arguments' => array('node' => NULL), - ), - 'video_ffmpeg_helper_inprogress' => array( - 'arguments' => array('node' => NULL), - ), - ); -} diff --git a/plugins/video_ffmpeg_helper/video_render.php b/plugins/video_ffmpeg_helper/video_render.php deleted file mode 100644 index 8aae1cb..0000000 --- a/plugins/video_ffmpeg_helper/video_render.php +++ /dev/null @@ -1,256 +0,0 @@ - - * @author Heshan Wanigasooriya - * @author Glen Marianko Twitter@demoforum - * @todo - */ - - -/** - * video_scheduler.php configuration -*/ -// set path to the ffmpeg executable -define('VIDEO_RENDERING_FFMPEG_PATH', '/usr/bin/ffmpeg'); - -// set to the temp file path. -//IMPORTANT: the user who runs this script must have permissions to create files there. If this is not the case the default php temporary folder will be used. -define('VIDEO_RENDERING_TEMP_PATH', '/tmp/video'); - -// nice value to append at the beginning of the command -define('VIDEO_RENDERING_NICE', 'nice -n 19'); - - -/** - * video_scheduler.php configuration ends. - * DO NOT EDIT BELOW THIS LINE -*/ - -/** - * Define some constants -*/ -define('VIDEO_RENDERING_PENDING', 1); -define('VIDEO_RENDERING_ACTIVE', 5); -define('VIDEO_RENDERING_COMPLETE', 10); -define('VIDEO_RENDERING_FAILED', 20); - -if (isset($_SERVER['argv'][3])) { - $url = parse_url($_SERVER['argv'][3]); - $_SERVER['SCRIPT_NAME'] = $url['path']; - $_SERVER['HTTP_HOST'] = $url['host']; -} - -include_once('./includes/bootstrap.inc'); -//module_load_include('/includes/bootstrap.inc', 'video_render', '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); - - -// allow execution only from the command line! -if(empty($_SERVER['REQUEST_METHOD'])) { - if($_SERVER['argc'] < 3) { // check for command line arguments - watchdog('video_render', 'Incorrect parameters to the video_render.php script.', WATCHDOG_ERROR); - print t('Incorrect parameters'); - } - else { - video_render_main(); - } -} -else { - print t('This script is only executable from the command line.'); - die(); -} - -print("\n"); - -function video_render_main() { - - // get parameters passed from command line - $nid = $_SERVER['argv'][1]; - $vid = $_SERVER['argv'][2]; - - // set the status to active - _video_render_job_change_status($nid, $vid, VIDEO_RENDERING_ACTIVE); - // load the job object - $job = _video_render_load_job($nid, $vid, VIDEO_RENDERING_ACTIVE); - - if($job == NULL) { - watchdog('video_render', 'video_render.php has been called with an invalid job resource. exiting.'); - die; - } - $command = _video_render_get_command($job); - - //print('executing ' . $command); die; - watchdog('video_render', 'executing: ' . $command); - - //execute the command - ob_start(); - passthru($command." 2>&1", $command_return); - $command_output = ob_get_contents(); - ob_end_clean(); - - //print $command_output; - - if (!file_exists($job->convfile) || !filesize($job->convfile)) { - watchdog('video_render', 'video conversion failed. ffmpeg reported the following output: ' . $command_output, WATCHDOG_ERROR); - _video_render_set_video_encoded_fid($job->nid, $job->vid, -1); - _video_render_job_change_status($job->nid, $job->vid, VIDEO_RENDERING_FAILED); - } - else { - // move the video to the definitive location - $file = array( - 'filename' => basename($job->origfile . ".flv"), - 'filemime' => 'application/octet-stream', // is there something better??? - 'filesize' => filesize($job->convfile), - 'filepath' => $job->convfile, - 'nid' => $job->nid, - ); - - $file = ((object) $file); - - //print_r($file); - //$dest_dir = variable_get('video_upload_default_path', 'videos') .'/'; - // the above no more works as token supports - use dirname - $dest_dir = dirname($job->origfile) . '/'; - - if (file_copy($file, $dest_dir)) { - //$file->fid = db_next_id('{files}_fid'); - //print_r($file); - //GMM: fixed added timestamp column for completeness (otherwise 0), D6 FILE_STATUS - db_query("INSERT INTO {files} (fid, uid, filename, filepath, filemime, filesize, status, timestamp) VALUES (%d, %d, '%s', '%s', '%s', %d, %d, %d)", $file->fid, $job->uid, $file->filename, $file->filepath, $file->filemime, $file->filesize, FILE_STATUS_PERMANENT, time()); - - // to know other modules of fid - $file->fid = db_last_insert_id('files', 'fid'); - - db_query("INSERT INTO {video_upload} (vid, nid, fid) VALUES (%d, %d, %d)", $job->vid, $job->vid, $file->fid); - - // update the video table - db_query('UPDATE {video} SET vidfile = "%s", videox = %d, videoy = %d WHERE nid=%d AND vid=%d', "", $job->calculatedx, $job->calculatedy, $job->nid, $job->vid); - - // update the video_encoded_fid in video serial data - _video_render_set_video_encoded_fid($job->nid, $job->vid, $file->fid); - - _video_render_job_change_status($job->nid, $job->vid, VIDEO_RENDERING_COMPLETE); - - watchdog('video_render', 'successfully converted %orig to %dest', array('%orig' => $job->origfile, '%dest' => $file->filepath)); - - // delete the temp file - unlink($job->convfile); - } - else { - // 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); - - _video_render_set_video_encoded_fid($job->nid, $job->vid, -1); - _video_render_job_change_status($job->nid, $job->vid, VIDEO_RENDERING_FAILED); - } - } -} - - -/** - * Set the video_encoded_fid in the video table - * We store -1 as video_encoded_fid if the encoding failed -*/ -function _video_render_set_video_encoded_fid($nid, $vid, $encoded_fid) { - db_lock_table('video'); - $node = db_fetch_object(db_query("SELECT serialized_data FROM {video} WHERE nid = %d AND vid = %d", $nid, $vid)); - $node->serial_data = unserialize($node->serialized_data); - //GMM: save fid of previously encoded file - $old_fid = $node->serial_data['video_encoded_fid']; - $node->serial_data['video_encoded_fid'] = $encoded_fid; - $node->serialized_data = serialize($node->serial_data); - db_query("UPDATE {video} SET serialized_data = '%s' WHERE nid = %d AND vid = %d", $node->serialized_data, $nid, $vid); - db_unlock_tables(); - // GMM: update status on previously encoded fid to 0 so drupal will delete - if($old_fid > 0) - db_query("UPDATE {files} SET status = %d WHERE fid = %d", 0, $old_fid); -} - - - -/** - * Get a string cointaining the command to be executed including options -*/ -function _video_render_get_command(&$job) { - - $videofile = escapeshellarg($job->origfile); // escape file name for safety - $convfile = tempnam(VIDEO_RENDERING_TEMP_PATH, 'video-rendering'); - $audiobitrate = variable_get('video_ffmpeg_helper_auto_cvr_audio_bitrate', 64); - $videobitrate = variable_get('video_ffmpeg_helper_auto_cvr_video_bitrate', 200); - $size = _video_render_get_size($job); - - - $converter = VIDEO_RENDERING_FFMPEG_PATH; - $options = preg_replace(array('/%videofile/', '/%convertfile/', '/%audiobitrate/', '/%size/', '/%videobitrate/'), array($videofile, $convfile, $audiobitrate, $size, $videobitrate), variable_get('video_ffmpeg_helper_auto_cvr_options', '-y -i %videofile -f flv -ar 22050 -ab %audiobitrate -s %size -b %videobitrate -qscale 1 %convertfile')); - - // set to the converted file output - $job->convfile = $convfile; - - return VIDEO_RENDERING_NICE . " $converter $options"; -} - - - -/** - * Calculate the converted video size basing on the width set on administration. - * Aspect ration is maintained. -*/ -function _video_render_get_size(&$job) { - $def_width = variable_get('video_ffmpeg_helper_auto_cvr_width', 400); - - $height = $def_width * ($job->videoy / $job->videox); // do you remember proportions?? :-) - - - $height = round($height); - // add one if odd - if($height % 2) { - $height++; - } - - $job->calculatedx = $def_width; - $job->calculatedy = $height; - - return $def_width . 'x' . $height; -} - - -/** - * Load a job -*/ -function _video_render_load_job($nid, $vid, $status) { - $result = db_query('SELECT * FROM {video_rendering} vr INNER JOIN {node} n ON vr.vid = n.vid INNER JOIN {video} v ON n.vid = v.vid WHERE n.nid = v.nid AND vr.nid = n.nid AND vr.status = %d AND n.nid = %d AND n.vid = %d', $status, $nid, $vid); - - 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($nid, $vid, $status) { - $result = db_query('UPDATE {video_rendering} SET status = %d WHERE nid = %d AND vid = %d', $status, $nid, $vid); -} - -?> diff --git a/plugins/video_ffmpeg_helper/video_scheduler.php b/plugins/video_ffmpeg_helper/video_scheduler.php deleted file mode 100644 index 1ebbe02..0000000 --- a/plugins/video_ffmpeg_helper/video_scheduler.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @author Heshan Wanigasooriya - * @todo - */ - - -/** - * video_scheduler.php configuration -*/ - -// number of conversion jobs active at the same time -define('VIDEO_RENDERING_FFMPEG_INSTANCES', 5); - -/** - * video_scheduler.php configuration ends. - * DO NOT EDIT BELOW THIS LINE -*/ - -/** - * Define some constants -*/ -define('VIDEO_RENDERING_PENDING', 1); -define('VIDEO_RENDERING_ACTIVE', 5); -define('VIDEO_RENDERING_COMPLETE', 10); -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); - - -// allow execution only from the command line! -if(empty($_SERVER['REQUEST_METHOD'])) { - video_scheduler_main(); -} -else { - print t('This script is only executable from the command line.'); - die(); -} - - - -/** - * Main for video_scheduler.php -*/ -function video_scheduler_main() { - - 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]) : ''; - exec("php video_render.php $job->nid $job->vid $url > /dev/null &"); -} - - -/** - * Select VIDEO_RENDERING_FFMPEG_INSTANCES jobs from the queue - * - * @return an array containing jobs -*/ -function video_scheduler_select() { - - $result = db_query('SELECT * FROM {video_rendering} vr INNER JOIN {node} n ON vr.vid = n.vid INNER JOIN {video} v ON n.vid = v.vid WHERE n.nid = v.nid AND vr.nid = n.nid AND vr.status = %d ORDER BY n.created', VIDEO_RENDERING_PENDING); - - // TODO: order jobs by priority - - // TODO: use db_query_range - $jobs = array(); - $i = 0; - $count = db_result(db_query('SELECT COUNT(*) FROM {video_rendering} vr INNER JOIN {node} n ON vr.vid = n.vid INNER JOIN {video} v ON n.vid = v.vid WHERE n.nid = v.nid AND vr.nid = n.nid AND vr.status = %d ORDER BY n.created', VIDEO_RENDERING_PENDING)); - while($i < $count && $i < VIDEO_RENDERING_FFMPEG_INSTANCES) { - $jobs[] = db_fetch_object($result); - $i++; - } -//print_r($jobs); - return $jobs; -} - - - - -?> -- cgit v1.2.3