You are here

field_kaltura.module in Kaltura 7.3

Kaltura as a field primary module file.

File

plugins/field_kaltura/field_kaltura.module
View source
<?php

/**
 * @file
 * Kaltura as a field primary module file.
 */

/**
 * Implements hook_field_info().
 */
function field_kaltura_field_info() {
  return array(
    'field_kaltura_entryid' => array(
      'label' => t('Kaltura Media field'),
      'description' => t('Kaltura media field.'),
      'settings' => array(
        'thumbsize_width' => variable_get('kaltura_video_entry_thumb_width', '120'),
        'thumbsize_height' => variable_get('kaltura_video_entry_thumb_height', '90'),
        'player_height' => variable_get('kaltura_video_entry_height', '364'),
        'player_width' => variable_get('kaltura_video_entry_width', '410'),
        'entry_widget' => '48501',
        'custom_player' => '',
        'delivery' => 'HTTP',
        'stretch' => 0,
        'rotate' => 0,
        'custom_cw' => '',
        'add_existing' => 0,
      ),
      'instance_settings' => array(
        'thumbsize_width' => variable_get('kaltura_video_entry_thumb_width', '120'),
        'thumbsize_height' => variable_get('kaltura_video_entry_thumb_height', '90'),
        'player_height' => variable_get('kaltura_video_entry_height', '364'),
        'player_width' => variable_get('kaltura_video_entry_width', '410'),
        'entry_widget' => '48501',
        'custom_player' => '',
        'delivery' => 'HTTP',
        'stretch' => 0,
        'rotate' => 0,
        'custom_cw' => '',
        'add_existing' => 0,
      ),
      'default_widget' => 'all_media',
      'default_formatter' => 'field_kaltura_player_default',
    ),
  );
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function field_kaltura_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
  $field = $form['#field'];
  if ($field['type'] == 'field_kaltura_entryid') {

    // Multiple values is not supported with kaltura file for now remove after
    // adding support.
    $form['field']['cardinality']['#access'] = FALSE;
    $form['field']['cardinality']['#value'] = 1;
  }
}

/**
 * Implements hook_field_settings_form().
 */
function field_kaltura_field_settings_form($field, $instance, $has_data) {
  $m_path = drupal_get_path('module', 'kaltura');
  $settings = $field['settings'];
  $saved_player = !empty($settings['entry_widget']) ? $settings['entry_widget'] : KALTURASETTINGS_DEFAULT_VIDEO_PLAYER_UICONF;
  $players = kaltura_choose_player($saved_player);
  $form['kaltura_entry_video_display'] = array(
    '#prefix' => '<div class="player-settings f-set">',
    '#type' => 'item',
    '#title' => t('Player Settings'),
  );
  $form['#attached']['css'] = array(
    $m_path . '/style/kaltura_settings.css',
  );
  $form['#attached']['js'] = array(
    $m_path . '/js/kaltura_settings.js',
  );
  $form['entry_widget'] = $players['default_widget'];
  $form['entry_widget']['#default_value'] = $saved_player;
  $form['player_width'] = array(
    '#type' => 'textfield',
    '#title' => t('Player Width'),
    '#size' => 5,
    '#attributes' => array(
      'data-kaltura-reflect-width-of-player' => $players['default_widget']['#id'],
    ),
    '#default_value' => !empty($settings['player_width']) ? $settings['player_width'] : '400',
  );
  $form['player_height'] = array(
    '#type' => 'textfield',
    '#title' => t('Player Height'),
    '#size' => 5,
    '#attributes' => array(
      'data-kaltura-reflect-height-of-player' => $players['default_widget']['#id'],
    ),
    '#default_value' => !empty($settings['player_height']) ? $settings['player_height'] : '330',
  );
  $form['delivery'] = array(
    '#type' => 'select',
    '#title' => t('Delivery Type'),
    '#options' => array(
      'HTTP' => 'Progressive Download (HTTP)',
      'RTMP' => 'Adaptive Streaming (RTMP)',
      'AKMI' => 'Akamai HD Network',
    ),
    '#default_value' => !empty($settings['delivery']) ? $settings['delivery'] : 'HTTP',
  );

  // TODO: Remove prefixes and use Form API fieldsets.
  $form['video_display_advanced'] = array(
    '#prefix' => '<div class="advanced-display inner advanced f-set">',
    '#type' => 'item',
    '#title' => t('Advanced'),
    '#attributes' => array(
      'class' => 'advanced-label',
    ),
  );
  $form['custom_player'] = array(
    '#type' => 'textfield',
    '#title' => t('Custom Player UI_Conf'),
    '#size' => 6,
    '#default_value' => !empty($settings['custom_player']) ? $settings['custom_player'] : '',
  );
  $form['video_display_advanced_close'] = array(
    '#markup' => '</div>',
  );
  $form['thumbsize'] = array(
    '#prefix' => '<div class="thumbsize inner f-set">',
    '#type' => 'item',
    '#title' => t('Thumbnail Settings'),
    '#description' => t('Note - these settings will only apply when choosing "Thumbnail" display'),
  );
  $form['thumbsize_width'] = array(
    '#type' => 'textfield',
    '#title' => t('Thumbnail Width'),
    '#size' => 5,
    '#default_value' => !empty($settings['thumbsize_width']) ? $settings['thumbsize_width'] : '80',
  );
  $form['thumbsize_height'] = array(
    '#type' => 'textfield',
    '#title' => t('Thumbnail Height'),
    '#size' => 5,
    '#default_value' => !empty($settings['thumbsize_height']) ? $settings['thumbsize_height'] : '45',
  );
  $form['rotate'] = array(
    '#type' => 'checkbox',
    '#title' => t('Rotate Thumbnails for Video Items'),
    '#default_value' => !empty($settings['rotate']) ? $settings['rotate'] : '0',
  );
  $form['thumbsize_close'] = array(
    '#markup' => '</div>',
  );
  $form['kaltura_entry_video_display_close'] = array(
    '#markup' => '</div>',
  );
  $form['content_ingestion'] = array(
    '#prefix' => '<div class="content-ingestion f-set">',
    '#type' => 'item',
    '#title' => t('Content ingestion'),
  );
  $form['content_ingestion_advanced'] = array(
    '#prefix' => '<div class="advanced-content-ingestion inner advanced f-set">',
    '#type' => 'item',
    '#title' => t('Advanced'),
  );
  $form['custom_cw'] = array(
    '#type' => 'textfield',
    '#title' => t('Custom uploader widget ui_conf'),
    '#size' => 6,
    '#default_value' => !empty($settings['custom_cw']) ? $settings['custom_cw'] : '',
  );
  $form['content_ingestion_advanced_close'] = array(
    '#markup' => '</div>',
  );
  $form['add_existing_text'] = array(
    '#theme' => 'html_tag',
    '#tag' => 'span',
    '#value' => t('When adding media, please choose if the user will be able to add new media (via upload or record), use media already existing in the Drupal DB (uploaded from Drupal and/or imported from Kaltura), or both.'),
    '#attributes' => array(
      'class' => array(
        'desc-text',
      ),
    ),
  );
  $form['add_existing'] = array(
    '#type' => 'radios',
    '#title' => t('Add Media Settings'),
    '#options' => array(
      'upload' => t('Add new media only'),
      'existing' => t('Use existing media only'),
      'both' => t('Use existing media and add new media'),
    ),
    '#default_value' => isset($settings['add_existing']) ? $settings['add_existing'] : 'both',
  );
  $form['kcw_button_text'] = array(
    '#type' => 'textfield',
    '#title' => t('Add Media button label'),
    '#size' => 30,
    '#default_value' => !empty($settings['kcw_button_text']) ? $settings['kcw_button_text'] : t('Add Media'),
  );
  $form['content_ingestion_close'] = array(
    '#markup' => '</div>',
  );
  switch ($instance['widget']['type']) {
    case 'field_kaltura_image':
      unset($form['delivery'], $form['rotate'], $form['entry_widget']);
      $form['kaltura_entry_video_display']['#title'] = t('Image display');
      $form['player_height']['#title'] = t('Image Height');
      $form['player_width']['#title'] = t('Image Width');
      break;
    case 'field_kaltura_audio':

      // Remove unrelevent settings to audio.
      foreach ($form as $key => $val) {
        if (strpos($key, 'thumbsize') === 0) {
          unset($form[$key]);
        }
      }
      unset($form['rotate']);
      break;
  }
  return $form;
}

/**
 * Implements hook_field_widget_info().
 */
function field_kaltura_field_widget_info() {
  return array(
    'field_kaltura_video' => array(
      'label' => t('Video only widget'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
        'default value' => FIELD_BEHAVIOR_NONE,
      ),
    ),
    'field_kaltura_audio' => array(
      'label' => t('Audio only widget'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
        'default value' => FIELD_BEHAVIOR_NONE,
      ),
    ),
    'field_kaltura_image' => array(
      'label' => t('Image only widget'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
        'default value' => FIELD_BEHAVIOR_NONE,
      ),
    ),
    'field_kaltura_all_media' => array(
      'label' => t('All media types widget'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
        'default value' => FIELD_BEHAVIOR_NONE,
      ),
    ),
    'field_kaltura_web_cam' => array(
      'label' => t('Webcam widget'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
        'default value' => FIELD_BEHAVIOR_NONE,
      ),
    ),
  );
}

/**
 * Implements hook_field_widget_form().
 */
function field_kaltura_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  $item = isset($items[$delta]) ? $items[$delta] : NULL;
  $name = $field['field_name'];
  $entry_val = isset($items[$delta]['entryid']) ? $items[$delta]['entryid'] : '';
  $mediat_val = isset($items[$delta]['mediatype']) ? $items[$delta]['mediatype'] : '';
  $custom_cw = $form_state['field'][$element['#field_name']][$element['#language']]['field']['settings']['custom_cw'];
  $add_existing = $form_state['field'][$element['#field_name']][$element['#language']]['field']['settings']['add_existing'];
  $button_text = !empty($form_state['field'][$element['#field_name']][$element['#language']]['field']['settings']['kcw_button_text']) ? $form_state['field'][$element['#field_name']][$element['#language']]['field']['settings']['kcw_button_text'] : t('Add media');
  $element += array(
    '#delta' => $delta,
  );
  switch ($instance['widget']['type']) {
    case 'field_kaltura_video':
      $instance['uiconf'] = $custom_cw ? $custom_cw : KALTURASETTINGS_CW_UICONF_ID_VIDEO;
      $widget = kaltura_widget_hendler($instance, $entry_val, $mediat_val, $name, $add_existing, $button_text);
      $element += $widget;
      break;
    case 'field_kaltura_audio':
      $instance['uiconf'] = $custom_cw ? $custom_cw : KALTURASETTINGS_CW_UICONF_ID_AUDIO;
      $widget = kaltura_widget_hendler($instance, $entry_val, $mediat_val, $name, $add_existing, $button_text);
      $element += $widget;
      break;
    case 'field_kaltura_image':
      $instance['uiconf'] = $custom_cw ? $custom_cw : KALTURASETTINGS_CW_UICONF_ID_IMAGE;
      $widget = kaltura_widget_hendler($instance, $entry_val, $mediat_val, $name, $add_existing, $button_text);
      $element += $widget;
      break;
    case 'field_kaltura_web_cam':
      $instance['uiconf'] = $custom_cw ? $custom_cw : KALTURASETTINGS_CW_COMMENTS_UICONF_ID;
      $widget = kaltura_widget_hendler($instance, $entry_val, $mediat_val, $name, $add_existing, $button_text);
      $element += $widget;
      break;
    case 'field_kaltura_all_media':
      $instance['uiconf'] = $custom_cw ? $custom_cw : KALTURASETTINGS_CW_UICONF_ID;
      $widget = kaltura_widget_hendler($instance, $entry_val, $mediat_val, $name, $add_existing, $button_text);
      $element += $widget;
      break;
  }
  if (!empty($instance['required'])) {
    $element['entryid']['#required'] = 1;
    $element['button']['#markup'] .= theme('form_required_marker', array());
  }
  $entity_info = entity_get_info($instance['entity_type']);
  $element['settings'] = array(
    '#type' => 'fieldset',
    '#title' => t('Override format settings'),
    '#description' => t('Format settings for this media can be overridden exclusively for this %bundle.', array(
      '%bundle' => $entity_info['bundles'][$instance['bundle']]['label'],
    )),
    '#collapsible' => TRUE,
    '#collapsed' => empty($item['settings']),
  );
  foreach (array_keys($instance['display']) as $mode_name) {
    $overridden_settings = !empty($item['settings'][$mode_name]['non_default']) ? $item['settings'][$mode_name]['settings'] : array();
    $element['settings'][$mode_name] = array(
      '#type' => 'fieldset',
      '#title' => $mode_name == 'default' ? t('Default view mode') : $entity_info['view modes'][$mode_name]['label'],
      '#collapsible' => TRUE,
      '#collapsed' => !$overridden_settings,
    );
    $element['settings'][$mode_name]['non_default'] = array(
      '#type' => 'checkbox',
      '#title' => t('Override settings for this view mode'),
      '#default_value' => !!$overridden_settings,
    );
    $element['settings'][$mode_name]['settings'] = array(
      '#type' => 'fieldset',
      '#states' => array(
        'invisible' => array(
          ':input[name="' . $element['#field_name'] . '[' . $langcode . '][' . $delta . '][settings][' . $mode_name . '][non_default]"]' => array(
            'checked' => FALSE,
          ),
        ),
      ),
    );
    $element['settings'][$mode_name]['settings'] += field_kaltura_field_formatter_settings_form($field, $instance, $mode_name, $form, $form_state);
    foreach ($overridden_settings as $name => $value) {
      $element['settings'][$mode_name]['settings'][$name]['#default_value'] = $value;
    }
  }
  return $element;
}

/**
 * Returns the widget according to the given widget type.
 */
function kaltura_widget_hendler($instance, $entry, $mediat, $name, $add_existing, $button_text) {
  drupal_add_js(array(
    'kcw-modal-style' => array(
      'modalSize' => array(
        'type' => 'fixed',
        'width' => 740,
        'height' => 440,
      ),
    ),
  ), 'setting');
  field_kaltura_add_modal_js($name);
  ctools_include('modal');
  ctools_include('ajax');
  ctools_modal_add_js();
  $widget_type = str_replace($instance['widget']['module'] . '_', '', $instance['widget']['type']);
  $cw_vars = drupal_json_encode(array(
    'kshow_id' => 0,
    'partner_data' => '',
    'type' => 'entry',
    'context' => 'field',
    'field_id' => $name,
    'ui_conf' => $instance['uiconf'],
    'wtype' => $instance['widget']['type'],
    'add_existing' => $add_existing,
    'button_text' => rawurlencode($button_text),
  ));
  if ($add_existing == 'both' || $add_existing == 'existing') {
    $action_buttons = ctools_modal_text_button($button_text, 'kaltura/nojs/existing/' . $name . '/' . $instance['widget']['type'] . '/' . $cw_vars, $button_text);
  }
  else {
    $action_buttons = ctools_modal_text_button($button_text, 'kaltura/nojs/kcw', $button_text, 'ctools-modal-kcw-modal-style');
  }
  $widget['entryid'] = array(
    '#title' => $name,
    '#suffix' => '</div>',
    '#type' => 'hidden',
    '#default_value' => $entry,
    '#pre_render' => array(
      0 => 'field_kaltura_tumb_pre',
    ),
  );
  $widget['mediatype'] = array(
    '#prefix' => '<div id="' . $name . '-media-type">',
    '#suffix' => '</div>',
    '#type' => 'hidden',
    '#default_value' => $mediat,
  );
  if ($entry) {
    drupal_add_js(array(
      'metadata-modal-style' => array(
        'modalSize' => array(
          'type' => 'scale',
          'width' => 0.4,
          'height' => 0.6,
        ),
      ),
    ), 'setting');
    $widget['meta_edit'] = array(
      '#markup' => ctools_modal_text_button('Edit Metadata', 'kaltura/nojs/metadata_editor/' . $entry, 'Edit Metadata', 'ctools-modal-metadata-modal-style'),
    );
  }
  $widget['button'] = array(
    '#type' => 'item',
    '#markup' => $action_buttons,
  );
  return $widget;
}

/**
 * Adds js function to handel the callback from the flush uploader.
 *
 * @param mixed $field_id
 *   The filed id to update.
 *
 * @todo Add error handling.
 */
function field_kaltura_add_modal_js($field_id) {
  $js_settings['kaltura']['gotoURL'] = kaltura_cw_destination();
  $js_settings['kaltura']['thumbnailBaseURL'] = _kaltura_thumbnail_base_url();
  $js_settings['kaltura']['kcwField'] = $field_id;
  drupal_add_js($js_settings, 'setting');
}

/**
 * @todo Add doc.
 */
function field_kaltura_tumb_pre($element) {
  $name = $element['#array_parents'][0];
  $val = $element['#value'];
  $element['#prefix'] = '<div id="' . $name . '-thumb-wrap" class="kaltura-thumb-wrap">' . kaltura_get_field_thumbs($val, $name, 'Media', FALSE) . '</div><div id="' . $name . '-entryid">';
  return $element;
}

/**
 * Helper function to constrat the entry thumbnail with the remove button.
 *
 * @param mixed $field_value
 * @param mixed $field_name
 * @param mixed $type
 * @param mixed $required
 *
 * @return string
 */
function kaltura_get_field_thumbs($field_value, $field_name, $type, $required) {
  if ($field_value) {
    $thumb = '<div class="kaltura_field_thumb"><img src="' . _kaltura_thumbnail_base_url() . '/entry_id/' . $field_value . '" /><br />' . '<input type="button" title="remove item" class="remove_media" /></div>';
  }
  else {
    $thumb = '<div class="kaltura_field_thumb"></div>';
  }
  return $thumb . '<div class="clear-block"></div>';
}

/**
 * Implements hook_field_validate().
 */
function field_kaltura_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {

  // Placeholder.
}

/**
 * Implements hook_field_widget_error().
 */
function field_kaltura_field_widget_error($element, $error, $form, &$form_state) {

  // Placeholder.
}

/**
 * Implements hook_field_is_empty().
 */
function field_kaltura_field_is_empty($item, $field) {
  if (empty($item['entryid']) || empty($item['mediatype'])) {
    return TRUE;
  }
  return FALSE;
}

/**
 * Implements hook_theme().
 */
function field_kaltura_theme() {
  return array(
    'kaltura_metadata' => array(
      'variables' => array(),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_player_default' => array(
      'variables' => array(
        'embed' => array(
          'html' => array(),
        ),
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_player' => array(
      'variables' => array(
        'embed' => array(
          'html' => array(),
        ),
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_player_title' => array(
      'variables' => array(
        'embed' => array(
          'html' => array(),
        ),
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_player_meta' => array(
      'variables' => array(
        'embed' => array(
          'html' => array(),
        ),
        'title' => '',
        'desc' => '',
        'meta' => array(),
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_thumbnail_default' => array(
      'variables' => array(
        'thub' => '',
        'meta' => array(),
        'rotate' => NULL,
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_thumbnail' => array(
      'variables' => array(
        'thub' => '',
        'meta' => array(),
        'rotate' => NULL,
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_thumbnail_title_desc' => array(
      'variables' => array(
        'thub' => '',
        'meta' => array(),
        'rotate' => NULL,
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_thumbnail_meta' => array(
      'variables' => array(
        'thub' => '',
        'meta' => array(),
        'rotate' => NULL,
        'title' => '',
        'desc' => '',
      ),
      'file' => 'field_kaltura.theme.inc',
    ),
    'kaltura_embed_player' => array(
      'variables' => array(
        'height' => 0,
        'width' => 0,
        'html_id' => '',
      ),
      'path' => drupal_get_path('module', 'field_kaltura') . '/templates',
      'template' => 'field_kaltura_embed_player',
    ),
  );
}

/**
 * Implements hook_field_formatter_info().
 */
function field_kaltura_field_formatter_info() {
  return array(
    'field_kaltura_player_default' => array(
      'label' => t('Player with title and description'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'entry_widget' => NULL,
        'custom_player' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_player' => array(
      'label' => t('Player only'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'entry_widget' => NULL,
        'custom_player' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_player_title' => array(
      'label' => t('Player and Title'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'entry_widget' => NULL,
        'custom_player' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_player_meta' => array(
      'label' => t('Player with metadata'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'entry_widget' => NULL,
        'custom_player' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_thumbnail_only' => array(
      'label' => t('Thumbnail only'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_thumbnail_title' => array(
      'label' => t('Thumbnail with title'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_thumbnail_title_desc' => array(
      'label' => t('Thumbnail with title and description'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
    'field_kaltura_thumbnail_metadata' => array(
      'label' => t('Thumbnail and metadata'),
      'field types' => array(
        'field_kaltura_entryid',
      ),
      'settings' => array(
        'thumbsize_width' => NULL,
        'thumbsize_height' => NULL,
        'player_height' => NULL,
        'player_width' => NULL,
        'delivery' => NULL,
        'stretch' => NULL,
        'rotate' => NULL,
      ),
    ),
  );
}

/**
 * Implements hook_field_formatter_settings_form().
 */
function field_kaltura_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $display = $instance['display'][$view_mode];
  foreach ($display['settings'] as $key => $val) {
    $settings[$key] = !empty($display['settings'][$key]) ? $display['settings'][$key] : $field['settings'][$key];
  }
  $element = array();
  $element['#attached']['css'] = array(
    drupal_get_path('module', 'kaltura') . '/style/kaltura_settings.css',
  );

  // TODO: We should use Form Api fieldsets instead of '#prefix' =>
  // '<div class="f-set">'. But this will break the process of saving settings!
  // So be careful here.
  $element['thumbsize'] = array(
    '#prefix' => '<div class="f-set">',
    '#type' => 'item',
    '#title' => t('Thumbnail Dimensions'),
    '#description' => t('Note - these settings will only apply when choosing "Thumbnail" display'),
  );
  $element['thumbsize_width'] = array(
    '#type' => 'textfield',
    '#title' => t('Thumbnail Width'),
    '#size' => 5,
    '#default_value' => !empty($settings['thumbsize_width']) ? $settings['thumbsize_width'] : '',
  );
  $element['thumbsize_height'] = array(
    '#type' => 'textfield',
    '#title' => t('Thumbnail Height'),
    '#size' => 5,
    '#default_value' => !empty($settings['thumbsize_height']) ? $settings['thumbsize_height'] : '',
  );
  if ($instance['widget']['type'] != 'field_kaltura_image') {
    $element['rotate'] = array(
      '#type' => 'checkbox',
      '#title' => t('Rotate Thumbnails for Video Items'),
      '#default_value' => !empty($settings['rotate']) ? $settings['rotate'] : '0',
    );
  }
  $element['thumbsize_close'] = array(
    '#markup' => '</div>',
  );
  if ($instance['widget']['type'] != 'field_kaltura_image') {
    $saved_player = !empty($settings['entry_widget']) ? $settings['entry_widget'] : KALTURASETTINGS_DEFAULT_VIDEO_PLAYER_UICONF;
    $players = kaltura_choose_player($saved_player);
    $element['kaltura_entry_video_display'] = array(
      '#prefix' => '<div class="f-set">',
      '#type' => 'item',
      '#title' => t('Player Settings'),
    );
    $element['entry_widget'] = $players['default_widget'];
    $element['entry_widget']['#default_value'] = $saved_player;
    $element['player_width'] = array(
      '#type' => 'textfield',
      '#title' => t('Player Width'),
      '#size' => 5,
      '#attributes' => array(
        'data-kaltura-reflect-width-of-player' => $players['default_widget']['#id'],
      ),
      '#default_value' => !empty($settings['player_width']) ? $settings['player_width'] : '400',
    );
    $element['player_height'] = array(
      '#type' => 'textfield',
      '#title' => t('Player Height'),
      '#size' => 5,
      '#attributes' => array(
        'data-kaltura-reflect-height-of-player' => $players['default_widget']['#id'],
      ),
      '#default_value' => !empty($settings['player_height']) ? $settings['player_height'] : '330',
    );
    $element['dispaly_metadata'] = array(
      '#type' => 'checkbox',
      '#title' => t('Display Metadata'),
      '#default_value' => !empty($settings['dispaly_metadata']) ? $settings['dispaly_metadata'] : '0',
    );
    $element['kaltura_entry_video_display_close'] = array(
      '#markup' => '</div>',
    );
    $element['delivery'] = array(
      '#type' => 'select',
      '#title' => t('Delivery Type'),
      '#options' => array(
        'HTTP' => 'Progressive Download (HTTP)',
        'RTMP' => 'Adaptive Streaming (RTMP)',
        'AKMI' => 'Akamai HD Network',
      ),
      '#default_value' => !empty($settings['delivery']) ? $settings['delivery'] : 'HTTP',
    );
    $element['video_display_advanced'] = array(
      '#prefix' => '<div class="advanced-display advanced f-set">',
      '#type' => 'item',
      '#title' => t('Advanced'),
      '#attributes' => array(
        'class' => 'advanced-label',
      ),
    );
    $element['custom_player'] = array(
      '#type' => 'textfield',
      '#title' => t('Custom Player UI_Conf'),
      '#size' => 6,
      '#default_value' => !empty($settings['custom_player']) ? $settings['custom_player'] : '',
    );
    $element['video_display_advanced_close'] = array(
      '#markup' => '</div>',
    );
  }
  return $element;
}

/**
 * Implements hook_field_formatter_settings_summary().
 */
function field_kaltura_field_formatter_settings_summary($field, $instance, $view_mode) {
  $settings = $instance['display'][$view_mode]['settings'];
  $settings = array_intersect_key(array_filter($settings) + $field['settings'], $settings);
  $out = '<div>';
  $players = array();
  $k_helpers = new KalturaHelpers();
  $k_helpers
    ->getSitePlayers($players);
  if ($instance['widget']['type'] === 'field_kaltura_image') {
    foreach ($settings as $key => $val) {
      if (!empty($val)) {
        if (strpos($key, 'thumbsize') === 0) {
          $lable = str_replace('thumbsize', 'thumbnail', $key);
          $lable = str_replace('_', ' ', $lable);
          $out .= '<span>' . ucwords($lable) . ': ' . $val . '<span><br/>';
        }
      }
    }
  }
  else {
    foreach ($settings as $key => $val) {
      if (!empty($val)) {
        if ($key === 'entry_widget') {
          $lable = t('Player');
          $out .= '<span>' . $lable . ': ' . $players[$val]['name'] . ' ( ' . $val . ' )<span><br/>';
        }
        else {
          $lable = str_replace('thumbsize', 'thumbnail', $key);
          $lable = str_replace('_', ' ', $lable);
          $out .= '<span>' . ucwords($lable) . ': ' . $val . '<span><br/>';
        }
      }
    }
  }
  $out .= '</div>';
  return $out;
}

/**
 * Implements hook_field_instance_settings_form().
 */
function field_kaltura_field_instance_settings_form($field, $instance) {

  // TODO: Not implemented yet.
}

/**
 * Implements hook_field_formatter_view().
 */
function field_kaltura_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();

  // Override display settings.
  if (isset($display['context']['actual_view_mode'])) {
    $mode = $display['context']['actual_view_mode'];
  }
  else {

    // The case when field_default_view() is called with display parameters
    // instead of a view name.
    $mode = 'default';
  }
  foreach ($items as $delta => $item) {
    if (!empty($item['settings'][$mode]['non_default'])) {
      $settings = $item['settings'][$mode]['settings'];
    }
    else {
      $settings = $display['settings'];
    }
    $settings = array_intersect_key(array_filter($settings) + $field['settings'], $settings);
    $entry = kaltura_entry_load($item['entryid']);
    if (!$entry) {
      continue;
    }
    $metadata = array(
      'views' => $entry->kaltura_views,
      'plays' => $entry->kaltura_plays,
      'votes' => $entry->kaltura_votes,
      'rank' => $entry->kaltura_rank,
      'total_rank' => $entry->kaltura_total_rank,
    );
    $thumb_url = $entry->kaltura_thumbnail_url . '/type/1/width/' . $settings['thumbsize_width'] . '/height/' . $settings['thumbsize_height'];
    $themes = array(
      'field_kaltura_player_default' => 'kaltura_player_default',
      'field_kaltura_player' => 'kaltura_player',
      'field_kaltura_player_title' => 'kaltura_player_title',
      'field_kaltura_player_meta' => 'kaltura_player_meta',
      'field_kaltura_thumbnail_only' => 'kaltura_thumbnail',
      'field_kaltura_thumbnail_title' => 'kaltura_thumbnail_default',
      'field_kaltura_thumbnail_title_desc' => 'kaltura_thumbnail_title_desc',
      'field_kaltura_thumbnail_metadata' => 'kaltura_thumbnail_meta',
    );
    $element[$delta]['#theme'] = $themes[$display['type']];
    $element[$delta]['#title'] = $entry->kaltura_title;
    $element[$delta]['#desc'] = $entry->kaltura_description;
    switch ($display['type']) {
      case 'field_kaltura_player_meta':
        $element[$delta]['#meta'] = $metadata;

      // No break.
      case 'field_kaltura_player_default':
      case 'field_kaltura_player':
      case 'field_kaltura_player_title':
        $media_type = !empty($item['mediatype']) ? $item['mediatype'] : $entry->kaltura_media_type;
        $seo_meta = array(
          'title' => $entry->kaltura_title,
          'description' => $entry->kaltura_description,
        );
        $element[$delta]['#embed'] = field_kaltura_build_embed($entry->kaltura_entryid, $media_type, $settings, NULL, NULL, $thumb_url, $seo_meta);
        break;
      case 'field_kaltura_thumbnail_only':
      case 'field_kaltura_thumbnail_title':
      case 'field_kaltura_thumbnail_title_desc':
      case 'field_kaltura_thumbnail_metadata':
        $element[$delta]['#thub'] = $thumb_url;
        $element[$delta]['#meta'] = $metadata;
        $element[$delta]['#rotate'] = $settings['rotate'];
        break;
    }
  }
  return $element;
}

/**
 * Implements hook_field_presave().
 *
 * Update the the node_kaltura table with the entry id before the filed save.
 * Not sure this is needed we have local notifications.
 */
function field_kaltura_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
  foreach ($items as $item) {
    if (!($entity = kaltura_entry_load($item['entryid']))) {
      $entity = kaltura_entry_create(array(
        'kaltura_entryid' => $item['entryid'],
      ));
    }
    $entity->kaltura_media_type = $item['mediatype'];
    kaltura_entry_save($entity);
  }
  if ($field['type'] == 'field_kaltura_entryid') {

    // Serialize settings.
    foreach ($items as $delta => $item) {
      if (isset($item['settings']) && is_array($item['settings'])) {
        $settings = array();
        foreach ($item['settings'] as $mode_name => $mode_settings) {
          if (!empty($mode_settings['non_default'])) {
            $settings[$mode_name] = $mode_settings;
          }
        }
        $items[$delta]['settings'] = $settings ? serialize($settings) : NULL;
      }
    }
  }
}

/**
 * Builds the flush embed or the image from the entry to be rendered.
 *
 * @param mixed $item
 * @param mixed $type
 * @param mixed $settings
 * @param mixed $path
 * @param mixed $uid
 * @param mixed $thumb_url
 *
 * @return array
 *   embed code
 */
function field_kaltura_build_embed($item, $type, $settings, $path, $uid, $thumb_url, $seometa) {
  $embed['html'] = '';
  $width = $settings['player_width'];
  $height = $settings['player_height'];
  if ($type == KALTURA_MEDIA_TYPE_VIDEO || $type == KALTURA_MEDIA_TYPE_AUDIO) {
    $settings['entry_widget'] = !empty($settings['entry_widget']) ? $settings['entry_widget'] : NULL;
    $uiconf = !empty($settings['custom_player']) ? $settings['custom_player'] : $settings['entry_widget'];
    $partner_id = variable_get('kaltura_partner_id', 0);
    $kaltura_server = variable_get('kaltura_server_url', KALTURASETTINGS_SERVER_URL);
    $html_id = drupal_html_id('js-kaltura-media-' . $item);
    $js_settings['embedKWidget'][$html_id] = array(
      'targetId' => $html_id,
      'wid' => '_' . $partner_id,
      'uiconf_id' => $uiconf,
      'entry_id' => $item,
    );
    $build = array(
      '#theme' => 'kaltura_embed_player',
      '#html_id' => $html_id,
      '#height' => $height,
      '#width' => $width,
    );
    $kaltura_html5_lib = $kaltura_server . '/p/' . $partner_id . '/sp/' . $partner_id . '00/embedIframeJs/uiconf_id/' . $uiconf . '/partner_id/' . $partner_id;
    $build['#attached']['js'][$kaltura_html5_lib] = array(
      'type' => 'external',
    );
    $build['#attached']['js'][] = drupal_get_path('module', 'field_kaltura') . '/js/field_kaltura.js';
    $build['#attached']['js'][] = array(
      'data' => array(
        'kaltura' => $js_settings,
      ),
      'type' => 'setting',
    );
    $embed['html'] = $build;
  }
  elseif ($type == KALTURA_MEDIA_TYPE_IMAGE) {
    $vars['path'] = $thumb_url . '/width/' . $width . '/height/' . $height . '/type/1/quality/100';
    $embed['html'] = theme('image', $vars);
  }
  return $embed;
}

/**
 * Implements hook_field_views_data().
 *
 * This is needed so we could add relationship with other tables in views.
 */
function field_kaltura_field_views_data($field) {
  $data = field_views_field_default_views_data($field);

  // Build an array of bundles the product reference field appears on.
  $bundles = array();
  foreach ($field['bundles'] as $entity => $bundles) {
    $bundles[] = $entity . ' (' . implode(', ', $bundles) . ')';
  }
  foreach ($data as $table_name => $table_data) {
    $name = $field['field_name'];
    foreach ($table_data as $field_name => $field_data) {

      // We don't want to add relationship to the media type entry.
      if (!in_array($field_name, array(
        'table',
        'entity_id',
        'revision_id',
        $name . '_mediatype',
      ))) {
        $data[$table_name][$field_name . '_entryid']['relationship'] = array(
          'title' => t('Referenced Kaltura media'),
          'help' => t('Appears in: @bundles', array(
            '@bundles' => implode(', ', $bundles),
          )),
          'base' => 'node_kaltura',
          'base field' => 'kaltura_entryid',
          'handler' => 'views_handler_relationship',
          'label' => t('Kaltura entry'),
        );
      }
    }
  }
  return $data;
}

/**
 * @param int $saved_player
 * @return array
 */
function kaltura_choose_player($saved_player = 48501) {
  $form = array();
  $k_helpers = new KalturaHelpers();
  $pid = variable_get('kaltura_partner_id');
  if (!$pid) {
    drupal_set_message(t('You must configure partner\'s details first.'), 'error');
    return FALSE;
  }
  $variable_width = variable_get('kaltura_video_entry_width', '410');
  $variable_height = variable_get('kaltura_video_entry_height', '364');
  if (!is_numeric($saved_player)) {
    $saved_player = 48501;
  }
  $site_players = array();
  $k_helpers
    ->getSitePlayers($site_players);
  reset($site_players);
  $players_name = array();
  foreach ($site_players as $one_player_id => $one_layer_props) {
    $players_name[$one_player_id] = $one_layer_props['name'];
  }
  $wid = '_' . $pid;
  $replace_url = $k_helpers
    ->getSwfUrlForWidget($wid . '/entry_id/_KMCLOGO1/uiconf_id/##uiconf##');
  $suffix = '<table><tr><td><span id="video_ph"></span><div><a href="http://www.kaltura.com/index.php/kmc/kmc2#appstudio|players_list" target="_blank">Create new player</a></div></td></tr></table>';
  $element_id = drupal_html_id('kaltura-entry-widget');
  $js_settings['changePlayer'][$element_id] = array(
    'replace_url' => $replace_url,
    'type' => 'video',
    'variable_width' => $variable_width,
    'variable_height' => $variable_height,
    'site_players' => $site_players,
    'saved_player' => $saved_player,
  );
  $form['default_widget'] = array(
    '#type' => 'select',
    '#title' => t('Video Player'),
    '#options' => $players_name,
    '#suffix' => $suffix,
    '#attributes' => array(
      'id' => $element_id,
    ),
    '#id' => $element_id,
    '#default_value' => $saved_player,
  );
  $form['default_widget']['#attached']['js'][] = drupal_get_path('module', 'kaltura') . '/js/swfobject.js';
  $form['default_widget']['#attached']['js'][] = array(
    'data' => array(
      'kaltura' => $js_settings,
    ),
    'type' => 'setting',
  );
  return $form;
}

/**
 * Implements hook_field_load().
 */
function field_kaltura_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
  foreach ($entities as $id => $entity) {
    foreach ($items[$id] as $delta => $item) {
      if (is_string($item['settings'])) {
        $items[$id][$delta]['settings'] = unserialize($item['settings']);
      }
    }
  }
}

/**
 * Implements hook_field_display_alter().
 */
function field_kaltura_field_display_alter(&$display, $context) {

  // Get the actual view mode and add it as a context to 'display' array.
  $view_mode_settings = field_view_mode_settings($context['instance']['entity_type'], $context['instance']['bundle']);
  if (!empty($view_mode_settings[$context['view_mode']]['custom_settings'])) {
    $display['context']['actual_view_mode'] = $context['view_mode'];
  }
  else {
    $display['context']['actual_view_mode'] = 'default';
  }
}

Functions

Namesort descending Description
field_kaltura_add_modal_js Adds js function to handel the callback from the flush uploader.
field_kaltura_build_embed Builds the flush embed or the image from the entry to be rendered.
field_kaltura_field_display_alter Implements hook_field_display_alter().
field_kaltura_field_formatter_info Implements hook_field_formatter_info().
field_kaltura_field_formatter_settings_form Implements hook_field_formatter_settings_form().
field_kaltura_field_formatter_settings_summary Implements hook_field_formatter_settings_summary().
field_kaltura_field_formatter_view Implements hook_field_formatter_view().
field_kaltura_field_info Implements hook_field_info().
field_kaltura_field_instance_settings_form Implements hook_field_instance_settings_form().
field_kaltura_field_is_empty Implements hook_field_is_empty().
field_kaltura_field_load Implements hook_field_load().
field_kaltura_field_presave Implements hook_field_presave().
field_kaltura_field_settings_form Implements hook_field_settings_form().
field_kaltura_field_validate Implements hook_field_validate().
field_kaltura_field_views_data Implements hook_field_views_data().
field_kaltura_field_widget_error Implements hook_field_widget_error().
field_kaltura_field_widget_form Implements hook_field_widget_form().
field_kaltura_field_widget_info Implements hook_field_widget_info().
field_kaltura_form_field_ui_field_edit_form_alter Implements hook_form_FORM_ID_alter().
field_kaltura_theme Implements hook_theme().
field_kaltura_tumb_pre @todo Add doc.
kaltura_choose_player
kaltura_get_field_thumbs Helper function to constrat the entry thumbnail with the remove button.
kaltura_widget_hendler Returns the widget according to the given widget type.