media_internet.module in D7 Media 7
Same filename and directory in other branches
File
modules/media_internet/media_internet.moduleView source
<?php
/**
* Implements hook_hook_info().
*/
function media_internet_hook_info() {
$hooks = array(
'media_internet_providers',
);
return array_fill_keys($hooks, array(
'group' => 'media',
));
}
/**
* Access callback for the media_internet media browser plugin.
*/
function media_internet_access($account = NULL) {
return user_access('administer media', $account) || user_access('add media from remote sources', $account);
}
/**
* Implement hook_permission().
*/
function media_internet_permission() {
return array(
'add media from remote sources' => array(
'title' => t('Add media from remote services'),
'description' => t('Add media from remote sources such as other websites, YouTube, etc'),
),
);
}
/**
* Provides a form for adding media items from 3rd party sources.
*/
function media_internet_add($form, &$form_state = array(), $types = NULL) {
$form['embed_code'] = array(
'#type' => 'textfield',
'#title' => t('URL or Embed code'),
'#description' => t('Input a url or embed code from one of the listed providers.'),
'#attributes' => array(
'class' => array(
'media-add-from-url',
),
),
// There is no standard specifying a maximum length for a URL. Internet
// Explorer supports upto 2083 (http://support.microsoft.com/kb/208427), so
// we assume publicly available media URLs are within this limit.
'#maxlength' => 2083,
);
// @todo:
// Add live previews back (currently broken)
//$form['preview'] = array(
// '#type' => 'item',
// '#title' => t('Preview'),
// '#markup' => '<div id="media-add-from-url-preview"></div>'
//);
$form['#validators'] = array();
if ($types) {
$form['#validators']['media_file_validate_types'] = array(
$types,
);
}
$providers = array();
foreach (media_internet_get_providers() as $key => $provider) {
if (empty($provider['hidden']) || $provider['hidden'] != TRUE) {
// @todo Convert this to show provider images in a nice format.
$class = drupal_clean_css_identifier(drupal_strtolower($provider['title']));
$providers[] = array(
'data' => check_plain($provider['title']),
'class' => array(
$class,
),
);
}
}
$form['providers'] = array(
'#theme' => 'item_list',
'#title' => t('Supported providers'),
'#items' => $providers,
'#attributes' => array(
'class' => array(
'media-internet-providers',
),
),
);
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
/**
* Allow stream wrappers to have their chance at validation.
*
* Any module that implements hook_media_parse will have an
* opportunity to validate this.
*
* @see media_parse_to_uri()
*/
function media_internet_add_validate($form, &$form_state) {
// Supporting providers can now claim this input. It might be a URL, but it
// might be an embed code as well.
$embed_code = $form_state['values']['embed_code'];
try {
$provider = media_internet_get_provider($embed_code);
$provider
->validate();
} catch (MediaInternetNoHandlerException $e) {
form_set_error('embed_code', $e
->getMessage());
return;
} catch (MediaInternetValidationException $e) {
form_set_error('embed_code', $e
->getMessage());
return;
}
$validators = $form['#validators'];
$file = $provider
->getFileObject();
if ($validators) {
try {
$file = $provider
->getFileObject();
} catch (Exception $e) {
form_set_error('embed_code', $e
->getMessage());
return;
}
// Check for errors. @see media_add_upload_validate calls file_save_upload().
// this code is ripped from file_save_upload because we just want the validation part.
// Call the validation functions specified by this function's caller.
$errors = file_validate($file, $validators);
if (!empty($errors)) {
$message = t('%url could not be added.', array(
'%url' => $embed_code,
));
if (count($errors) > 1) {
$message .= theme('item_list', array(
'items' => $errors,
));
}
else {
$message .= ' ' . array_pop($errors);
}
form_set_error('embed_code', $message);
return FALSE;
}
}
// @TODO: Validate that if we have no $uri that this is a valid file to
// save. For instance, we may only be interested in images, and it would
// be helpful to let the user know they passed the HTML page containing
// the image accidentally. That would also save us from saving the file
// in the submit step.
// This is kinda a hack of the same.
// This should use the file_validate routines that the upload form users.
// We need to fix the media_parse_to_file routine to allow for a validation.
}
/**
* Upload a file from a URL.
*
* This will copy a file from a remote location and store it locally.
*
* @see media_parse_to_uri()
* @see media_parse_to_file()
*/
function media_internet_add_submit($form, &$form_state) {
$embed_code = $form_state['values']['embed_code'];
try {
// Save the remote file
$provider = media_internet_get_provider($embed_code);
// Providers decide if they need to save locally or somewhere else.
// This method returns a file object
$file = $provider
->save();
} catch (Exception $e) {
form_set_error('embed_code', $e
->getMessage());
return;
}
if (!$file->fid) {
form_set_error('embed_code', t('The file %file could not be saved. An unknown error has occurred.', array(
'%file' => $embed_code,
)));
return;
}
$form_state['redirect'] = array(
'media/browser',
array(
'query' => array(
'render' => 'media-popup',
'fid' => $file->fid,
),
),
);
}
/**
* Gets the list of providers.
*
* A "Provider" is a bit of meta-data like a title and a logo and a class which
* can handle saving remote files. Each provider is able to parse an embed code or URL
* and store it as a file object in file_managed.
*/
function media_internet_get_providers() {
$providers =& drupal_static(__FUNCTION__);
if (!isset($providers)) {
$cid = 'media:internet:providers';
if ($cache = cache_get($cid)) {
$providers = $cache->data;
}
else {
$providers = array();
foreach (module_implements('media_internet_providers') as $module) {
foreach (module_invoke($module, 'media_internet_providers') as $key => $provider) {
// Store the module here too for convinience.
$providers[$key] = $provider;
$providers[$key]['module'] = $module;
if (!isset($providers[$key]['weight'])) {
$providers[$key]['weight'] = 0;
}
}
}
uasort($providers, 'drupal_sort_weight');
cache_set($cid, $providers);
}
}
return $providers;
}
/**
* Finds the appropriate provider for a given URL or embed_string
*
* Each provider has a claim() method which it uses to tell media_internet
* that it should handle this input. We cycle through all providers to find
* the right one.
*
* @todo: Make this into a normal hook or something because we have to instantiate
* each class to test and that's not right.
*/
function media_internet_get_provider($embed_string) {
foreach (media_internet_get_providers() as $class_name => $nothing) {
$p = new $class_name($embed_string);
if ($p
->claim($embed_string)) {
return $p;
}
}
throw new MediaInternetNoHandlerException(t('Unable to handle the provided embed string or URL.'));
}
Functions
Name | Description |
---|---|
media_internet_access | Access callback for the media_internet media browser plugin. |
media_internet_add | Provides a form for adding media items from 3rd party sources. |
media_internet_add_submit | Upload a file from a URL. |
media_internet_add_validate | Allow stream wrappers to have their chance at validation. |
media_internet_get_provider | Finds the appropriate provider for a given URL or embed_string |
media_internet_get_providers | Gets the list of providers. |
media_internet_hook_info | Implements hook_hook_info(). |
media_internet_permission | Implement hook_permission(). |