You are here

uploadfield.module in Video 6.3

File

types/uploadfield/uploadfield.module
View source
<?php

/**
 * @file
 * uploadfield core hooks and menu callbacks.
 */
include_once dirname(__FILE__) . '/uploadfield_file.inc';
include_once dirname(__FILE__) . '/uploadfield_widget.inc';

/**
 * Implementation of hook_init().
 *
 * Load required includes.
 */
function uploadfield_init() {

  // add CSS file
  drupal_add_css(drupal_get_path('module', 'video') . '/types/uploadfield/uploadfield.css');

  // If FileField is not available, immediately disable uploadfield.
  if (!module_exists('filefield')) {
    module_disable(array(
      'uploadfield',
    ));
    drupal_set_message(t('The uploadfield module has been disabled. The <a href="http://drupal.org/project/filefield">FileField module</a> needs to be installed for it to work properly.'));
    return;
  }
}

/**
 * Implementation of hook_theme().
 */
function uploadfield_theme() {
  $theme = array();
  $theme = array(
    // Theme an image uploaded to uploadfield with alt and title.
    // TODO: Switch to core theme image if possible.
    'uploadfield_image' => array(
      'arguments' => array(
        'file' => NULL,
        'alt' => '',
        'title' => '',
        'attributes' => NULL,
        'getsize' => TRUE,
      ),
    ),
    // Theme an uploadfield field item. It calls imagefied_image with the proper
    // item properties as arguments.
    'uploadfield_item' => array(
      'arguments' => array(
        'item' => NULL,
      ),
    ),
    // uploadfield_widget form element type theme function.
    'uploadfield_widget' => array(
      'arguments' => array(
        'element' => NULL,
      ),
      'file' => 'uploadfield_widget.inc',
    ),
    // Use to generate a preview (admin view) of an uploadfield item for use in
    // field item forms and filefield widgets. Invoked by filefield_widget_process.
    'uploadfield_widget_preview' => array(
      'arguments' => array(
        'item' => NULL,
      ),
    ),
    // Theme function for the field item elements. allows you to place children
    // within the context of the parent.
    'uploadfield_widget_item' => array(
      'arguments' => array(
        'element' => NULL,
      ),
    ),
    // Generates and img tag to the admin thumbnail of an uploadfield upload.
    'uploadfield_admin_thumbnail' => array(
      'arguments' => array(
        'item' => NULL,
      ),
    ),
    // Generates and img tag to the video thumbnails.
    'uploadfield_widget_video_thumb' => array(
      'arguments' => array(
        'item' => NULL,
      ),
    ),
    // uploadfield formatter theme functions.
    'uploadfield_formatter_video_plain' => array(
      'arguments' => array(
        'element' => NULL,
      ),
      'file' => 'uploadfield_formatter.inc',
    ),
    'uploadfield_formatter_video_nodelink' => array(
      'arguments' => array(
        'element' => NULL,
      ),
      'file' => 'uploadfield_formatter.inc',
    ),
    'uploadfield_formatter_video_imagelink' => array(
      'arguments' => array(
        'element' => NULL,
      ),
      'file' => 'uploadfield_formatter.inc',
    ),
    //from includes/common.inc
    'video_format_play' => array(
      'arguments' => array(
        'output' => NULL,
        'url' => NULL,
        'title' => NULL,
        'link_text' => NULL,
      ),
    ),
    'video_play_dcr' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_divx' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_flash' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_ogg_theora' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_quicktime' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_realmedia' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_swf' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_play_windowsmedia' => array(
      'arguments' => array(
        'node' => NULL,
      ),
    ),
    'video_encoding_failed' => array(
      'arguments' => array(),
    ),
    'video_inprogress' => array(
      'arguments' => array(),
    ),
  );
  if (module_exists('imagecache')) {

    // imagecache presets
    foreach (imagecache_presets() as $preset) {
      $theme['uploadfield_formatter_' . $preset['presetname'] . '_videolinked'] = array(
        'arguments' => array(
          'element' => NULL,
        ),
        'function' => 'theme_uploadfield_formatter_videolinked',
        'file' => 'uploadfield_formatter.inc',
      );
    }
  }
  return $theme;
}

/**
 * Implementation of hook_elements().
 */
function uploadfield_elements() {
  $elements = array();

  // An uploadfield is really just a FileField with extra processing.
  $filefield_elements = module_invoke('filefield', 'elements');
  $elements['uploadfield_widget'] = $filefield_elements['filefield_widget'];
  $elements['uploadfield_widget']['#process'][] = 'uploadfield_widget_process';
  $elements['uploadfield_widget']['#element_validate'][] = 'uploadfield_widget_validate';

  // uploadfield needs a separate value callback to save its alt and title texts.
  $elements['uploadfield_widget']['#value_callback'] = 'uploadfield_widget_value';
  return $elements;
}

/**
 * Implementation of hook_file_download.
 */
function uploadfield_file_download($filepath) {

  //  watchdog('video', 'file path is ' . $filepath);
  //  echo $filepath;
  // Return headers for admin thumbnails if private files are enabled.
  //  if (strpos($filepath, 'video_thumbs') !== FALSE) {
  //    $original_path = str_replace('video_thumbs/', '', $filepath);
  //    $original_full_path = file_create_path($original_path);
  //    $thumb_full_path = file_create_path($filepath);
  //
  //    // Allow access to temporary thumbnails, since they're not yet associated
  //    // with a node. If not temporary, check access on the original file.
  //    $status = db_result(db_query("SELECT status FROM {files} WHERE filepath = '%s'", $original_full_path));
  //    $access = ($status == 0 || module_invoke_all('file_download', $original_path));
  //    if ($access && $info = getimagesize($thumb_full_path)) {
  //      return array(
  //      'Content-Type: ' . $info['mime'],
  //      'Content-Length: ' . filesize($thumb_full_path)
  //      );
  //    }
  //  }
  // Return headers for default images.
  //  if (strpos($filepath, 'uploadfield_default_images') !== FALSE) {
  if (strpos($filepath, 'video_thumbs') !== FALSE) {
    $full_path = file_create_path($filepath);
    if ($info = getimagesize($full_path)) {
      return array(
        'Content-Type: ' . $info['mime'],
        'Content-Length: ' . filesize($full_path),
      );
    }
  }
}

/**
 * Implementation of CCK's hook_widget_info().
 */
function uploadfield_widget_info() {
  $module_path = drupal_get_path('module', 'uploadfield');
  return array(
    'uploadfield_widget' => array(
      'label' => t('Video'),
      'field types' => array(
        'filefield',
      ),
      'multiple values' => CONTENT_HANDLE_CORE,
      'callbacks' => array(
        'default value' => CONTENT_CALLBACK_CUSTOM,
      ),
      'description' => t('An edit widget for video files, including video thumbnails and transcoding to flash.'),
    ),
  );
}

/**
 * Implementation of CCK's hook_widget_settings().
 */
function uploadfield_widget_settings($op, $widget) {
  switch ($op) {
    case 'form':
      return uploadfield_widget_settings_form($widget);
    case 'validate':
      return uploadfield_widget_settings_validate($widget);
    case 'save':
      return uploadfield_widget_settings_save($widget);
  }
}

/**
 * Implementation of CCK's hook_widget().
 *
 * Assign default properties to item and delegate to FileField.
 */
function uploadfield_widget(&$form, &$form_state, $field, $items, $delta = 0) {

  // Add default values to items.
  // TODO: use CCK's default value callback.
  if (empty($items[$delta])) {
    $items[$delta] = array(
      'alt' => '',
      'title' => '',
    );
  }

  // Start with the FileField widget as a basic start.
  // Note that FileField needs to modify $form by reference.
  $element = filefield_widget($form, $form_state, $field, $items, $delta);

  // Add uploadfield specific validators.
  //  $element['#upload_validators'] = array_merge($element['#upload_validators'], uploadfield_widget_upload_validators($field));
  return $element;
}

/**
 * Get the additional upload validators for an image field.
 *
 * @param $field
 *   The CCK field array.
 * @return
 *   An array suitable for passing to file_save_upload() or the file field
 *   element's '#upload_validators' property.
 */
function uploadfield_widget_upload_validators($field) {
  $validators = array();

  // Ensure that only web images are supported.
  $web_extensions = array(
    'mov',
    'mp4',
    '3gp',
    '3g2',
    'mpg',
    'mpeg',
    // quicktime
    'divx',
    //divx
    'rm',
    // realplayer
    'flv',
    'f4v',
    //flash player
    'swf',
    // swf player
    'dir',
    'dcr',
    // dcr player
    'asf',
    'wmv',
    'avi',
    'mpg',
    'mpeg',
    // windows media
    'ogg',
  );
  $extensions = array_filter(explode(' ', $field['widget']['file_extensions']));
  if (empty($extensions)) {
    $extensions = $web_extensions;
  }
  $validators['filefield_validate_extensions'][0] = implode(' ', array_intersect($extensions, $web_extensions));

  // Add the image validator as a basic safety check.
  //  $validators['filefield_validate_is_image'] = array();
  // Add validators for resolutions.
  //  if (!empty($field['widget']['max_resolution']) || !empty($field['widget']['min_resolution'])) {
  //    $validators['filefield_validate_image_resolution'] = array(
  //        $field['widget']['max_resolution'],
  //        $field['widget']['min_resolution'],
  //    );
  //  }
  return $validators;
}

/**
 * Implementation of CCK's hook_field_formatter_info().
 */
function uploadfield_field_formatter_info() {
  $module_path = drupal_get_path('module', 'uploadfield');
  $formatters = array(
    'video_plain' => array(
      'label' => t('video'),
      'field types' => array(
        'filefield',
      ),
      'description' => t('Displays video files with player embedded.'),
    ),
    'video_nodelink' => array(
      'label' => t('video thumbnail linked to video'),
      'field types' => array(
        'filefield',
      ),
      'description' => t('Displays video thumb files then the video.'),
    ),
  );
  if (module_exists('imagecache')) {
    foreach (imagecache_presets() as $preset) {
      $formatters[$preset['presetname'] . '_videolinked'] = array(
        'label' => t('Preset @preset of video thumbnail linked to video', array(
          '@preset' => $preset['presetname'],
        )),
        'field types' => array(
          'filefield',
        ),
      );
    }
  }
  return $formatters;
}

/**
 * Implementation of CCK's hook_default_value().
 */
function uploadfield_default_value(&$form, &$form_state, $field, $delta) {
  return filefield_default_value($form, $form_state, $field, $delta);
}

/**
 * Implementation of hook_form_[form_id]_alter().
 *
 * Modify the add new field form to make "Image" the default formatter.
 */
function uploadfield_form_content_field_overview_form_alter(&$form, &$form_state) {
  $form['#submit'][] = 'uploadfield_form_content_field_overview_submit';
}

/**
 * Submit handler to set a new field's formatter to "video_plain".
 */
function uploadfield_form_content_field_overview_submit(&$form, &$form_state) {
  if (isset($form_state['fields_added']['_add_new_field']) && isset($form['#type_name'])) {
    $new_field = $form_state['fields_added']['_add_new_field'];
    $node_type = $form['#type_name'];
    $field = content_fields($new_field, $node_type);
    if ($field['widget']['module'] == 'uploadfield') {
      foreach ($field['display_settings'] as $display_type => $display_settings) {
        if ($field['display_settings'][$display_type]['format'] == 'default') {
          $field['display_settings'][$display_type]['format'] = 'video_plain';
        }
      }
      content_field_instance_update($field);
    }
  }
}

/**
 * @defgroup "Theme Callbacks"
 * @{
 * @see uploadfield_theme().
 */
function theme_uploadfield_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
  $file = (array) $file;

  //  return $file['filepath'];
  if (!is_file($file['filepath'])) {
    return '<!-- File not found: ' . $file['filepath'] . ' -->';
  }
  if ($getsize) {

    // Use cached width and height if available.
    if (!empty($file['data']['width']) && !empty($file['data']['height'])) {
      $attributes['width'] = $file['data']['width'];
      $attributes['height'] = $file['data']['height'];
    }
    elseif (list($width, $height, $type, $image_attributes) = @getimagesize($file['filepath'])) {
      $attributes['width'] = $width;
      $attributes['height'] = $height;
    }
  }
  if (!empty($title)) {
    $attributes['title'] = $title;
  }

  // Alt text should be added even if it is an empty string.
  $attributes['alt'] = $alt;

  // Add a timestamp to the URL to ensure it is immediately updated after editing.
  $query_string = '';
  if (isset($file['timestamp'])) {
    $query_character = variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC) == FILE_DOWNLOADS_PRIVATE && variable_get('clean_url', '0') == '0' ? '&' : '?';
    $query_string = $query_character . $file['timestamp'];
  }
  $url = file_create_url($file['filepath']) . $query_string;
  $attributes['src'] = $url;
  $attributes = drupal_attributes($attributes);
  return '<span></span><img ' . $attributes . ' />';
}
function theme_uploadfield_item($item) {
  return theme('uploadfield_image', $item, $item['alt'], $item['title']);
}
function theme_uploadfield_widget_preview($item = NULL) {
  return '<div class="uploadfield-preview">' . theme('uploadfield_admin_thumbnail', $item) . '</div>';
}
function theme_uploadfield_widget_item($element) {
  return theme('filefield_widget_item', $element);
}
function theme_uploadfield_admin_thumbnail($item = NULL) {
  if (is_null($item) || empty($item['filepath'])) {
    return '<!-- link to default admin thumb -->';
  }
  $thumb_path = uploadfield_file_admin_thumb_path($item);
  return '<img src="' . file_create_url($thumb_path) . '" title="' . check_plain($item['filename']) . '" />';
}
function theme_uploadfield_widget_video_thumb($item = NULL) {
  return '<div class="uploadfield-video-thumb">' . theme('uploadfield_image', $item, '', '', '', FALSE) . '</div>';
}

/**
 * @} End defgroup "Theme Callbacks".
 */

/**
 * Implementing video module API
 * hook_v_perm()
 */
function uploadfield_v_perm() {
  return array(
    'use default thumbnail',
    'bypass conversion video',
  );
}

/**
 * Implementation of hook_v_help
 */
function video_upload_v_help() {
  $help = array();
  $help['upload']['data'] = '<b>' . t('Upload support') . '</b>';
  $help['upload']['children'] = array(
    t('You can upload a video file from your computer to this website.'),
  );
  return $help;
}

/**
 * Implements the hook_v_auto_resolution
 */
function uploadfield_v_auto_resolution($vidfile) {

  //TODO : add dynamic converter selector
  module_load_include('inc', 'video', '/plugins/ffmpeg');
  if (module_hook('ffmpeg', 'auto_playtime')) {
    return ffmpeg_auto_playtime($vidfile);
  }
  return false;
}

/**
 * Implements the hook_v_auto_resolution
 */
function uploadfield_v_auto_playtime($vidfile) {

  //TODO : add dynamic converter selector
  module_load_include('inc', 'video', '/plugins/ffmpeg');
  if (module_hook('ffmpeg', 'auto_playtime')) {
    return ffmpeg_auto_playtime($vidfile);
  }
  return false;
}

/**
 * Implementation of hook_v_video()
 */
function uploadfield_v_video($op, &$element) {
  global $user;
  switch ($op) {
    case 'insert':
    case 'update':

      // TODO : need to add validation on just submit scenario
      $field = content_fields($element['#field_name'], $element['#type_name']);

      // auto thumbnailing
      if ($field['widget']['autothumbnail']) {
        $update = NULL;
        $vidfile = $element['#value'];
        $vid = $vidfile['fid'];
        $vid_path = $vidfile['data']['video_thumb'];
        $vid_dir = explode('/', $vid_path);
        $vid_name = $vid_dir[count($vid_dir) - 1];
        $file = new stdClass();
        $file->uid = $user->uid;
        $file->status = FILE_STATUS_PERMANENT;
        $file->filename = $vid_name;
        $file->filepath = $vid_path;
        $file->filemime = file_get_mimetype($vid_name);
        $file->filesize = filesize($vid_path);
        $file->timestamp = time();
        if ($op == 'update') {
          $old_fid = $element['#default_value']['data']['video_thumb_fid'];
          $update = 'fid';
          $file->fid = $old_fid;
        }
        drupal_write_record('files', $file, $update);

        // get fid if and only if insert
        if ($op == 'insert') {
          $file->fid = db_last_insert_id('files', 'fid');
        }

        // add file id to the data
        $element['data']['video_thumb_fid'] = array(
          '#type' => 'value',
          '#value' => $file->fid,
        );
      }

      // auto covnersion
      if ($field['widget']['autoconversion'] && !$element['#value']['data']['bypass_autoconversion']) {
        video_auto_transcode_add_to_queue($element, $op);
      }
      break;
    case 'delete':

      //delete thumbnails
      break;
    case 'thumbs':
      include_once dirname(__FILE__) . '/uploadfield_thumb.inc';

      //create thumbs and display
      video_auto_thumb_process($element);
      break;
    case 'convert':
      include_once dirname(__FILE__) . '/uploadfield_convert.inc';

      //create FLV file

      //      video_auto_transcode_process($element);
      break;
  }
}

Functions

Namesort descending Description
theme_uploadfield_admin_thumbnail
theme_uploadfield_image @defgroup "Theme Callbacks"
theme_uploadfield_item
theme_uploadfield_widget_item
theme_uploadfield_widget_preview
theme_uploadfield_widget_video_thumb
uploadfield_default_value Implementation of CCK's hook_default_value().
uploadfield_elements Implementation of hook_elements().
uploadfield_field_formatter_info Implementation of CCK's hook_field_formatter_info().
uploadfield_file_download Implementation of hook_file_download.
uploadfield_form_content_field_overview_form_alter Implementation of hook_form_[form_id]_alter().
uploadfield_form_content_field_overview_submit Submit handler to set a new field's formatter to "video_plain".
uploadfield_init Implementation of hook_init().
uploadfield_theme Implementation of hook_theme().
uploadfield_v_auto_playtime Implements the hook_v_auto_resolution
uploadfield_v_auto_resolution Implements the hook_v_auto_resolution
uploadfield_v_perm Implementing video module API hook_v_perm()
uploadfield_v_video Implementation of hook_v_video()
uploadfield_widget Implementation of CCK's hook_widget().
uploadfield_widget_info Implementation of CCK's hook_widget_info().
uploadfield_widget_settings Implementation of CCK's hook_widget_settings().
uploadfield_widget_upload_validators Get the additional upload validators for an image field.
video_upload_v_help Implementation of hook_v_help