media.inc in Migrate Extras 7.2
File
media.incView source
<?php
/**
* Destination class implementing migration into media entities.
*/
class MigrateDestinationMedia extends MigrateDestinationFile {
/**
* Call this from the prepare() method of a migration that contains media
* image files, if you want to rewrite the IMG tags into media references.
*
* @param $entity
* Entity object being built.
* @param $field
* Name of the text field within the entity to be modified. Defaults to 'body'.
*/
public static function rewriteImgTags($entity, $field = 'body') {
if (is_array($entity->{$field})) {
migrate_instrument_start('MigrateDestinationMedia rewriteImgTags');
foreach ($entity->{$field} as $language => $values) {
$body = $values[0]['value'];
break;
}
// Quickly skip any non-candidates
if (!stristr($body, '<img')) {
migrate_instrument_stop('MigrateDestinationMedia rewriteImgTags');
return;
}
// Pass full img tags into the callback
$new_body = preg_replace_callback('|<img [^>]*>|i', array(
self,
'replaceCallback',
), $body);
$entity->{$field}[$language][0]['value'] = $new_body;
migrate_instrument_stop('MigrateDestinationMedia rewriteImgTags');
}
}
/**
* If a referenced image can be found in the files table, replace the <img> tag
* with a media JSON reference.
*
* @param array $matches
*/
protected static function replaceCallback(array $matches) {
$src_matches = array();
// Default to the original <img> tag
$result = $matches[0];
// Extract the src parameter
if (preg_match('|src=[\'"]([^\'"]+)[\'"]|i', $matches[0], $src_matches)) {
// Replace the scheme and host portions of the referenced URI with the
// Drupal scheme as it's saved in the file_unmanaged table
$src = $src_matches[1];
$fid = db_select('file_managed', 'f')
->fields('f', array(
'fid',
))
->condition('filename', basename($src))
->execute()
->fetchField();
if ($fid) {
$image_info = array(
'type' => 'media',
'view_mode' => 'media_large',
'fid' => $fid,
'attributes' => array(
'alt' => '',
'title' => '',
'class' => 'media-image',
'typeof' => 'foaf:Image',
'wysiwyg' => 1,
),
);
// Get the height and width parameters if present
preg_match('|width=[\'"]([^\'"]+)[\'"]|i', $matches[0], $width);
preg_match('|height=[\'"]([^\'"]+)[\'"]|i', $matches[0], $height);
// image width
if ($width) {
$image_info['attributes']['width'] = $width[1];
}
// image height
if ($height) {
$image_info['attributes']['height'] = $height[1];
}
$result = '[[' . drupal_json_encode($image_info) . ']]';
}
}
return $result;
}
}
/**
* Class for creating Youtube file entities.
*/
class MigrateExtrasFileYoutube implements MigrateFileInterface {
/**
* Implementation of MigrateFileInterface::fields().
*
* @return array
*/
public static function fields() {
return array();
}
/**
* Implementation of MigrateFileInterface::processFiles().
*
* @param $value
* The URI or local filespec of a file to be imported.
* @param $owner
* User ID (uid) to be the owner of the file.
* @return object
* The file entity being created or referenced.
*/
public function processFile($value, $owner) {
// Convert the Youtube URI into a local stream wrapper.
if (class_exists('MediaInternetYouTubeHandler')) {
$handler = new MediaInternetYouTubeHandler($value);
$destination = $handler
->parse($value);
$file = file_uri_to_object($destination, TRUE);
}
elseif (class_exists('MediaInternetOEmbedHandler')) {
$handler = new MediaInternetOEmbedHandler($value);
$file = $handler
->getFileObject();
}
else {
MigrationBase::displayMessage(t('Could not find a handler for YouTube videos'));
return FALSE;
}
// Create a file entity object for this Youtube reference, and see if we
// can get the video title.
if (empty($file->fid) && ($info = $handler
->getOEmbed())) {
$file->filename = truncate_utf8($info['title'], 255);
}
$file = file_save($file);
if (is_object($file)) {
return $file;
}
else {
return FALSE;
}
}
}
// Basic support for the deprecated media field type.
class MigrateMediaFieldHandler extends MigrateFileFieldHandler {
public function __construct() {
$this
->registerTypes(array(
'media',
));
}
/**
* Implementation of MigrateFieldHandler::fields().
*
* @param $type
* The field type.
* @param $instance
* Instance info for the field.
* @param Migration $migration
* The migration context for the parent field. We can look at the mappings
* and determine which subfields are relevant.
* @return array
*/
public function fields($type, $instance, $migration = NULL) {
$fields = parent::fields($type, $instance, $migration);
unset($fields['description']);
unset($fields['display']);
$fields += array(
'title' => t('Subfield: String to be used as the title value'),
'data' => t('Subfield: Additional data about the field'),
);
return $fields;
}
}
Classes
Name | Description |
---|---|
MigrateDestinationMedia | Destination class implementing migration into media entities. |
MigrateExtrasFileYoutube | Class for creating Youtube file entities. |
MigrateMediaFieldHandler |