View source
<?php
function media_internet_hook_info() {
$hooks = array(
'media_internet_providers',
);
return array_fill_keys($hooks, array(
'group' => 'media',
));
}
function media_internet_menu() {
$items['file/add/web'] = array(
'title' => 'Web',
'description' => 'Add internet files to your media library.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'media_internet_add_upload',
),
'access callback' => 'media_internet_access',
'type' => MENU_LOCAL_TASK,
'file' => 'file_entity.pages.inc',
'file path' => drupal_get_path('module', 'file_entity'),
);
return $items;
}
function media_internet_access($account = NULL) {
return user_access('administer files', $account) || user_access('add media from remote sources', $account);
}
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'),
),
);
}
function media_internet_theme() {
return array(
'media_internet_embed_help' => array(
'variables' => array(
'description' => NULL,
'supported_providers' => NULL,
),
),
);
}
function media_internet_get_providers() {
$providers =& drupal_static(__FUNCTION__);
if (!isset($providers)) {
foreach (module_implements('media_internet_providers') as $module) {
foreach (module_invoke($module, 'media_internet_providers') as $class => $info) {
$providers[$class] = $info;
$providers[$class]['module'] = $module;
if (!isset($providers[$class]['weight'])) {
$providers[$class]['weight'] = 0;
}
}
}
drupal_alter('media_internet_providers', $providers);
uasort($providers, 'drupal_sort_weight');
}
return $providers;
}
function media_internet_get_provider($embed_string) {
foreach (media_internet_get_providers() as $class_name => $nothing) {
module_load_include('inc', $nothing['module'], 'includes/' . $class_name);
$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.'));
}
function theme_media_internet_embed_help($variables) {
$description = $variables['description'];
$supported_providers = $variables['supported_providers'];
$descriptions = array();
if (strlen($description)) {
$descriptions[] = $description;
}
if (!empty($supported_providers)) {
$descriptions[] = t('Supported internet media providers: !providers.', array(
'!providers' => '<strong>' . $supported_providers . '</strong>',
));
}
return implode('<br />', $descriptions);
}
function media_internet_forms($form_id, $args) {
$forms = array();
if ($form_id == 'media_internet_add_upload') {
$forms[$form_id] = array(
'callback' => 'file_entity_add_upload',
);
}
return $forms;
}
function media_internet_form_file_entity_add_upload_alter(&$form, &$form_state, $form_id) {
$step = $form['#step'];
$options = $form['#options'];
if ($form_id == 'media_internet_add_upload' && $step == 1) {
unset($form['upload']);
$form['embed_code'] = array(
'#type' => 'textfield',
'#title' => t('File URL'),
'#description' => t('Enter a URL to a file.'),
'#attributes' => array(
'class' => array(
'media-add-from-url',
),
),
'#maxlength' => 2083,
'#required' => TRUE,
'#default_value' => isset($form_state['storage']['embed_code']) ? $form_state['storage']['embed_code'] : NULL,
);
$providers = array();
foreach (media_internet_get_providers() as $key => $provider) {
if (empty($provider['hidden']) || $provider['hidden'] != TRUE) {
$providers[] = check_plain($provider['title']);
}
}
$form['#providers'] = $providers;
if ($providers) {
$form['embed_code']['#title'] = t('File URL or media resource');
$form['embed_code']['#description'] = t('Enter a URL to a file or media resource. Many media providers also support identifying media via the embed code used to embed the media into external websites.');
$form['embed_code']['#description'] = theme('media_internet_embed_help', array(
'description' => $form['embed_code']['#description'],
'supported_providers' => implode(', ', $providers),
));
}
$form['#validators'] = array();
if (!empty($options['types'])) {
$form['#validators']['media_file_validate_types'] = array(
$options['types'],
);
}
array_unshift($form['#validate'], 'media_internet_add_validate');
array_unshift($form['#submit'], 'media_internet_add_submit');
}
}
function media_internet_add_validate($form, &$form_state) {
$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;
}
$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;
}
}
}
function media_internet_add_submit($form, &$form_state) {
$embed_code = $form_state['values']['embed_code'];
try {
$provider = media_internet_get_provider($embed_code);
$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;
}
else {
$form_state['storage']['upload'] = $file->fid;
}
}