开发者

Drupal 7 - create node programatically, adding a youtube embed to a field

I'm trying to create nodes programatically. Using Media module with the youtube extension, I'd开发者_运维知识库 like to populate a field with youtube data. From what I've read so far, it's going to look something like this:

   <?php
    // $value in this case is the youtube ID.
    $file = new stdClass();
      $file->uid = 1;
      $file->filename = $value;
      $file->uri = 'youtube://v/' . $value;
      $file->filemime =  'video/youtube';
      $file->type = 'video';
      $file->status = 1;
      $youtube = file_save($file);

    node->field_youtube[$node->language]['0']['fid'] = (array) $youtube->fid;
    ?>

I learned this by looking at the information in the $content variable in the bartik theme. However, this results in a "Bad file extension" error. I also tried putting the whole url in $file->uri and using file_get_mimetype on it, then it didn't throw an error but the video didn't work either. Does anyone know how to do this?


I found the answer. The function file_save only checks if a file id is already in the database. However, the youtube uri field did not allow duplicates. Therefore I stole this function from the file_example module. It checks if a file exists with that uri, if it does it loads the object.

function file_example_get_managed_file($uri) {
  $fid = db_query('SELECT fid FROM {file_managed} WHERE uri = :uri', array(':uri' => $uri))->fetchField();
  if (!empty($fid)) {
    $file_object = file_load($fid);
    return $file_object;
  }
  return FALSE;
}

So in the end I simply put an if statement, like this:

$file_exists = wthm_get_managed_file('youtube://v/' . $value);
if (!$file_exists) {
  $file_path = drupal_realpath('youtube://v/' . $value);
  $file = new stdClass();
    $file->uid = 1;
    $file->filename = $value;
    $file->uri = 'youtube://v/' . $value;
    $file->filemime = file_get_mimetype($file_path);
    $file->type = 'video';
    $file->status = 1;
  $file_exists = file_save($file);
}
$node->field_youtube[$node->language]['0'] = (array) $file_exists;  

This solved most problems. I still get a message saying bad file extension, but it works anyway.


I got it working like this. I'm importing embed codes that need to be parsed and some are dupes, and i think this function file_uri_to_object($code, $use_existing = TRUE) allows you to reuse managed urls. $r->video is an iframe embed code for youtube which gets parsed to the correct uri format

  // include the media youtube handler.inc file to use the embed code parsing
    $path = drupal_get_path('module','media_youtube').'/includes/MediaInternetYouTubeHandler.inc';      
    require_once($path);
    $code = MediaInternetYouTubeHandler::parse($r->video);  
    $youtube = file_uri_to_object($code, $use_existing = TRUE);
    $youtube->display = 1;
    $youtube = file_save($youtube);
    $node->field_video[$lang][0] = (array)$youtube;
    node_save($node); 


A nicer way:

    module_load_include('inc', 'media_youtube', 'includes/MediaInternetYouTubeHandler.inc');
    $obj = new MediaInternetYouTubeHandler($url);
    $file = $obj->getFileObject();
    $file->display = 1;
    file_save($file);
    $product->field_product_video[LANGUAGE_NONE][] = (array) $file;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜