From b5d49f9ee872d3f4563ad97beea974b877009f37 Mon Sep 17 00:00:00 2001 From: Fabio Varesano Date: Thu, 4 Jan 2007 17:55:21 +0000 Subject: Added video_ffmpeg_helper plugin to add some apis for ffmpeg. Changed video_image to use video_ffmpeg_helper. --- .../video_ffmpeg_helper/video_ffmpeg_helper.module | 205 +++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 plugins/video_ffmpeg_helper/video_ffmpeg_helper.module (limited to 'plugins/video_ffmpeg_helper/video_ffmpeg_helper.module') diff --git a/plugins/video_ffmpeg_helper/video_ffmpeg_helper.module b/plugins/video_ffmpeg_helper/video_ffmpeg_helper.module new file mode 100644 index 0000000..78ce78b --- /dev/null +++ b/plugins/video_ffmpeg_helper/video_ffmpeg_helper.module @@ -0,0 +1,205 @@ + + */ + + +/** + * Implementation of hook_help(). + */ +function video_ffmpeg_helper_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable thumbnails support for video module.'); + } +} + +/** + * Implementation of hook_menu() + */ +function video_ffmpeg_helper_menu($may_cache) { + $items = array(); + if ($may_cache) { + $items[] = array( + 'path' => 'admin/content/video/ffmpeg_helper', + 'title' => t('Video ffmpeg Helper'), + 'description' => t('Administer video_ffmpeg_helper module settings'), + 'callback' => 'drupal_get_form', + 'callback arguments' => array('video_ffmpeg_helper_admin_settings'), + 'access' => user_access('administer site configuration'), + 'type' => MENU_NORMAL_ITEM, + ); + } + return $items; +} + +/** + * Validation for settings form + */ +function video_ffmpeg_helper_admin_settings_validate($form_id, &$form_values, &$form) { + if ($form_values['video_ffmpeg_helper_auto_thumbnail']) { + if (function_exists('is_executable')) { + $test = 'is_executable'; + } else { + $test = 'file_exists'; + } + if (!$test($form_values['video_ffmpeg_helper_ffmpeg_path'])) { + form_set_error('video_image_ffmpeg_path', t('Set correct path for thumbnailer')); + } + if (!is_numeric($form_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_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 + if (module_exists('video_image')) { + if (variable_get('video_ffmpeg_helper_auto_thumbnail', 0)) { + $upload_weight = db_result(db_query("SELECT weight FROM {system} WHERE name='video_image'")); + db_query("UPDATE {system} SET weight=".($upload_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['autothumb'] = array( + '#type' => 'fieldset', + '#title' => t('Automatic video thumbnailing'), + '#collapsible' => TRUE, + '#collapsed' => TRUE + ); + $form['autothumb']['video_ffmpeg_helper_auto_thumbnail'] = array( + '#type' => 'checkbox', + '#title' => t('Auto thumbnail for videos'), + '#description' => t('If set up correctly, this will auto-generate a thumbnail for each video created.'), + '#default_value' => variable_get('video_ffmpeg_helper_auto_thumbnail', false), + ); + $form['autothumb']['video_ffmpeg_helper_auto_thumbnail_only'] = array( + '#type' => 'checkbox', + '#title' => t('Use auto-thumbnailer exclusively for video images'), + '#description' => t('If checked, this will disable the file upload box for the user-supplied thumbnail. Only check this if you have checked to be sure that auto-thumbnailing works. Auto thumbnail must be selected for this to be enabled.'), + '#default_value' => variable_get('video_ffmpeg_helper_auto_thumbnail_only', false), + '#disabled' => !variable_get('video_ffmpeg_helper_auto_thumbnail', false), + ); + $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), + ); + $form['autothumb']['video_ffmpeg_helper_auto_thumbnail_debug'] = array( + '#type' => 'checkbox', + '#title' => t('Debug auto-thumbnail process'), + '#default_value' => variable_get('video_ffmpeg_helper_auto_thumbnail_debug', false), + ); + return system_settings_form($form); +} + + +/** + * Implementation of hook_form_alter() + */ +function video_ffmpeg_helper_form_alter($form_id, &$form) { + + //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 (variable_get('video_ffmpeg_helper_auto_thumbnail_only', false)) { + // delete the video image parts + $form['image'] = NULL; + } + } + } + +} + + +/* 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(empty($_SESSION['video_upload_file']) || + !$_SESSION['video_upload_file']->newfile || + $node->iid || $_SESSION['video_upload_file']->iid || + $_SESSION['video_upload_file']->thumbnailed) { + if (variable_get('video_image_auto_thumbnail_debug', false)) { + if (empty($_SESSION['video_upload_file'])) + drupal_set_message(t('no video has been uploaded: make sure that video_image weight is greater than video_upload weight; make sure that the video file is not too large to be uploaded.')); + } + return null; + } + $debug = variable_get('video_image_auto_thumbnail_debug', false); + $videofile = escapeshellarg($_SESSION['video_upload_file']->filepath); + $thumbfile = tempnam(file_directory_temp(), 'tnail-thumb'); + $seek = variable_get('video_image_auto_thumbnail_seek', 2); + $tnail = variable_get('video_image_thumbnailer_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')); + + $command = "$tnail $options"; + ob_start(); + passthru($command." 2>&1", $tnail_return); + $tnail_output = ob_get_contents(); + ob_end_clean(); + + if ($debug) { + drupal_set_message(t('Thumbnailer command: ').$command); + drupal_set_message(t('Thumbnailer output: ')."
\n$tnail_output\n
"); + } + if (!file_exists($thumbfile)) { + drupal_set_message(t('video_image_auto_thumbnail: file %file does not exist', array('%file' => $thumbfile)), 'error'); + } + $file = array( + 'filename' => $_SESSION['video_upload_file']->filename . ".video-thumb.jpg", + 'filemime' => 'image/jpeg', + 'filesize' => filesize($thumbfile), + 'filepath' => $thumbfile, + 'nid' => $node->nid, + ); + $_SESSION['video_upload_file']->thumbnailed = TRUE; + if ($debug) { + if ($tnail_return) { + drupal_set_message(t('Failed to thumbnail video')); + } else { + drupal_set_message(t('Successfully thumbnailed video')); + } + } + return (object)$file; +} + + + + -- cgit v1.2.3