-
Notifications
You must be signed in to change notification settings - Fork 0
/
media_feeds.module
132 lines (113 loc) · 4.2 KB
/
media_feeds.module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php
/**
* @file
* Implementation of the Feeds mapping API for the media module.
*/
/**
* Implements hook_feeds_processor_targets_alter().
*/
function media_feeds_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
if ($bundle_name === NULL) {
return;
}
foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
$info = field_info_field($name);
if ($info['type'] == 'media') {
$targets[$name] = array(
'name' => t('@label (media_internet)', array('@label' => $instance['label'])),
'callback' => 'media_feeds_set_internet_target',
'description' => t('The @label field of the node. Value to be claimed by a Media Internet Sources provider. Be careful! The importing user will not need the @permission permission.', array('@label' => $instance['label'], '@permission' => 'add media from remote sources')),
);
}
}
}
/**
* Callback for mapping an URL or embed code to a field using media_internet.
* The actual mapping happens here.
*/
function media_feeds_set_internet_target($source, $entity, $target, $values) {
if (empty($values)) {
return;
}
if (!is_array($values)) {
$values = array($values);
}
$field_info = field_info_field($target);
$field = array(LANGUAGE_NONE => array());
foreach ($values as $value) {
try {
// Explicitly support FeedsEnclosure.
if ($value instanceof FeedsEnclosure) {
$value = $value->getValue();
}
// Find a provider to create a file object.
$provider = media_internet_get_provider($value);
// Wrap the provider to use some workarounds.
$provider = new MediaFeedsProviderWrapper($provider);
// Validate and get a file object.
$provider->validate();
$file = $provider->getFileObject();
if (!$file) {
drupal_set_message(t('Failed to get the file object.'));
continue;
}
// Look for the field instance settings.
$instance = field_info_instance($entity->feeds_item->entity_type, $target, $entity->type);
$allowed_types = $instance['widget']['settings']['allowed_types'];
$allowed_schemes = $instance['widget']['settings']['allowed_schemes'];
// Validate the type.
$errors = media_file_validate_types($file, $allowed_types);
if (count($errors)) {
foreach ($errors as $error) {
drupal_set_message(filter_xss($error), 'error');
}
continue;
}
// Validate the URI scheme.
// If public is allowed, also allow schemes supported by
// MediaInternetFileHandler (http, ...).
if (in_array('public', $allowed_schemes)) {
$fromurlschemes = media_variable_get('fromurl_supported_schemes');
foreach ($fromurlschemes as $fromurlscheme) {
$allowed_schemes[$fromurlscheme] = $fromurlscheme;
}
}
$scheme = file_uri_scheme($file->uri);
if (!in_array($scheme, $allowed_schemes)) {
drupal_set_message(t('Scheme %scheme not allowed for %target.', array('%scheme' => $scheme . '://', '%target' => $target)), 'error');
continue;
}
// Save file.
$file = $provider->save();
if (!$file) {
drupal_set_message(t('Failed to save the file.'), 'error');
continue;
}
// Apply author settings to the file.
if ((empty($file->uid) && !empty($entity->uid)) || $file->uid != $entity->uid) {
$file->uid = $entity->uid;
if (!file_save($file)) {
drupal_set_message(t('Failed to apply the author settings to the file.'), 'warning');
}
}
// Attach the file to the field.
$field[LANGUAGE_NONE][]['fid'] = $file->fid;
} catch (MediaInternetNoHandlerException $e) {
drupal_set_message($e->getMessage(), 'error');
} catch (MediaInternetValidationException $e) {
drupal_set_message($e->getMessage(), 'error');
}
}
$entity->{$target} = $field;
}
/**
* Implements hook_file_presave().
*/
function media_feeds_file_presave($file) {
if (class_exists('MediaFeedsProviderWrapper', FALSE)) {
if (MediaFeedsProviderWrapper::$currentExistingFile) {
$file->fid = MediaFeedsProviderWrapper::$currentExistingFile;
$file->is_new = FALSE;
}
}
}