t('YouTube Video'), 'file types' => array('video'), 'default settings' => array(), 'view callback' => 'media_youtube_file_formatter_video_view', 'settings callback' => 'media_youtube_file_formatter_video_settings', 'mime types' => array('video/youtube'), ); $formatters['media_youtube_video']['default settings'] = array( 'width' => 640, 'height' => 390, 'autohide' => 2, 'autoplay' => FALSE, 'color' => 'red', 'enablejsapi' => FALSE, 'loop' => FALSE, 'modestbranding' => FALSE, 'nocookie' => FALSE, 'origin' => '', 'protocol' => 'https:', 'protocol_specify' => FALSE, 'rel' => TRUE, 'showinfo' => TRUE, 'theme' => 'dark', ); $formatters['media_youtube_image'] = array( 'label' => t('YouTube Preview Image'), 'file types' => array('video'), 'default settings' => array( 'image_style' => '', ), 'view callback' => 'media_youtube_file_formatter_image_view', 'settings callback' => 'media_youtube_file_formatter_image_settings', 'mime types' => array('video/youtube'), ); return $formatters; } /** * Implements hook_file_formatter_FORMATTER_view(). */ function media_youtube_file_formatter_video_view($file, $display, $langcode) { $scheme = file_uri_scheme($file->uri); // WYSIWYG does not yet support video inside a running editor instance. if ($scheme == 'youtube' && empty($file->override['wysiwyg'])) { $element = array( '#theme' => 'media_youtube_video', '#uri' => $file->uri, '#options' => array(), ); // Fake a default for attributes so the ternary doesn't choke. $display['settings']['attributes'] = array(); foreach (array('width', 'height', 'autohide', 'autoplay', 'color', 'enablejsapi', 'loop', 'modestbranding', 'nocookie', 'origin', 'protocol', 'protocol_specify', 'rel', 'showinfo', 'theme', 'attributes') as $setting) { $element['#options'][$setting] = isset($file->override[$setting]) ? $file->override[$setting] : $display['settings'][$setting]; } return $element; } } /** * Implements hook_file_formatter_FORMATTER_settings(). */ function media_youtube_file_formatter_video_settings($form, &$form_state, $settings) { $element = array(); $element['width'] = array( '#title' => t('Width'), '#type' => 'textfield', '#default_value' => $settings['width'], '#element_validate' => array('_youtube_validate_video_width_and_height'), ); $element['height'] = array( '#title' => t('Height'), '#type' => 'textfield', '#default_value' => $settings['height'], '#element_validate' => array('_youtube_validate_video_width_and_height'), ); // @see https://developers.google.com/youtube/player_parameters#Parameters // Multiple options. $element['theme'] = array( '#title' => t('Player theme'), '#type' => 'radios', '#options' => array( 'dark' => t('Dark'), 'light' => t('Light'), ), '#default_value' => $settings['theme'], ); $element['color'] = array( '#title' => t('Progress bar color'), '#type' => 'radios', '#options' => array( 'red' => t('Red'), 'white' => t('White'), ), '#default_value' => $settings['color'], ); $element['autohide'] = array( '#title' => t('Controls during playback'), '#type' => 'radios', '#options' => array( '0' => t('Keep progress bar and player controls on screen while playing'), '2' => t('Hide progress bar while playing'), '1' => t('Hide progress bar and player controls'), ), '#default_value' => $settings['autohide'], ); // Single Options. $element['autoplay'] = array( '#title' => t('Autoplay video on load'), '#type' => 'checkbox', '#default_value' => $settings['autoplay'], ); $element['loop'] = array( '#title' => t('Loop video'), '#type' => 'checkbox', '#default_value' => $settings['loop'], ); // Note: make sure the positive/negitive language lines up with option // processing in media_youtube.theme.inc. $element['showinfo'] = array( '#title' => t('Display video title and uploader'), '#type' => 'checkbox', '#default_value' => $settings['showinfo'], ); $element['modestbranding'] = array( '#title' => t('Remove YouTube logo from the control bar'), '#type' => 'checkbox', '#default_value' => $settings['modestbranding'], ); $element['rel'] = array( '#title' => t('Show related videos when playback ends'), '#type' => 'checkbox', '#default_value' => $settings['rel'], ); $element['nocookie'] = array( '#title' => t('Use privacy enhanced (no cookie) mode'), '#type' => 'checkbox', '#default_value' => $settings['nocookie'], ); $element['protocol_specify'] = array( '#title' => t('Specify an http protocol'), '#type' => 'checkbox', '#default_value' => $settings['protocol_specify'], '#description' => t('An explicit protocol may be neccesary for videos embedded in RSS feeds and emails. If no protocol is specified, iframes will be protocol relative.'), ); $element['protocol'] = array( '#title' => t('Iframe protocol'), '#type' => 'radios', '#default_value' => $settings['protocol'], '#options' => array( 'http:' => 'http://', 'https:' => 'https://', ), '#states' => array( 'invisible' => array( ':input[name="displays[media_youtube_video][settings][protocol_specify]"]' => array('checked' => FALSE), ), ), ); // JS api. $element['enablejsapi'] = array( '#title' => t('Enable the Javascript API'), '#type' => 'checkbox', '#default_value' => $settings['enablejsapi'], '#description' => 'An id in the format media-youtube-{video_id} will be added to each iframe.', ); $element['origin'] = array( '#title' => t('Origin'), '#type' => 'textfield', '#description' => t('If the Javascript API is enabled, enter your site\'s domain for added security.'), '#default_value' => $settings['origin'], '#states' => array( 'invisible' => array( ':input[name="displays[media_youtube_video][settings][enablejsapi]"]' => array('checked' => FALSE), ), ), '#element_validate' => array('_youtube_validate_jsapi_domain'), ); return $element; } /** * Validation for width and height. */ function _youtube_validate_video_width_and_height($element, &$form_state, $form) { // Check if the value is a number with an optional decimal or percentage sign, or "auto". if (!empty($element['#value']) && !preg_match('/^(auto|([0-9]*(\.[0-9]+)?%?))$/', $element['#value'])) { form_error($element, t("The value entered for @dimension is invalid. Please insert a unitless integer for pixels, a percent, or \"auto\". Note that percent and auto may not function correctly depending on the browser and doctype.", array('@dimension' => $element['#title']))); } } /** * Validation for Js API Origin. */ function _youtube_validate_jsapi_domain ($element, &$form_state, $form) { // Check if the value is a url with http/s and no trailing directories. if (!empty($element['#value']) && !preg_match('/^https?\:\/\/[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}){1,2}$/', $element['#value'])) { form_error($element, t('Please insert a valid domain in the format http://www.yourdomain.com')); } } /** * Implements hook_file_formatter_FORMATTER_view(). */ function media_youtube_file_formatter_image_view($file, $display, $langcode) { $scheme = file_uri_scheme($file->uri); if ($scheme == 'youtube') { $wrapper = file_stream_wrapper_get_instance_by_uri($file->uri); $image_style = $display['settings']['image_style']; $valid_image_styles = image_style_options(FALSE); // @TODO: If autosubmit is removed and we allow view modes that insert // images in the WYSIWYG, add file->overrides handling. if (empty($image_style) || !isset($valid_image_styles[$image_style])) { $element = array( '#theme' => 'image', '#path' => $wrapper->getOriginalThumbnailPath(), '#alt' => isset($file->override['attributes']['alt']) ? $file->override['attributes']['alt'] : $file->filename, ); } else { $element = array( '#theme' => 'image_style', '#style_name' => $image_style, '#path' => $wrapper->getLocalThumbnailPath(), '#alt' => isset($file->override['attributes']['alt']) ? $file->override['attributes']['alt'] : $file->filename, ); } return $element; } } /** * Implements hook_file_formatter_FORMATTER_settings(). */ function media_youtube_file_formatter_image_settings($form, &$form_state, $settings) { $element = array(); $element['image_style'] = array( '#title' => t('Image style'), '#type' => 'select', '#options' => image_style_options(FALSE), '#default_value' => $settings['image_style'], '#empty_option' => t('None (original image)'), ); return $element; } /** * Implements hook_file_default_displays_alter(). */ function media_youtube_file_default_displays_alter(&$file_displays) { // Video previews should be displayed using a large filetype icon. $file_display = new stdClass(); $file_display->api_version = 1; $file_display->name = 'video__default__media_youtube_video'; $file_display->weight = 0; $file_display->status = TRUE; $file_display->settings = array( 'width' => '640', 'height' => '390', 'theme' => 'dark', 'color' => 'red', 'autohide' => '2', 'autoplay' => 0, 'loop' => 0, 'showinfo' => 1, 'modestbranding' => 0, 'rel' => 1, 'nocookie' => 0, 'protocol_specify' => 0, 'protocol' => 'https:', 'enablejsapi' => 0, 'origin' => '', ); $file_displays['video__default__media_youtube_video'] = $file_display; $file_display = new stdClass(); $file_display->api_version = 1; $file_display->name = 'video__preview__media_youtube_image'; $file_display->weight = 0; $file_display->status = TRUE; $file_display->settings = array( 'image_style' => 'media_thumbnail', ); $file_displays['video__preview__media_youtube_image'] = $file_display; $file_display = new stdClass(); $file_display->api_version = 1; $file_display->name = 'video__teaser__media_youtube_video'; $file_display->weight = 0; $file_display->status = TRUE; $file_display->settings = array( 'width' => '560', 'height' => '340', 'theme' => 'dark', 'color' => 'red', 'autohide' => '2', 'autoplay' => 0, 'loop' => 0, 'showinfo' => 1, 'modestbranding' => 0, 'rel' => 1, 'nocookie' => 0, 'protocol_specify' => 0, 'protocol' => 'https:', 'enablejsapi' => 0, 'origin' => '', ); $file_displays['video__teaser__media_youtube_video'] = $file_display; }