From 333f8444587d061d96512206e3c69d2ab4da0a16 Mon Sep 17 00:00:00 2001 From: Fabio Varesano Date: Thu, 14 Dec 2006 20:44:19 +0000 Subject: Patch #100520 by vhmauery (http://drupal.org/user/28957): Make program for thumbnails configurable --- plugins/video_image/video_image.module | 73 ++++++++++++++++------------------ 1 file changed, 35 insertions(+), 38 deletions(-) (limited to 'plugins/video_image/video_image.module') diff --git a/plugins/video_image/video_image.module b/plugins/video_image/video_image.module index 3e16f7d..dbd22ee 100644 --- a/plugins/video_image/video_image.module +++ b/plugins/video_image/video_image.module @@ -48,12 +48,16 @@ function video_image_admin_settings_validate($form_id, &$form_values, &$form) { } else { $test = 'file_exists'; } - if (!$test($form_values['video_image_ffmpeg_path'])) { - form_set_error('video_image_ffmpeg_path', t('Set correct path for ffmpeg')); + if (!$test($form_values['video_image_thumbnailer_path'])) { + form_set_error('video_image_thumbnailer_path', t('Set correct path for thumbnailer')); } if (!is_numeric($form_values['video_image_auto_thumbnail_seek'])) { form_set_error('video_image_auto_thumbnail_seek', t('Seek time must be an integer')); } + $options = $form_values['video_image_thumbnailer_options']; + if (!strstr($options, '%videofile') || !strstr($options, '%thumbfile')) { + form_set_error('video_image_thumbnailer_options', t('Thumbnail options must contain mandatory arguments %videofile and %thumbfile')); + } } } @@ -85,8 +89,8 @@ function video_image_admin_settings() { ); $form['autothumb']['video_image_auto_thumbnail'] = array( '#type' => 'checkbox', - '#title' => t('Auto thumbnail for videos (using ffmpeg)'), - '#description' => t('This requires setting the path to the ffmpeg executable below. If set up correctly, this will auto-generate a thumbnail for each video created.'), + '#title' => t('Auto thumbnail for videos'), + '#description' => t('This requires setting the path to the thumbnailer executable below. If set up correctly, this will auto-generate a thumbnail for each video created.'), '#default_value' => variable_get('video_image_auto_thumbnail', false), ); $form['autothumb']['video_image_auto_thumbnail_only'] = array( @@ -96,18 +100,24 @@ function video_image_admin_settings() { '#default_value' => variable_get('video_image_auto_thumbnail_only', false), '#disabled' => !variable_get('video_image_auto_thumbnail', false), ); + $form['autothumb']['video_image_thumbnailer_path'] = array( + '#type' => 'textfield', + '#title' => t('Video thumbnailer executable path'), + '#description' => t('Set the full path to the thumbnailer executable here to enable automatic thumbnailing of videos'), + '#default_value' => variable_get('video_image_thumbnailer_path', '/usr/bin/ffmpeg'), + ); + $form['autothumb']['video_image_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_image_thumbnailer_options', '-i %videofile -an -y -f mjpeg -ss %seek -vframes 1 %thumbfile'), + ); $form['autothumb']['video_image_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_image_auto_thumbnail_seek', 2), ); - $form['autothumb']['video_image_ffmpeg_path'] = array( - '#type' => 'textfield', - '#title' => t('ffmpeg executable path'), - '#description' => t('Set the full path to the ffmpeg executable here to enable automatic thumbnailing of videos'), - '#default_value' => variable_get('video_image_ffmpeg_path', '/usr/bin/ffmpeg'), - ); $form['autothumb']['video_image_auto_thumbnail_debug'] = array( '#type' => 'checkbox', '#title' => t('Debug auto-thumbnail process'), @@ -253,7 +263,7 @@ function theme_video_image_body($node) { return $output; } -/* Generates a thumbnail from the video file using ffmpeg +/* Generates a thumbnail from the video file * * @param $node * object with node information @@ -274,48 +284,35 @@ function _video_image_auto_thumbnail(&$node) { } $debug = variable_get('video_image_auto_thumbnail_debug', false); $videofile = escapeshellarg($_SESSION['video_upload_file']->filepath); - $filepath = tempnam(file_directory_temp(), 'ffmpeg-thumb'); + $thumbfile = tempnam(file_directory_temp(), 'tnail-thumb'); $seek = variable_get('video_image_auto_thumbnail_seek', 2); - $ffmpeg = variable_get('video_image_path_to_ffmpeg', '/usr/bin/ffmpeg'); + $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')); - /* try the -vframes option first (newer versions of ffmpeg support this) - * we use passthru so we can get the return value of ffmpeg to determine - * if it was successful or not (return 0 == success) - */ - $command = "$ffmpeg -i $videofile -an -y -f mjpeg -ss $seek -vframes 1 $filepath"; + $command = "$tnail $options"; ob_start(); - passthru($command." 2>&1", $ffmpeg_return); - $ffmpeg_output = ob_get_contents(); + passthru($command." 2>&1", $tnail_return); + $tnail_output = ob_get_contents(); ob_end_clean(); - /* if we failed, we can try again, using the -t option instead of -vframes - * older versions of ffmpeg don't support -vframes only -t - */ - if ($return) { - $command = "$ffmpeg -i $videofile -y -an -f mjpeg -ss $seek -t 0.001 $filepath"; - ob_start(); - passthru($command." 2>&1", $ffmpeg_return); - $ffmpeg_output = ob_get_contents(); - ob_end_clean(); - } if ($debug) { - drupal_set_message(t('ffmpeg command: ').$command); - drupal_set_message(t('ffmpeg output: ')."
\n$ffmpeg_output\n
"); + drupal_set_message(t('Thumbnailer command: ').$command); + drupal_set_message(t('Thumbnailer output: ')."
\n$tnail_output\n
"); } - if (!file_exists($filepath)) { - drupal_set_message(t('video_image_auto_thumbnail: file %file does not exist', array('%file' => $filepath)), 'error'); + 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($filepath), - 'filepath' => $filepath, + 'filesize' => filesize($thumbfile), + 'filepath' => $thumbfile, 'nid' => $node->nid, ); $_SESSION['video_upload_file']->thumbnailed = TRUE; if ($debug) { - if ($ffmpeg_return) { - drupal_set_message(t('ffmpeg failed to thumbnail video')); + if ($tnail_return) { + drupal_set_message(t('Failed to thumbnail video')); } else { drupal_set_message(t('Successfully thumbnailed video')); } -- cgit v1.2.3