aboutsummaryrefslogtreecommitdiff
path: root/plugins/video_ffmpeg_helper
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/video_ffmpeg_helper')
-rw-r--r--plugins/video_ffmpeg_helper/README.txt47
-rw-r--r--plugins/video_ffmpeg_helper/video_ffmpeg_helper.info8
-rw-r--r--plugins/video_ffmpeg_helper/video_ffmpeg_helper.install89
-rw-r--r--plugins/video_ffmpeg_helper/video_ffmpeg_helper.module539
-rw-r--r--plugins/video_ffmpeg_helper/video_render.php256
-rw-r--r--plugins/video_ffmpeg_helper/video_scheduler.php115
6 files changed, 0 insertions, 1054 deletions
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 @@
-<?php
-//$Id$
-/**
- * @file
- * Provide installation functions for video_ffmpeg_helper.module .
- *
- * @author Heshan Wanigasooriya <heshan at heidisoft dot com>
- * <heshanmw at gmail dot com>
- * @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 @@
-<?php
-//$Id$
-/**
- * @file
- * Provide some api for use ffmpeg. Simplify video nodes creation.
- *
- * @author Fabio Varesano <fvaresano at yahoo dot it>
- * @author Heshan Wanigasooriya <heshan at heidisoft.com><heshanmw at gmail dot com>
- * @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: ').'<ol><li>'.t('%videofile (the video file to thumbnail)').'<li>'.t('%thumbfile (a newly created temporary file to overwrite with the thumbnail)').'<li>'.t('%seek (seconds to seek into video before extracting image).').'</ol>'.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' => "<div>-i %videofile -y -an -f mjpeg -ss %seek -t 0.001 %thumbfile</div>", '!new' => '<div>-i %videofile -an -y -f mjpeg -ss %seek -vframes 1 %thumbfile</div>')),
- '#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.') . '<br />' . 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 <a title='User Guide' href='http://video.heidisoft.com/docs/users-guide-26'>click here</a> 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: ').'<ul>'.
- '<li>'.t('%videofile (the video file to convert)').
- '<li>'.t('%convertfile (a newly created file to store the converted file)').
- '<li>'.t('%size (video resolution of the converted file)').
- '</ul>'.
- 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: ')."<pre>\n$tnail_output\n</pre>");
- 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.<br />Command Executed:<br />%cmd<br />Command Output:<br />%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 '<div class="video-ffmpeg-helper-inprogress">'. t('This video is currently being processed. Please wait.') . '</div>';
-}
-
-
-/**
- * Display an "encoding failed" message"
-*/
-function theme_video_ffmpeg_helper_encoding_failed($node) {
- return '<div class="video-ffmpeg-helper-encoding-failed">'. t('The video conversion process has failed. You might want to submit a simpler video format like <em>mpeg</em> or <em>divx avi</em>.<br />If the problem persists please contact website administrators.') . '</div>';
-}
-
-
-/**
- * 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 @@
-<?php
-//$Id$
-/**
- * @file
- * Renders a video. This script is called concurrently by video_scheduler.php
- * This script has to be launched with "php video_render.php nid vid"
- * If you are not using sites/default/settings.php as your settings file,
- * add an optional parameter for the drupal site url:
- * "php video_render.php nid vid http://example.com/" or
- * "php video_render.php nid vid http://example.org/drupal/"
- *
- * @author Fabio Varesano <fvaresano at yahoo dot it>
- * @author Heshan Wanigasooriya <heshan at heidisoft.com><heshanmw@gmail.com>
- * @author Glen Marianko Twitter@demoforum <glenm at demoforum dot com>
- * @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.<br />The script was run by %uname .<br />The folder owner is %fowner .<br />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 @@
-<?php
-//$Id$
-/**
- * @file
- * Implement video rendering scheduling.
- * If you are not using sites/default/settings.php as your settings file,
- * add an optional parameter for the drupal site url:
- * "php video_scheduler.php http://example.com/" or
- * "php video_scheduler.php http://example.org/drupal/"
- *
- * @author Fabio Varesano <fvaresano at yahoo dot it>
- * @author Heshan Wanigasooriya <heshan at heidisoft.com><heshanmw at gmail dot com>
- * @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;
-}
-
-
-
-
-?>