array( 'title' => t('Bypass video conversion'), 'description' => t('Warning: Give to trusted roles only; this permission has security implications.'), ), 'convert on submission' => array( 'title' => t('Convert video on submit'), 'description' => t('Warning: Give to trusted roles only; this permission has security implications.'), ), 'override player dimensions' => array( 'title' => t('Change default player dimentions'), 'description' => t('Warning: Give to trusted roles only; this permission has usability implications.'), ), 'use default thumb' => array( 'title' => t('Use default thumbnail'), ), 'administer video presets' => array( 'title' => t('Administer video presets'), 'description' => t('Perform administration tasks for the video presets.'), ), ); return $perms; } /** * Implementation of hook_theme(). */ function video_theme() { $theme = array(); $theme['video'] = array( 'variables' => array('item' => NULL, 'path' => NULL, 'video_style' => NULL, 'entity' => NULL, 'field' => NULL, 'instance' => NULL), 'file' => 'video_formatter.inc', ); $theme['video_thumbnail'] = array( 'variables' => array('item' => NULL, 'path' => NULL, 'video_style' => NULL, 'entity' => NULL, 'field' => NULL, 'instance' => NULL), 'file' => 'video_formatter.inc', ); $theme['video_thumbnails'] = array( 'variables' => array('file' => NULL, 'alt' => '', 'title' => '', 'attributes' => NULL, 'getsize' => TRUE), 'file' => 'video.theme.inc', ); $theme['video_widget'] = array( 'render element' => 'element', 'file' => 'video.theme.inc', ); $theme['video_widget_preview'] = array( 'variables' => array('item' => TRUE), 'file' => 'video.theme.inc', ); $theme['video_image'] = array( 'variables' => array('file' => NULL, 'alt' => '', 'title' => '', 'attributes' => NULL, 'getsize' => TRUE, 'imagecache' => NULL), 'file' => 'video.theme.inc', ); $theme['video_widget_video_thumb'] = array( 'variables' => array('item' => TRUE), 'file' => 'video.theme.inc', ); //$theme['video_formatter_video_colorbox'] = array( // 'arguments' => array('element' => NULL, 'imagecache' => NULL), // 'file' => 'video_formatter.inc', //); $theme['video_formatter_video_media_js'] = array( 'variables' => array('element' => NULL), 'file' => 'video_formatter.inc', ); $theme['video_encoding_failed'] = array( 'variables' => array(), 'file' => 'video_formatter.inc', ); $theme['video_inprogress'] = array( 'variables' => array(), 'file' => 'video_formatter.inc', ); $path = drupal_get_path('module', 'video') . '/theme'; //Lets setup our themes for our players $players = video_video_players(); foreach ($players as $tpl => $value) { $theme[$tpl] = array( 'variables' => array('video' => NULL, 'themed_output' => NULL), 'template' => str_replace('_', '-', $tpl), 'path' => $path, ); } //We need to add an flv theme buffer to allow users to override in their own module to add in extra parameters before //calling our flv template file. $theme['video_flv'] = array( 'variables' => array('video' => NULL, 'node' => NULL), 'file' => 'video_formatter.inc' ); //setup our imagecache presets if (module_exists('imagecache')) { //we need formatters for each of our thumbnails. //@todo create a function to check for our colorbox module and only add theme elements that could be used. $thumb_types = array('video_nodelink'); //array('video_colorbox', 'video_nodelink'); foreach ($thumb_types as $types) { foreach (imagecache_presets () as $preset) { $theme['video_formatter_' . $preset['presetname'] . '__' . $types] = array( 'variables' => array('element' => NULL), 'function' => 'theme_video_formatter_imagecache', 'file' => 'video_formatter.inc' ); } } } // @TODO : check is there any other optimal way to do this? $theme['video_formatter'] = array( 'variables' => array('item' => NULL, 'path' => NULL, 'video_style' => NULL, 'entity' => NULL, 'field' => NULL, 'instance' => NULL), 'file' => 'video_formatter.inc' ); return $theme; } /* * Implmentation of hook_cron(). */ function video_cron() { if (variable_get('video_cron', TRUE)) { $video_conversion = new video_conversion; $video_conversion->run_queue(); } } /** * Implementation of hook_form_alter() * @param string $form * @param $form_state * @param $form_id */ function video_form_alter(&$form, &$form_state, $form_id) { if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] . '_node_form' == $form_id) { $form['buttons']['submit']['#submit'][] = 'video_node_update_submit'; } } function video_node_update_submit($form, &$form_state) { //lets update our video rending table to include the node id created if (isset($form_state['nid']) && isset($form_state['values']['video_id']) && is_array($form_state['values']['video_id'])) { foreach ($form_state['values']['video_id'] as $fid) { // @TODO : check for enable trancoder $transcoder = new video_transcoder; $video = array('nid' => $form_state['nid'], 'fid' => $fid); $transcoder->update_job($video); } } } /* * Utility function that will add a preview of thumbnails for you to select when uploading videos. */ function video_thumb_process(&$element, &$form_state) { // Developed for ffmpeg support $file = $element['#value']; $delta = $file['fid']; $field = field_widget_field($element, $form_state); $instance = field_widget_instance($element, $form_state); $settings = $instance['widget']['settings']; $gen_fail = FALSE; if (isset($element['preview']) && $file['fid'] != 0) { $default_thumb = array(); if (in_array($field['settings']['autothumbnail'], array('auto', 'auto_fallback'))) { $transcoder = new video_transcoder; if ($thumbs = $transcoder->generate_thumbnails($file)) { $default_thumb = array_rand($thumbs); if (!empty($thumbs)) { foreach ($thumbs as $fid => $img) { // if file object contain url then use file name to identify object $thumbss[$img->fid] = theme('image_style', array('style_name' => $field['settings']['preview_video_thumb_style'], 'path' => $img->uri)); } } } if (!empty($thumbss)) { $element['thumbanail'] = array( '#type' => 'radios', '#title' => t('Video Thumbnails'), '#options' => $thumbss, '#default_value' => !empty($file['thumbanail']) ? $file['thumbanail'] : $thumbs[$default_thumb]->fid, '#weight' => 10, '#attributes' => array('class' => array('video-thumbnails'), 'onchange' => 'videoftp_thumbnail_change()', 'rel' => 'video_large_thumbnail-' . $delta), ); } else { $gen_fail = TRUE; } } if ((!empty($gen_fail) && $field['settings']['autothumbnail'] == 'auto_fallback') || $field['settings']['autothumbnail'] == 'manual_upload') { $element['video_thumb_file'] = array( '#name' => 'files[' . $element['#field_name'] . '_' . $element['#delta'] . '_thumbs]', '#type' => 'file', '#size' => '40', '#title' => !empty($file['video_thumb']) ? t('Replace the video thumbnail') : t('Upload a video thumbnail'), '#description' => t('This thumbnail will be uploaded when the node is saved.'), ); $element['thumbanail'] = array( '#type' => 'value', '#value' => isset($file['thumbanail']) ? $file['thumbanail'] : false, ); } // Setup our large thumbnail that is on the left. // @todo Add smaller video preview instead of thumbnail? if (isset($file['thumbanail']) && !empty($file['thumbanail'])) { $large_thumb = file_load($file['thumbanail']); } elseif (!empty($field['settings']['default_video_thumb'])) { $large_thumb = file_load($field['settings']['default_video_thumbnail']); } else { $large_thumb = file_load($default_thumb); } // print_r($field['settings']['default_video_thumbnail']); // $default_thumbnail = file_load($field['settings']['default_video_thumbnail']); // @todo Integrate the thumbnails with imagecache. if (!empty($large_thumb)) $element['preview']['#suffix'] = '
' . theme('image_style', array('style_name' => $field['settings']['preview_video_thumb_style'], 'path' => $large_thumb->uri)) . '
'; } } /** * Adds a video to the video rendering table. * * If auto converting, it will convert your video to flv right now. We are passing the element by reference * just in case we ever want to add more to the element during this process. * * @param $element * Form element to get the video file from. */ function video_convert_process(&$element) { $file = $element['#value']; // Add default dimensions from our default_value if needed if (!isset($file['data']['dimensions'])) { $file['data']['dimensions'] = $element['data']['dimensions']['#value']; } $convert = false; //we need to check if this fid has already been added to the database AND that there is in fact a fid if (is_array($file) && isset($file['fid']) && !empty($file['fid']) && !isset($file['data']['bypass_autoconversion'])) { $fid = $file['fid']; //setup our conversion class and check for the fid existence. module_load_include('inc', 'video', '/includes/conversion'); $video_conversion = new video_conversion; // Lets verify that we haven't added this video already. Multiple validation fails will cause this to be ran more than once if (!$video = $video_conversion->load_job($fid)) { // Video has not been added to the queue yet so lets add it. $video = array('fid' => $fid, 'dimensions' => $file['data']['dimensions']); if (!($video_conversion->create_job($video))) drupal_set_message(t('Something went wrong with your video job creation. Please check your recent log entries for further debugging.'), 'error'); $convert = true; //lets queue our node status to unpublished. $element['#unpublish'] = true; } elseif ($video->video_status != VIDEO_RENDERING_COMPLETE) { //lets queue our node status to unpublished. $element['#unpublish'] = true; } // Our video should be in the database pending, lets see if we need to convert it now. // Check if we are going from unselected to selected or if this is a new video and we have checked the checkbox $convert_video_on_save = false; $element_data_convert_on_save = ''; $file_date_convet_on_save = ''; $convert_on_save = variable_get('video_convert_on_save', FALSE); if (isset($element['data']['convert_video_on_save']['#value'])) $element_data_convert_on_save = $element['data']['convert_video_on_save']['#value']; if (isset($file['data']['convert_video_on_save'])) $file_date_convet_on_save = $file['data']['convert_video_on_save']; $convert_video_on_save = $element_data_convert_on_save || $file_date_convet_on_save; if (((!isset($element['#default_value']['data']['convert_video_on_save']) || !$element['#default_value']['data']['convert_video_on_save']) && $convert_video_on_save) || ($convert && $convert_video_on_save) || $convert_on_save) { $return = $video_conversion->process($fid); if ($return === FALSE) { drupal_set_message(t('Something went wrong with your video conversion. Please check your recent log entries for further debugging.'), 'error'); } elseif ($return === TRUE) { //we are always unpublished until we are converted. unset($element['#unpublish']); drupal_set_message(t('Successfully converted your video.')); } } elseif ($convert) { drupal_set_message(t('Video submission queued for processing. Please wait: our servers are preparing your video for display.')); } } } /** * Implementation of hook_file_delete(). */ function video_file_delete($file) { // @TODO : check for enable trancoder // delete the transcoder job module_load_include('inc', 'video', '/includes/transcoder'); $transcoder = new video_transcoder; $transcoder->delete_job($file); //now lets delete our video thumbnails and folder. $video_thumb_path = variable_get('video_thumb_path', 'videos/thumbnails'); $thumb_folder = file_default_scheme() . ':/' . $video_thumb_path . '/' . $file->fid; // Recursively delete our folder and files rmdirr($thumb_folder); } /** * Compares passed extensions with normal video web extensions. */ function video_web_extensions($ext) { $extensions = array_filter(explode(' ', $ext)); $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', 'ogv', 'webm' // ogg/ogv theora ); if (count(array_diff($extensions, $web_extensions))) { return FALSE; } return TRUE; } /** * Implementation of hook_views_api(). */ function video_views_api() { return array( 'api' => 2.0, 'path' => drupal_get_path('module', 'video') . '/views', ); } /** * Process elements loads on settings * @param $element */ function video_widget_element_settings(&$element, &$form_state) { $file = $element['#value']; $delta = $element['#delta']; $field = field_widget_field($element, $form_state); $instance = field_widget_instance($element, $form_state); $settings = $instance['settings']; // Check if using the default width and replace tokens. $default_dimensions = user_access('override player dimensions'); $description = t('Set your video dimensions. This will create your player with these dimensions.'); //setup our default dimensions. $dimensions = $settings['default_dimensions']; $player_dimensions = $settings['default_player_dimensions']; // Lets figure out our dimensions for our video and add astericks next to our options. $options = video_explode("\n", variable_get("video_metadata_dimensions", video_default_dimensions())); if ($field['settings']['autoconversion'] && isset($element['preview']) && $file['fid'] != 0 && $default_dimensions) { $file_object = file_load($file['fid']); $video_info = _video_dimensions_options($options, drupal_realpath($file_object->uri)); $description = t('Set your video dimensions. This will create your player and transcode your video with these dimensions. Your video size is !size, if you choose a higher resolution, this could cause video distortion. You are shown dimensions that match your aspect ratio, if you choose dimensions that do not match your ratio, we will pad your video by adding black bars on either the top or bottom while maintaining your videos original aspect ratio.', array('!size' => $video_info['width'] . 'x' . $video_info['height'])); //setup our default display of dimensions. //lets go through our options looking for a matching resolution foreach ($options as $key => $value) { if (stristr($value, t('(Matches Resolution)')) == TRUE) { $dimensions = $key; break; } } } // Override our dimensions to the user selected. if (isset($file['dimensions']) && !empty($file['dimensions'])) { $dimensions = $file['data']['dimensions']; } // Override our player dimensions to the user selected. if (isset($file['player_dimensions']) && !empty($file['player_dimensions'])) { $player_dimensions = $file['player_dimensions']; } // show only enabled the autoconversion if ($field['settings']['autoconversion']) { $element['dimensions'] = array( '#type' => 'select', '#title' => t('Dimensions for Video Transcoding'), '#default_value' => $dimensions, '#description' => $description, '#options' => $options, ); } // get the player dimentions $element['player_dimensions'] = array( '#type' => 'select', '#title' => t('Dimensions for Video Player'), '#default_value' => $player_dimensions, '#description' => t('WxH of your video player.'), '#options' => $options, ); // If users cannot change the default dimensions, lets change this to a value. if (!$default_dimensions) { $element['dimensions']['#type'] = 'value'; $element['dimensions']['#value'] = $dimensions; $element['player_dimensions']['#type'] = 'value'; $element['player_dimensions']['#value'] = $player_dimensions; } // only in preview mode and then create thumbnails if ($field['settings']['autoconversion']) { if (user_access('bypass conversion video')) { $element['bypass_autoconversion'] = array( '#type' => 'checkbox', '#title' => t('Bypass auto conversion'), '#default_value' => isset($file['bypass_autoconversion']) ? $file['bypass_autoconversion'] : variable_get('video_bypass_conversion', FALSE), '#description' => t('This will bypass your auto conversion of videos.'), '#attributes' => array('class' => array('video-bypass-auto-conversion')), ); } // check this to convert the video on save $convert = isset($file['convert_video_on_save']) ? $file['convert_video_on_save'] : variable_get('video_convert_on_save', FALSE); if (user_access('convert on submission')) { $element['convert_video_on_save'] = array( '#type' => 'checkbox', '#title' => t('Convert video on save'), '#default_value' => $convert, '#description' => t('This will convert your video to flv format when you save, instead of scheduling it for cron.'), '#attributes' => array('class' => array('video-convert-video-on-save')), ); if ($convert) { $element['convert_video_on_save']['#attributes']['checked'] = 'checked'; } } else { $element['convert_video_on_save'] = array( '#type' => 'value', '#value' => $convert, ); } } // use of default thumbnail $default_thumb = isset($file['use_default_video_thumb']) ? $file['use_default_video_thumb'] : variable_get('video_use_default_thumb', FALSE); if (user_access('use default thumb')) { $element['use_default_video_thumb'] = array( '#type' => 'checkbox', '#title' => t('Use the default thumbnail for this video?'), '#default_value' => $default_thumb, '#description' => t('This will set a flag for this video to use the default video thumbnail when outputed..'), '#attributes' => array('class' => array('video-use-default-video-thumb')), ); if ($default_thumb) { $element['use_default_video_thumb']['#attributes']['checked'] = 'checked'; } } else { $element['use_default_video_thumb'] = array( '#type' => 'value', '#value' => $default_thumb, ); } } /** * Video_widget_process for API handlers for any video types. * @param $element * @param $form_state */ function video_widget_process(&$element, &$form_state) { $item = $element['#value']; $field = field_widget_field($element, $form_state); switch ($form_state['clicked_button']['#submit'][0]) { case 'node_form_submit': // Auto convert our video file if ($field['settings']['autoconversion']) { video_convert_process($element); //lets set our node status to unpublished if our video is not converted. if (isset($element['#unpublish']) && $element['#unpublish']) { //unpublish the node $form_state['values']['status'] = 0; } } // Save manually uploaded thumbs (if they exist) and add them to element if (isset($_FILES['files']) && is_array($_FILES['files']['name'])) if (array_key_exists($field['field_name'] . '_' . $element['#delta'] . '_thumbs', $_FILES['files']['name'])) { video_upload_manual_thumb($element); } // //queue up the file id to update the node id in the video rendering / cdn tables. $form_state['values']['video_id'][] = $item['fid']; break; case 'node_form_build_preview': // preview break; case 'node_form_delete_submit': //moved to hook_file_delete in video module. break; } } /** * Handle saving of manual thumbs */ function video_upload_manual_thumb(&$element) { $destination = file_default_scheme() . ':/' . 'video_thumbs/' . $element['#value']['fid']; if (!field_file_check_directory($destination, FILE_CREATE_DIRECTORY)) { form_set_error('video_thumb_upload', t('The thumbnail image could not be uploaded. The destination %destination does not exist or is not writable by the server.', array('%destination' => dirname($destination)))); return; } $validators = array( 'file_validate_is_image' => array(), ); if (!$file = file_save_upload($element['#field_name'] . '_' . $element['#delta'] . '_thumbs', $validators, $destination)) { // No upload to save we hope... or file_save_upload() reported an error on its own. return; } // Remove old image (if any) & clean up database. $old_thumb = $element['data']['video_thumb']['#value']; if (!empty($old_thumb)) { if (file_delete($old_thumb)) { db_query('DELETE FROM {files} WHERE filepath=%d', $old_thumb); } } // Make the file permanent and store it in the form. file_set_status($file, FILE_STATUS_PERMANENT); $element['data']['video_thumb']['#value'] = $file->filepath; } /* * Function updates our options list to show matching aspect ratios and if we have a matching resolution. * * We will update the options array by reference and return the aspect ratio of the file. */ function _video_dimensions_options(&$options, $video) { $aspect_ratio = _video_aspect_ratio($video); //loop through our options and find matching ratio's and also the exact width/height foreach ($options as $key => $value) { $wxh = explode('x', $value); //lets check our width and height first if ($aspect_ratio['width'] == $wxh[0] && $aspect_ratio['height'] == $wxh[1]) { $options[$key] = $value . ' ' . t('(Matches Resolution)'); } else { //now lets check our ratio's $ratio = number_format($wxh[0] / $wxh[1], 4); if ($ratio == $aspect_ratio['ratio']) { $options[$key] = $value . ' ' . t('(Matches Ratio)'); } } } return $aspect_ratio; } /* * Returns the width/height and aspect ratio of the video * * @todo: move this to the transcoder class instead? */ function _video_aspect_ratio($video) { //lets get our video dimensions from the file module_load_include('inc', 'video', '/includes/transcoder'); $transcoder = new video_transcoder; $wxh = $transcoder->get_dimensions($video); $width = $wxh['width']; $height = $wxh['height']; if (!$width || !$height) { //no width and height found just return. watchdog('video_conversion', 'We could not determine the height and width of the video: ' . $video, array(), WATCHDOG_DEBUG); // drupal_set_message(t('The system counld not determine the width and height of your video: !video. If transcoding, the system could have problems.', array('!video' => $video))); return; } //now lets get aspect ratio and compare our options in the select dropdown then add an asterick if any to each option representing a matching aspect ratio. $ratio = number_format($width / $height, 4); $aspect_ratio = array( 'width' => $width, 'height' => $height, 'ratio' => $ratio, ); return $aspect_ratio; } /* * Return our list of video extensions and their associated player. */ function video_video_extensions() { $extensions = array( 'divx' => 'video_play_divx', 'mov' => 'video_play_quicktime', '3gp' => 'video_play_quicktime', '3g2' => 'video_play_quicktime', 'mp4' => 'video_play_quicktime', 'rm' => 'video_play_realmedia', 'f4v' => 'video_play_flv', 'flv' => 'video_play_flv', 'swf' => 'video_play_flash', 'dir' => 'video_play_dcr', 'dcr' => 'video_play_dcr', 'asf' => 'video_play_windowsmedia', 'wmv' => 'video_play_windowsmedia', 'avi' => 'video_play_windowsmedia', 'mpg' => 'video_play_windowsmedia', 'mpeg' => 'video_play_windowsmedia', 'ogg' => 'video_play_theora', 'ogv' => 'video_play_theora', 'webm' => 'video_play_theora' ); return $extensions; } /* * Return our supported video players. */ function video_video_players() { $players = array( 'video_play_html5' => t('HTML5 Player'), 'video_play_divx' => t('Divx Player'), 'video_play_quicktime' => t('Quicktime'), 'video_play_realmedia' => t('Real Media Player'), 'video_play_flv' => t('FLV Flash Players'), 'video_play_flash' => t('SWF Flash Player'), 'video_play_dcr' => t('Director/Shockwave'), 'video_play_windowsmedia' => t('Windows Media Player'), 'video_play_theora' => t('Theora Player'), ); return $players; } /* * Return our possible flash players. */ function video_video_flv_players() { $options = array(); if (module_exists('swftools')) { $options['swftools'] = t('SWF Tools'); } if (module_exists('flowplayer')) { $options['flowplayer'] = t('Flowplayer'); } return $options; } /** * Get the object for the suitable player for the parameter resource */ function video_get_player($variables) { // Setup our node object to be passed along with the player. // $node = $variables['entity']; // Setup our video object module_load_include('inc', 'video', '/includes/video_helper'); $video_helper = new video_helper; $video = $video_helper->video_object($variables); // Lets spit out our theme based on the extension $defaults = video_video_extensions(); $theme_function = variable_get('video_extension_' . $video->player, $defaults[$video->player]); // Lets do some special handling for our flv files to accomdate multiple players. if ($theme_function == 'video_play_flv') { return theme('video_flv', (array) $video); } else { return theme($theme_function, (array) $video); } } function video_default_instance_settings($widget) { $form = array(); // Default video settings. $form['default_dimensions'] = array( '#type' => 'select', '#title' => t('Default Video Resolution Dimensions'), '#default_value' => !empty($widget['default_dimensions']) ? $widget['default_dimensions'] : '', '#options' => video_explode("\n", variable_get("video_metadata_dimensions", video_default_dimensions())), '#description' => t('Default transcoding resolution WIDTHxHEIGHT, in px, that FFMPEG will use to transcode your video files.'), '#weight' => 15, ); $form['default_player_dimensions'] = array( '#type' => 'select', '#title' => t('Default Video Player Dimensions'), '#default_value' => !empty($widget['default_player_dimensions']) ? $widget['default_player_dimensions'] : '', '#options' => video_explode("\n", variable_get("video_metadata_dimensions", video_default_dimensions())), '#description' => t('Default player WIDTHxHEIGHT in px. This is your actual player dimensions that your video will be playing in.'), '#weight' => 16, ); return $form; } function video_default_field_settings($settings) { $form = array(); // Default video field settings. $form['autoconversion'] = array( '#type' => 'checkbox', '#title' => t('Enable video conversion.'), '#description' => t('Use ffmpeg(Default) or Zencoder to automatically convert videos to web compatible types eg. FLV, Please make sure to configure your transcoder settings.'), '#default_value' => isset($settings['autoconversion']) ? $settings['autoconversion'] : '', '#weight' => 17, ); $thumb_options = array( 'auto' => 'Automatically generate thumbnails', 'auto_fallback' => 'Automatically generate thumbnails, with fallback to manual upload', 'manual_upload' => 'Manually upload a thumbnail', 'no' => 'Don\'t create thumbnail', ); $form['autothumbnail'] = array( '#type' => 'radios', '#title' => t('Thumbnail Generation'), '#options' => $thumb_options, '#description' => t('To use ffmpeg(Default) to create thumbnails, Please make sure to configure your transcoder settings before using ffmpeg to create thumbnails.'), '#default_value' => isset($settings['autothumbnail']) ? $settings['autothumbnail'] : 'no', '#weight' => 18, ); $form['default_video_thumbnail'] = array( '#title' => t('Default video thumbnail'), '#type' => 'managed_file', // '#element_validate' => array('video_field_default_thumbnail_validate'), '#description' => t('If use default thumbnanil is selected, this image will be shown on display.'), '#default_value' => !empty($settings['default_video_thumbnail']) ? $settings['default_video_thumbnail'] : '', '#upload_location' => 'public://videos/thumbnails/default', '#weight' => 19, ); $form['preview_video_thumb_style'] = array( '#title' => t('Preview thumbnail style'), '#type' => 'select', '#options' => image_style_options(FALSE), '#empty_option' => '<' . t('no preview') . '>', '#default_value' => !empty($settings['preview_video_thumb_style']) ? $settings['preview_video_thumb_style'] : '', '#description' => t('The preview image will be shown while editing the content.'), '#weight' => 20, ); return $form; } /* * #options helper function to set our key=value for the form api. */ function video_explode($delimeter, $dimensions) { $options = array(); $values = explode($delimeter, $dimensions); foreach ($values as $value) { //lets check we have a value and its in the right format if (!empty($value) && video_format_right($value)) { $options[trim($value)] = trim($value); } } return $options; } function video_format_right($value) { $format = explode("x", $value); if (!isset($format[0]) || !is_numeric(trim($format[0]))) return false; if (!isset($format[1]) || !is_numeric(trim($format[1]))) return false; return true; } /* * Default video dimensions. */ function video_default_dimensions() { return "176x144\n352x288\n704x576\n1408x1152\n128x96\n160x120\n320x240\n640x480\n800x600\n1024x768\n1600x1200\n2048x1024\n1280x1024\n2560x2048\n5120x4096\n852x480\n1366x768\n1600x1024\n1920x1200\n2560x1600\n3200x2048\n3840x2400\n6400x4096\n7680x4800\n320x200\n640x350\n852x480\n1280x720\n1920x1080"; } /* * Utility function to remove all files and directories recursively. */ function rmdirr($dir) { if ($objs = glob($dir . "/*")) { foreach ($objs as $obj) { is_dir($obj) ? rmdirr($obj) : unlink($obj); } } @rmdir($dir); }