Вы здесь

Как спарсить видео youtube в поле Файл с виджетом Media.

0

Добрый день!

Я пытаюсь спрасить сайт с видео youtube, но мне надо засунуть их в поле типа "файл", с виджетом Media и модулем Media: oEmbed.

Использую модуль Parser от великого xandeadx http://xandeadx.ru/blog/drupal/554.
В справке парсера к полю выдается подсказка что надо вернуть такое:

array(
  'file' => $file, // The file. (file, required)
)

Я с страницы выдираю URL видео, передлываю в короткую ссылку:


$url = $doc->find('.entry iframe')->attr('src'); $urlParts = parse_url($url); $videoId = explode('/', $urlParts['path']); return ['file' => "https://youtu.be/$videoId[2]"];

Но таким макаром не работает, в логах:

Файл "https://youtu.be/EsXIWbf1Z1c" закачан не будет, так как его тип "" не в списке допустимых.
Видимо для медия модуля есть хитрость, не сталкивались? Спасибо.

Версия Drupal: 
7.x
Категория: 
Field APIFile API
Вопрос задан 16.02.2016 - 15:54
Аватар пользователя Sora
Sora
92

Ответы

0

Сам спросил - сам ответил, пришлось немного поправить Parser, конкретно функцию _parser_prepare_field_file, захардкодил для себя

/**
 * Prepare field type "file"
 */
function _parser_prepare_field_file(&$result, $field_info, $field_instance, $entity, $job, $base_url) {
  if (isset($result['type'])){

    $file = $result['file'];

    $fileScheme = file_stream_wrapper_uri_normalize('oembed://' . drupal_encode_path($file));
    $fileObject = file_uri_to_object($fileScheme);

    $info = media_oembed_get_data($file);

    if (!empty($info['title'])) {
      $filename = truncate_utf8($info['title'], 255);
    }

    $fileObject->filename = $filename;

    $file = file_save($fileObject);
    $result['file'] = $file->fid;


  } else {

    if (!$result) {
      $result = NULL;
      return;
    }
    if (is_string($result)) {
      $result = array('file' => $result);
    }
    if (!$result['file']) {
      $result = NULL;
      return;
    }
    if (is_numeric($result['file'])) {
      return;
    }

    $file_url = parser_get_absolute_url($base_url, $result['file']);
    $file_name = _parser_get_file_name_from_url($file_url);
    $file_ext = _parser_get_file_extension_from_url($file_name);
    if (function_exists('transliteration_clean_filename')) {
      $file_name = transliteration_clean_filename($file_name);
    }
    if (drupal_strlen(pathinfo($file_name, PATHINFO_FILENAME)) > 64) {
      $file_name = drupal_substr($file_name, 0, 64) . '.' . $file_ext;
    }
    $dest_dir = file_field_widget_uri($field_info, $field_instance);
    file_prepare_directory($dest_dir, FILE_CREATE_DIRECTORY);

    $field_values = field_get_items($job->entity_type, $entity, $field_info['field_name']);
    if ($field_values) {
      foreach ($field_values as $field_value) {
        // If file already attached
        if ($field_value['filename'] == $file_name) {
          $result['file'] = $field_value['fid'];
          return;
        }
      }
    }

    // Validate by extensions
    $allowed_file_extensions = explode(' ', $field_instance['settings']['file_extensions']);
    if ($allowed_file_extensions && !in_array($file_ext, $allowed_file_extensions)) {
      _parser_watchdog('Файл "<i>' . check_plain($file_url) . '</i>" закачан не будет, так как его тип "<i>' . check_plain($file_ext) . '</i>" не в списке допустимых.');
      $result = NULL;
      return;
    }

    // Download file to cache
    $cache_uri = _parser_download_url_to_cache($file_url, $job->headers, FALSE);
    if (!$cache_uri) {
      $result = NULL;
      return;
    }

    // Copy file from cache to $dest_dir
    $file = _parser_copy_file($cache_uri, $dest_dir . '/' . $file_name);
    if ($file) {
      $result['file'] = $file->fid;
    }
    else {
      $result = NULL;
    }
  }

}

Ну а в настройках парсинга както так:

$url = $doc->find('.entry iframe')->attr('src');
$urlParts = parse_url($url);
$videoId = explode('/', $urlParts['path']);

$file .= "https://youtu.be/";
$file .= $videoId[2];

return ['file' => $file, 'type' => 'oembed'];

Сорри за не Друпал стайл кода, пишу редко для него сейчас, отвык :)

Ответ дан 16.02.2016 - 21:53
Аватар пользователя Sora
Sora
92
-3

Да было дело, великий и могучий OS :)

Ответ дан 17.02.2016 - 09:02