123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694 |
- <?php
- /**
- * @file
- * Provide some handlers for video embed field
- * Other modules can implement the hook_video_embed_handler_info to provide more
- * handlers.
- */
- /**
- * Implements hook_video_embed_handler_info().
- */
- function video_embed_field_video_embed_handler_info() {
- $handlers = array();
- $handlers['youtube'] = array(
- 'title' => 'Youtube',
- 'function' => 'video_embed_field_handle_youtube',
- 'thumbnail_function' => 'video_embed_field_handle_youtube_thumbnail',
- 'thumbnail_default' => drupal_get_path('module', 'video_embed_field') . '/img/youtube.jpg',
- 'data_function' => 'video_embed_field_handle_youtube_data',
- 'form' => 'video_embed_field_handler_youtube_form',
- 'form_validate' => 'video_embed_field_handler_youtube_form_validate',
- 'domains' => array(
- 'youtube.com',
- 'youtu.be',
- ),
- 'defaults' => array(
- 'width' => 640,
- 'height' => 360,
- 'autoplay' => 0,
- 'vq' => 'large',
- 'rel' => 0,
- 'controls' => 1,
- 'autohide' => 2,
- 'showinfo' => 1,
- 'modestbranding' => 0,
- 'theme' => 'dark',
- 'iv_load_policy' => 1,
- 'class' => '',
- ),
- );
- $handlers['vimeo'] = array(
- 'title' => 'Vimeo',
- 'function' => 'video_embed_field_handle_vimeo',
- 'thumbnail_function' => 'video_embed_field_handle_vimeo_thumbnail',
- 'thumbnail_default' => drupal_get_path('module', 'video_embed_field') . '/img/vimeo.jpg',
- 'data_function' => '_video_embed_field_get_vimeo_data',
- 'form' => 'video_embed_field_handler_vimeo_form',
- 'form_validate' => 'video_embed_field_handler_vimeo_form_validate',
- 'domains' => array(
- 'vimeo.com',
- ),
- 'defaults' => array(
- 'width' => 640,
- 'height' => 360,
- 'color' => '00adef',
- 'portrait' => 1,
- 'title' => 1,
- 'byline' => 1,
- 'autoplay' => 0,
- 'loop' => 0,
- 'froogaloop' => 0,
- 'class' => ''
- ),
- );
- return $handlers;
- }
- /**
- * Helper function to get the youtube video's id.
- *
- * @param string $url
- * The video URL.
- *
- * @return string|bool
- * The video ID, or FALSE in case the ID can't be retrieved from the URL.
- */
- function _video_embed_field_get_youtube_id($url) {
- // Find the ID of the video they want to play from the url.
- if (stristr($url, 'http://')) {
- $url = substr($url, 7);
- }
- elseif (stristr($url, 'https://')) {
- $url = substr($url, 8);
- }
- if (stristr($url, 'playlist')) {
- // Playlists need the appended ampersand to take the options properly.
- $url = $url . '&';
- $pos = strripos($url, '?list=');
- if ($pos !== FALSE) {
- $pos2 = stripos($url, '&');
- $pos2++;
- }
- else {
- return FALSE;
- }
- }
- // Alternate playlist link.
- elseif (stristr($url, 'view_play_list')) {
- $url = $url . '&';
- // All playlist ID's are prepended with PL.
- if (!stristr($url, '?p=PL')) {
- $url = substr_replace($url, 'PL', strpos($url, '?p=') + 3, 0);
- }
- // Replace the links format with the embed format.
- $url = str_ireplace('play_list?p=', 'videoseries?list=', $url);
- $pos = strripos($url, 'videoseries?list=');
- if ($pos !== FALSE) {
- $pos2 = stripos($url, '&');
- $pos2++;
- }
- else {
- return FALSE;
- }
- }
- else {
- $pos = strripos($url, 'v=');
- if ($pos !== FALSE) {
- $pos += 2;
- $pos2 = stripos($url, '&', $pos);
- $pos_hash = stripos($url, '#', $pos);
- $pos2 = _video_embed_get_min($pos2, $pos_hash);
- }
- else {
- $pos = strripos($url, '/');
- if ($pos !== FALSE) {
- $pos++;
- $pos2 = stripos($url, '?', $pos);
- $pos_hash = stripos($url, '#', $pos);
- $pos2 = _video_embed_get_min($pos2, $pos_hash);
- }
- }
- }
- if ($pos === FALSE) {
- return FALSE;
- }
- else {
- if ($pos2 > 0) {
- $id = substr($url, $pos, $pos2 - $pos);
- }
- else {
- $id = substr($url, $pos);
- }
- }
- return check_plain($id);
- }
- /**
- * Handler for Youtube videos.
- *
- * @param string $url
- * The video URL.
- * @param array $settings
- * The settings array.
- *
- * @return array
- * The video iframe render array.
- */
- function video_embed_field_handle_youtube($url, $settings) {
- $output = array();
- if(preg_match('/#t=((?P<min>\d+)m)?((?P<sec>\d+)s)?((?P<tinsec>\d+))?/', $url, $matches)){
- if(isset($matches['tinsec'])){
- $settings['start'] = $matches['tinsec']; // url already in form #t=125 for 2 minutes and 5 seconds
- } else {
- // url in form #t=2m5s or with other useless data, this is why we still keep adding the default data..
- // give it some default data in case there is no #t=...
- $matches += array(
- "min" => 0,
- "sec" => 0,
- );
- if ($time = ($matches["min"] * 60) + $matches["sec"]) {
- $settings['start'] = $time;
- }
- }
- }
- $id = _video_embed_field_get_youtube_id($url);
- if (!$id) {
- // We can't decode the URL - just return the URL as a link.
- $output['#markup'] = l($url, $url);
- return $output;
- }
- // Add class to variable to avoid adding it to URL param string.
- $class = $settings['class'];
- unset($settings['class']);
- // Construct the embed code.
- $settings['wmode'] = 'opaque';
- $settings_str = _video_embed_code_get_settings_str($settings);
- $output['#markup'] = '<iframe class="' . check_plain($class) . '" width="' . check_plain($settings['width']) . '" height="' . check_plain($settings['height']) . '" src="//www.youtube.com/embed/' . $id . '?' . $settings_str . '" frameborder="0" allowfullscreen></iframe>';
- return $output;
- }
- /**
- * Gets the thumbnail url for youtube videos.
- *
- * @param string $url
- * The video URL.
- *
- * @return array
- * The video thumbnail information.
- */
- function video_embed_field_handle_youtube_thumbnail($url) {
- $info = array();
- $id = _video_embed_field_get_youtube_id($url);
- // Playlist.
- if (stristr($id, '?list=')) {
- // Strip out all but the ID, including the PL behind the ID.
- $start = strpos($id, '?list=PL') + 8;
- $length = strpos($id, '&') - $start;
- $id = substr($id, $start, $length);
- $info['id'] = $id;
- // Playlist info is stored in XML. The thumbnail is in there.
- $xml = drupal_http_request('http://gdata.youtube.com/feeds/api/playlists/' . $id);
- if (!isset($xml->error)) {
- $xml = new SimpleXMLElement($xml->data);
- $media = $xml->children('http://search.yahoo.com/mrss/');
- if ($media->group->thumbnail && $media->group->thumbnail[0]->attributes()) {
- $attrs = $media->group->thumbnail[0]->attributes();
- $info['url'] = (string) $attrs['url'];
- }
- }
- }
- // Regular video.
- elseif ($id) {
- $info['id'] = $id;
- $info['url'] = 'http://img.youtube.com/vi/' . $id . '/0.jpg';
- }
- return $info;
- }
- /**
- * Gets video data for a YouTube video URL.
- *
- * @param string $url
- * A YouTube video URL to get data for
- *
- * @return array|bool
- * An array of video data, or FALSE if unable to fetch data
- */
- function video_embed_field_handle_youtube_data($url) {
- // Get YouTube video ID from URL.
- $id = _video_embed_field_get_youtube_id($url);
- if ($id) {
- $options['v'] = 3;
- $options['key'] = variable_get('video_embed_field_youtube_v3_api_key', '');
- $options['part'] = 'snippet';
- $options['id'] = $id;
- $response = drupal_http_request(url('https://www.googleapis.com/youtube/v3/videos', array('query' => $options)));
- if (!isset($response->error)) {
- $data = json_decode($response->data);
- return _video_embed_field_clean_up_youtube_data($data->items);
- }
- }
- return FALSE;
- }
- /**
- * Flattens out some unnecessary nesting in the youtube data.
- *
- * @param array $data
- * The unflattened data.
- *
- * @return array
- * The flattened data.
- */
- function _video_embed_field_clean_up_youtube_data($data) {
- // Make things a bit nicer for people trying to use the data.
- foreach ($data as $key => $value) {
- if (is_object($value)) {
- $temp = (array) $value;
- if (isset($temp['$t'])) {
- $data[$key] = $temp['$t'];
- }
- else {
- $data[$key] = _video_embed_field_clean_up_youtube_data($temp);
- }
- }
- elseif (is_array($value)) {
- $data[$key] = _video_embed_field_clean_up_youtube_data($value);
- }
- if ($key === 'category') {
- $terms = array();
- foreach ($data[$key] as $value) {
- if (isset($value['scheme']) && $value['scheme'] == 'http://schemas.google.com/g/2005#kind') {
- continue;
- }
- if (isset($value['term'])) {
- $terms[] = $value['term'];
- }
- }
- $data['terms'] = $terms;
- }
- }
- return $data;
- }
- /**
- * Defines the form elements for the Youtube configuration form.
- *
- * @param array $defaults
- * The form default values.
- *
- * @return array
- * The provider settings form array.
- */
- function video_embed_field_handler_youtube_form($defaults) {
- $form = array();
- $form['width'] = array(
- '#type' => 'textfield',
- '#size' => '5',
- '#title' => t('Player Width'),
- '#description' => t('The width of the youtube player.'),
- '#default_value' => $defaults['width'],
- );
- $form['height'] = array(
- '#type' => 'textfield',
- '#size' => '5',
- '#title' => t('Player Height'),
- '#description' => t('The height of the youtube player.'),
- '#default_value' => $defaults['height'],
- );
- $form['theme'] = array(
- '#type' => 'select',
- '#options' => array(
- 'dark' => t('Dark'),
- 'light' => t('Light'),
- ),
- '#title' => t('Player theme'),
- '#default_value' => $defaults['theme'],
- );
- $form['autoplay'] = array(
- '#type' => 'checkbox',
- '#title' => t('Autoplay'),
- '#description' => t('Play the video immediately.'),
- '#default_value' => $defaults['autoplay'],
- );
- $form['vq'] = array(
- '#type' => 'select',
- '#title' => t('Video quality'),
- '#options' => array(
- 'small' => t('Small (240p)'),
- 'medium' => t('Medium (360p)'),
- 'large' => t('Large (480p)'),
- 'hd720' => t('HD 720p'),
- 'hd1080' => t('HD 10800p'),
- ),
- '#default_value' => $defaults['vq'],
- '#description' => t('Attempt to play the video in certain quality if available.'),
- );
- $form['rel'] = array(
- '#type' => 'checkbox',
- '#title' => t('Show related videos'),
- '#description' => t('Show related videos after the video is finished playing.'),
- '#default_value' => $defaults['rel'],
- );
- $form['showinfo'] = array(
- '#type' => 'checkbox',
- '#title' => t('Show info'),
- '#description' => t('Display information like the video title and rating before the video starts playing.'),
- '#default_value' => $defaults['showinfo'],
- );
- $form['modestbranding'] = array(
- '#type' => 'checkbox',
- '#title' => t('Hide Youtube logo'),
- '#description' => t('Hide the Youtube logo button on the player'),
- '#default_value' => $defaults['modestbranding'],
- );
- $form['iv_load_policy'] = array(
- '#type' => 'radios',
- '#options' => array(
- 1 => t('Show video annotations.'),
- 3 => t('Hide video annotations.'),
- ),
- '#title' => t('Display annotations'),
- '#description' => t('Controls the display of annotations over the video content. Only works when using the flash player.'),
- '#default_value' => $defaults['iv_load_policy'],
- );
- $form['controls'] = array(
- '#type' => 'radios',
- '#options' => array(
- 0 => t('Hide video controls.'),
- 1 => t('Show video controls. Youtube default.'),
- 2 => t('Show video controls with performance improvement for iframe embeds.'),
- ),
- '#title' => t('Display Youtube player controls'),
- '#description' => t('This parameter indicates whether the video player controls will display.'),
- '#default_value' => $defaults['controls'],
- );
- $form['autohide'] = array(
- '#type' => 'radios',
- '#options' => array(
- 0 => t('The video progress bar and player controls will be visible throughout the video.'),
- 1 => t('Automatically slide the video progress bar and the player controls out of view a couple of seconds after the video starts playing. They will only reappear if the user moves her mouse over the video player or presses a keyboard key.'),
- 2 => t('The video progress bar will fade out but the player controls (play button, volume control, etc.) remain visible.'),
- ),
- '#title' => t('Autohide progress bar and the player controls'),
- '#description' => t('Controls the autohide behavior of the youtube player controls.'),
- '#default_value' => $defaults['autohide'],
- );
- $form['class'] = array(
- '#type' => 'textfield',
- '#title' => t('Player CSS class'),
- '#description' => t('CSS class to add to the player'),
- '#default_value' => $defaults['class'],
- );
- return $form;
- }
- /**
- * Validates the form elements for the Youtube configuration form.
- *
- * @param array $element
- * The form element to validate.
- * @param array $form_state
- * The form to validate state.
- * @param array $form
- * The form to validate structure.
- */
- function video_embed_field_handler_youtube_form_validate($element, &$form_state, $form) {
- video_embed_field_validate_dimensions($element);
- }
- /**
- * Helper function to get the Vimeo video's data attributes.
- *
- * @param string $url
- * A Vimeo video URL to get the data from.
- *
- * @return integer|false
- * The video's data attributes, or FALSE if unable to get the video ID.
- */
- function _video_embed_field_get_vimeo_data($url) {
- // Set oembed endpoint
- $oembed_endpoint = 'http://vimeo.com/api/oembed';
- // Fetch vimeo data
- $response = drupal_http_request($oembed_endpoint . '.json?url=' . rawurlencode($url));
- try {
- return json_decode($response->data, TRUE);
- } catch (Exception $e) {
- return FALSE;
- }
- }
- /**
- * Helper function to get the Vimeo video's data attributes.
- *
- * @param string $url
- * A Vimeo video URL to get the ID of.
- *
- * @return integer|false
- * The video ID, or FALSE if unable to get the video ID.
- */
- function _video_embed_field_get_vimeo_id($vimeo_data) {
- try {
- $video_id = $vimeo_data['video_id'];
- } catch (Exception $e) {
- $video_id = FALSE;
- }
- return $video_id;
- }
- /**
- * Handler for Vimeo videos.
- *
- * @param string $url
- * The video URL.
- * @param array $settings
- * The settings array.
- *
- * @return string
- * The video iframe.
- */
- function video_embed_field_handle_vimeo($url, $settings) {
- $vimeo_data = _video_embed_field_get_vimeo_data($url);
- // Get ID of video from URL.
- $id = _video_embed_field_get_vimeo_id($vimeo_data);
- if (empty($id)) {
- return array(
- '#markup' => l($url, $url),
- );
- }
- // Construct the embed code.
- $settings['player_id'] = drupal_html_id('vimeo-' . $id);
- if (!empty($settings['froogaloop'])) {
- $settings['api'] = 1;
- }
- unset($settings['froogaloop']);
- // Add class to variable to avoid adding it to URL param string.
- $class = $settings['class'];
- unset($settings['class']);
- $settings_str = _video_embed_code_get_settings_str($settings);
- return array(
- '#markup' => '<iframe class="' . check_plain($class) . '" id="' . $settings['player_id'] . '" width="' . check_plain($settings['width']) . '" height="' . check_plain($settings['height']) . '" src="//player.vimeo.com/video/' . $id .
- '?' . $settings_str . '" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>',
- );
- }
- /**
- * Gets the thumbnail url for vimeo videos.
- *
- * @param string $url
- * The video URL.
- *
- * @return array
- * The video thumbnail information.
- */
- function video_embed_field_handle_vimeo_thumbnail($url) {
- $vimeo_data = _video_embed_field_get_vimeo_data($url);
- // Get ID of video from URL.
- $id = _video_embed_field_get_vimeo_id($vimeo_data);
- $info = array(
- 'id' => $id,
- );
- try {
- $info['url'] = $vimeo_data['thumbnail_url'];
- } catch (Exception $e) {
- }
- return $info;
- }
- /**
- * Defines the form elements for the Vimeo configuration form.
- *
- * @param array $defaults
- * The form default values.
- *
- * @return array
- * The provider settings form array.
- */
- function video_embed_field_handler_vimeo_form($defaults) {
- $form = array();
- $form['width'] = array(
- '#type' => 'textfield',
- '#size' => '5',
- '#title' => t('Player Width'),
- '#description' => t('The width of the vimeo player.'),
- '#default_value' => $defaults['width'],
- );
- $form['height'] = array(
- '#type' => 'textfield',
- '#size' => '5',
- '#title' => t('Player Height'),
- '#description' => t('The height of the vimeo player.'),
- '#default_value' => $defaults['height'],
- );
- $form['color'] = array(
- '#type' => 'select',
- '#options' => array(
- '00adef' => t('Blue'),
- 'ff9933' => t('Orange'),
- 'c9ff23' => t('Lime'),
- 'ff0179' => t('Fuschia'),
- 'ffffff' => t('White'),
- ),
- '#title' => t('Player Color'),
- '#description' => t('The color to use on the vimeo player.'),
- '#default_value' => $defaults['color'],
- );
- $form['portrait'] = array(
- '#type' => 'checkbox',
- '#title' => t('Overlay Author Thumbnail'),
- '#description' => t("Overlay the author's thumbnail before the video is played."),
- '#default_value' => $defaults['portrait'],
- );
- $form['title'] = array(
- '#type' => 'checkbox',
- '#title' => t("Overlay Video's Title"),
- '#description' => t("Overlay the video's title before the video is played."),
- '#default_value' => $defaults['title'],
- );
- $form['byline'] = array(
- '#type' => 'checkbox',
- '#title' => t("Overlay Video's Byline"),
- '#description' => t("Overlay the video's description before the video is played."),
- '#default_value' => $defaults['byline'],
- );
- $form['overridable'] = array(
- '#prefix' => '<p class="note"><strong>' . t('Note') . ': </strong><em>',
- '#markup' => t('Color, portrait, title and byline can be restricted by Vimeo Plus videos.
- Such videos will ignore these settings.'),
- '#suffix' => '</em></p>',
- );
- $form['autoplay'] = array(
- '#type' => 'checkbox',
- '#title' => t('Autoplay'),
- '#description' => t('Play the video immediately.'),
- '#default_value' => $defaults['autoplay'],
- );
- $form['loop'] = array(
- '#type' => 'checkbox',
- '#title' => t('Loop'),
- '#description' => t("Loop the video's playback"),
- '#default_value' => $defaults['loop'],
- );
- $form['froogaloop'] = array(
- '#type' => 'checkbox',
- '#title' => t('Enable froogaloop support'),
- '#description' => t("Enables Froogallop Vimeo's library support"),
- '#default_value' => $defaults['loop'],
- );
- $form['class'] = array(
- '#type' => 'textfield',
- '#title' => t('Player CSS class'),
- '#description' => t('CSS class to add to the player'),
- '#default_value' => $defaults['class'],
- );
- return $form;
- }
- /**
- * Validates the form elements for the Vimeo configuration form.
- *
- * @param array $element
- * The form element to validate.
- * @param array $form_state
- * The form to validate state.
- * @param array $form
- * The form to validate structure.
- */
- function video_embed_field_handler_vimeo_form_validate($element, &$form_state, $form) {
- video_embed_field_validate_dimensions($element);
- }
- /**
- * Calculates the min index for use in finding the id of a youtube video.
- *
- * @param string $pos1
- * The first index.
- * @param string $pos2
- * The second index.
- *
- * @return string
- * The min index.
- */
- function _video_embed_get_min($pos1, $pos2) {
- if (!$pos1) {
- return $pos2;
- }
- elseif (!$pos2) {
- return $pos1;
- }
- else {
- return min($pos1, $pos2);
- }
- }
|