Projet

Général

Profil

Révision 58344a8d

Ajouté par Assos Assos il y a presque 9 ans

Weekly update of contrib modules

Voir les différences:

drupal7/sites/all/modules/media_youtube/media_youtube.module
6 6
 * displaying YouTube videos.
7 7
 */
8 8

  
9
/**
10
 * This is the rest point for the YouTube api.
11
 *
12
 * Avoid using the gdata api url when possible. Too many calls will result in
13
 * throttling and 403 errors.
14
 */
15
define('MEDIA_YOUTUBE_REST_API', 'https://gdata.youtube.com/feeds/api/videos');
16

  
17 9
// Load all YouTube file formatters.
18 10
require_once dirname(__FILE__) . '/includes/media_youtube.formatters.inc';
19 11

  
......
83 75
    return array('version' => 1);
84 76
  }
85 77
}
86

  
87
/**
88
 * YouTube search tab for the Media browser.
89
 */
90

  
91
/**
92
 * Implements hook_media_browser_plugin_info().
93
 *
94
 * Commented out for release versions, active in dev versions. To enable the
95
 * YouTube media browser tab, uncomment this function.
96
 */
97
function media_youtube_media_browser_plugin_info() {
98
  $info['youtube'] = array(
99
    'title' => t('YouTube'),
100
    'class' => 'MediaYouTubeBrowser',
101
  );
102

  
103
  return $info;
104
}
105

  
106
/**
107
 * Provides a form for adding media items from YouTube search.
108
 */
109
function media_youtube_add($form, &$form_state = array()) {
110
  module_load_include('inc', 'media', 'includes/media.browser');
111

  
112
  // Our search term can come from the form, or from the pager.
113
  $term = isset($form_state['input']['search']) ? $form_state['input']['search'] : (isset($_GET['search']) ? $_GET['search'] : '');
114

  
115
  $form['search'] = array(
116
    '#type' => 'textfield',
117
    '#title' => t('Search'),
118
    '#description' => t('Input a phrase or tags to search.'),
119
    '#default_value' => $term,
120
  );
121
  $form['apply'] = array(
122
    '#type' => 'button',
123
    '#value' => t('Apply'),
124
  );
125

  
126
  // This is our half-assed pager.
127
  $page = isset($_GET['page-yt']) ? $_GET['page-yt'] : 0;
128
  if (isset($form_state['input']['search'])) {
129
    // Reset the pager when we press apply.
130
    $page = 0;
131
  }
132
  if (!empty($term)) {
133
    $search = media_youtube_video_search(array('q' => $term, 'max-results' => 12, 'start-index' => $page * 12 + 1));
134
  }
135
  $form['videos']['#prefix'] = '<div id="container"><div id="scrollbox"><ul id="media-browser-library-list" class="media-list-thumbnails">';
136
  $form['videos']['#suffix'] = '</ul><div id="status"></div></div></div>';
137

  
138
  $empty = FALSE;
139
  $files = array();
140
  if (!isset($search['entry'])) {
141
    $empty = TRUE;
142
  }
143
  else {
144
    // $search['entry'] is different depending on whether there is a single
145
    // result or multiple results. So normalise it.
146
    $videos = isset($search['entry']['id']) ? array($search['entry']) : $search['entry'];
147
    foreach ($videos as $video) {
148
      try {
149
        $uri = media_parse_to_uri($video['link'][0]['@attributes']['href']);
150
      }
151
      catch (Exception $e) {
152
        // Ignore invalid videos.
153
        continue;
154
      }
155
      // Create a temporary file object for our retrieved video.
156
      $file = file_uri_to_object($uri);
157
      $file->type = 'video';
158
      if (!isset($file->fid)) {
159
        $file->fid = 0;
160
      }
161
      media_browser_build_media_item($file);
162
      $attributes = array(
163
        'data-uri' => $uri,
164
        'class' => array('media-youtube-wrapper'),
165
      );
166
      $form['videos'][$uri] = array(
167
        '#markup' => $file->preview,
168
        '#prefix' => '<li' . drupal_attributes($attributes) . '>',
169
        '#suffix' => '</li>',
170
      );
171
      $files[$uri] = $file;
172
    }
173
  }
174

  
175
  if (!count($files)) {
176
    $empty= TRUE;
177
  }
178
  if ($empty) {
179
    $form['empty'] = array(
180
      '#markup' => '<div class="empty-message">' . t('No videos match your search criteria. Please try again.') . '</div>',
181
    );
182
  }
183

  
184
  $query = $_GET;
185
  if ($term !== '') {
186
    $query['search'] = $term;
187
  }
188

  
189
  $dest = $query['q'];
190
  unset($query['q']);
191
  $prev = $next = '';
192
  if ($page) {
193
    $query['page-yt'] = $page - 1;
194
    $prev = l(t('previous'), $dest, array('query' => $query));
195
  }
196
  $query['page-yt'] = $page + 1;
197
  if (!$empty) {
198
    $next = l(t('next'), $dest, array('query' => $query));
199
  }
200

  
201
  $form['pager']= array(
202
    '#markup' => $prev . ' ' . $next,
203
  );
204

  
205
  $form['submitted-video'] = array(
206
    '#type' => 'hidden',
207
    '#default_value' => FALSE,
208
  );
209

  
210
  // Add the files to JS so that they are accessible inside the browser
211
  drupal_add_js(array('media' => array('files' => $files)), 'setting');
212

  
213
  // Add media browser javascript and CSS.
214
  drupal_add_js(drupal_get_path('module', 'media_youtube') . '/js/media-youtube.browser.js');
215

  
216
  // @TODO: Remove deprecated library js and css. They're removed in Media,
217
  // so let's comment out for now.
218
  // drupal_add_js(drupal_get_path('module', 'media') . '/js/plugins/media.library.js');
219
  // drupal_add_css(drupal_get_path('module', 'media') . '/js/plugins/media.library.css');
220

  
221
  $form['actions'] = array('#type' => 'actions');
222
  $form['actions']['submit'] = array(
223
    '#type' => 'submit',
224
    '#value' => t('Submit'),
225
  );
226
  return $form;
227
}
228

  
229
/**
230
 * Allow stream wrappers to have their chance at validation.
231
 *
232
 * Any module that implements hook_media_parse will have an
233
 * opportunity to validate this.
234
 *
235
 * @see media_parse_to_uri()
236
 */
237
function media_youtube_add_validate($form, &$form_state) {
238
  if ($form_state['values']['op'] == t('Apply')) {
239
    return;
240
  }
241
  $uri = $form_state['values']['submitted-video'];
242
  try {
243
    $file = file_uri_to_object($uri, TRUE);
244
  }
245
  catch (Exception $e) {
246
    form_set_error('url', $e->getMessage());
247
    return;
248
  }
249

  
250
  if (!$file->uri) {
251
    form_set_error('url', t('Please select a video.'));
252
    return;
253
  }
254

  
255
  $validators = isset($form['#validators']) ? $form['#validators'] : array();
256
  if ($validators) {
257
    // Check for errors. @see media_add_upload_validate calls file_save_upload().
258
    // this code is ripped from file_save_upload because we just want the validation part.
259
    // Call the validation functions specified by this function's caller.
260
    $errors = file_validate($file, $validators);
261

  
262
    if (!empty($errors)) {
263
      $message = t('%uri could not be added.', array('%uri' => $uri));
264
      if (count($errors) > 1) {
265
        $message .= theme('item_list', array('items' => $errors));
266
      }
267
      else {
268
        $message .= ' ' . array_pop($errors);
269
      }
270
      form_set_error('url', $message);
271
      return FALSE;
272
    }
273
  }
274
  // @TODO: Validate that if we have no $uri that this is a valid file to
275
  // save. For instance, we may only be interested in images, and it would
276
  // be helpful to let the user know they passed the HTML page containing
277
  // the image accidentally. That would also save us from saving the file
278
  // in the submit step.
279

  
280
  // This is kinda a hack of the same.
281

  
282
  // This should use the file_validate routines that the upload form users.
283
  // We need to fix the media_parse_to_file routine to allow for a validation.
284
}
285

  
286
/**
287
 * @TODO: Document this function.
288
 */
289
function media_youtube_add_submit($form, &$form_state) {
290
  $uri = $form_state['values']['submitted-video'];
291
  try {
292
    // Save the remote file
293
    $file = file_uri_to_object($uri, TRUE);
294
    file_save($file);
295
  }
296
  catch (Exception $e) {
297
    form_set_error('url', $e->getMessage());
298
    return;
299
  }
300

  
301
  if (!$file->fid) {
302
    form_set_error('url', t('The file %file could not be saved. An unknown error has occurred.', array('%file' => $uri)));
303
    return;
304
  }
305
  else {
306
    $form_state['file'] = $file;
307
  }
308

  
309
  // Redirect to the file edit page after submission.
310
  if (media_youtube_access('update', $file)) {
311
    $destination = array('destination' => 'admin/content/file');
312
    if (isset($_GET['destination'])) {
313
      $destination = drupal_get_destination();
314
      unset($_GET['destination']);
315
    }
316
    $form_state['redirect'] = array('file/' . $file->fid . '/edit', array('query' => $destination));
317
  }
318
  else {
319
    $form_state['redirect'] = 'admin/content/file';
320
  }
321
}
322

  
323
/**
324
 * Determine if a user may perform the given operation on the specified file.
325
 *
326
 * Enables compatibility with Media 1.x and 2.x by providing a wrapper around
327
 * both media_access() and file_entity_access().
328
 *
329
 * @return boolean
330
 *   TRUE if the operation may be performed, FALSE otherwise.
331
 *
332
 * @see media_access()
333
 * @see file_entity_access()
334
 */
335
function media_youtube_access($op, $file = NULL, $account = NULL) {
336
  if (function_exists('file_entity_access')) {
337
    $access = file_entity_access($op, $file, $account);
338
  }
339
  elseif (function_exists('media_access')) {
340
    $access = media_access($op, $account);
341
  }
342
  else {
343
    $access = FALSE;
344
  }
345

  
346
  return $access;
347
}
348

  
349
/**
350
 * @TODO: Document this function.
351
 */
352
function media_youtube_video_search($options = array()) {
353
  $options['v'] = 2;
354

  
355
  $request = drupal_http_request(url(MEDIA_YOUTUBE_REST_API, array('query' => $options)));
356
  if (!isset($request->error)) {
357
    $entry = simplexml_load_string($request->data);
358
  }
359
  else {
360
    throw new Exception("Error Processing Request. (Error: {$request->code}, {$request->error})");
361

  
362
    //if request wasn't successful, create object for return to avoid errors
363
    $entry = new SimpleXMLElement();
364
  }
365

  
366
  return media_youtube_unserialize_xml($entry);
367
}
368

  
369
/**
370
 * Recursively converts a SimpleXMLElement object into an array.
371
 *
372
 * @param object $xml
373
 *   The original XML object.
374
 */
375
function media_youtube_unserialize_xml($xml) {
376
  if ($xml instanceof SimpleXMLElement) {
377
    $xml = (array) $xml;
378
  }
379
  if (is_array($xml)) {
380
    foreach ($xml as $key => $item) {
381
      $xml[$key] = media_youtube_unserialize_xml($item);
382
    }
383
  }
384
  return $xml;
385
}
386

  
387
/**
388
 * Check to ensure that a given id is valid.
389
 *
390
 * @param string $id
391
 *   The YouTube video id.
392
 * @param boolean $refresh
393
 *   (Defaults to FALSE) If TRUE, then reset the value from the cache.
394
 * @return boolean
395
 *   Returns TRUE if the video is valid.
396
 *
397
 * @TODO: How does this compare to MediaInternetYouTubeHandler's validId
398
 * method, and can we refactor the code to rely on only one of them?
399
 */
400
function media_youtube_valid_id($id, $refresh = FALSE) {
401
  $ids = &drupal_static(__FUNCTION__, array());
402

  
403
  // Return our cached id if allowed, and it exists.
404
  if (!$refresh && isset($ids[$id])) {
405
    return $ids[$id];
406
  }
407
  elseif (!$refresh && !isset($ids[$id])) {
408
    return $id;
409
  }
410
  elseif (!$refresh && $cache = cache_get('media_youtube:id:' . $id, 'cache_media_xml')) {
411
    $ids[$id] = $cache->data;
412
    return $ids[$id];
413
  }
414

  
415
  $url = url(MEDIA_YOUTUBE_REST_API . '/' . $id);
416
  $response = drupal_http_request($url, array('method' => 'HEAD'));
417
  $ids[$id] = ($response->code == 200);
418
  cache_set('media_youtube:id:' . $id, $ids[$id], 'cache_media_xml', media_variable_get('xml_cache_expire', 3600));
419
  return $ids[$id];
420
}

Formats disponibles : Unified diff