Автополучить изображение YouTube для миниатюры?

У меня есть пользовательский тип сообщения, который признает, что YouTube встраивает отрывок HTML, заголовок и известное изображение. В настоящее время я иду и нахожу изображение для известного изображения, но идеально я смог бы автоматически загрузить и изменить размер первого кадра самого видео на основе видео URL во время процесса сохранения самого сообщения. При правильной организации мой тип сообщения мог потребовать не чего иного как ссылки и мог получить изображение и код для встраивания от этого.

Например, если бы видеосвязью является http://www.youtube.com/watch?v=2Jnpi-uBiIg, значение v извлекалось бы и использовалось бы для загрузки изображения по http://img.youtube.com/vi/2Jnpi-uBiIg/0.jpg.

Я очень плохо знаком с разработкой Wordpress, но что-то мне подсказывает, что я изучил бы рычаги (если я понимаю их правильно).

6
27.11.2010, 05:01
4 ответа

Мой генератор сообщения видеоблога (http://v.leau.co/) делает это, но не в wp контексте.

Вы предоставляете запрос, например, "супермен" (затем ожидают (без уведомления, что оно делает что-то) (так как я - единственный пользователь)), затем нажмите vids, который Вам нравится отправлять, нажимать, генерируют код, и у Вас есть код, где ползунки размещаются на моем сайте, потому что оно загрузило их в это время. Этот код может быть копией и вставляемый в сообщении.

Другими словами, при помещении кода в вызов функции, он возвратил бы часть кода, например, href со ссылкой на видео, которое добавляется к содержанию или например, ссылка на известное изображение, которое загружается локально.

Это - часть кода, который Вы ищете? Я думаю, что ядро:

Функция для получения большего количества результатов (следовательно, если Вы просто хотите отобразить больше чем 1 видео в получающемся коде вместо 1 определенного):

function retrieveMoreResults($key, $q, $start, $cache) {
$url = "http://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=" . $q . "&rsz=large&start=" . $start. "&key=" . $key;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
$responseData = json_decode($body, true);   
$tempOutputString .= display($responseData, $cache, $q);
return $tempOutputString;
}

Функция для получения начальной страницы результатов:

function retrieveResults($key, $q, $cache) {    
# first call
$url = "http://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=" . $q . "&rsz=large&key=" . $key;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
$responseData = json_decode($body, true);   
$tempOutputString = "";
$tempOutputString .= display($responseData, $cache, $q);

$boolFirstRequest = true;
foreach ($responseData["responseData"]["cursor"]["pages"] as $GsearchResultClass) { 
    $start = $GsearchResultClass["start"];
    if ($boolFirstRequest) {
        $boolFirstRequest = false;
    } else {
        $tempOutputString .= retrieveMoreResults($key, $q, $start, $cache);
    }
}
return $tempOutputString;
}

Функция для отображения загружает ползунки в определенном каталоге (переменная) и возвратить часть кода, чтобы вставить сообщение:

function display($responseData, $cache, $tag) {
$strBuffer="";

foreach ($responseData["responseData"]["results"] as $GsearchResultClass) {

    #
    # there are YouTube urls and also Google Video urls they are both different
    # the one from Google video has the word "ThumbnailServer" in it
    # example:
    # youtube: http://1.gvt0.com/vi/6jKzr143K8U/default.jpg
    # video.google: http://3.gvt0.com/ThumbnailServer2?app=vss&contentid=7efbd69963e4cc67&offsetms=30000&itag=w160&hl=en&sigh=J6N1fv_It6H5jJWX51fKt-eYqNk
    #
    $thumbId="";
    $imageThumb=$GsearchResultClass["tbUrl"];
    if (strstr($imageThumb, 'ThumbnailServer')) {
        $imgStringBits = explode('&',$imageThumb);
        $parsedImgStr=strstr($imgStringBits[1],'=');
        $parsedImgStr = substr($parsedImgStr,1);
        $thumbId = $parsedImgStr;
    } else {
        $imgStringBits = explode('/',$imageThumb);
        $thumbId = $imgStringBits[4];
    }
    $imgFile=$cache . "/" . $thumbId . ".jpg";

    #
    # Now that we have the imageFile Name check if we already have it in the cache:
    # - if we have it NEVER delete it (why should we?)
    # - if we dont well... get it via curl
    #
    if (!file_exists($imgFile)) {
        $ch = curl_init ();
        $timeout = 5;
        curl_setopt ($ch, CURLOPT_USERAGENT,  'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
        curl_setopt ($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt ($ch, CURLOPT_URL, $imageThumb);
        curl_setopt ($ch, CURLOPT_HEADER, false);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt ($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt ($ch, CURLOPT_VERBOSE, 1);
        $rawdata = curl_exec ($ch);
        curl_close ($ch);
        if($rawdata) {          
            $fp = fopen($imgFile, 'w');
            fwrite($fp, $rawdata);
            fclose($fp);
        } else {
            #
            # If our Curl action retrieves nothing then use the default image
            #
            $imgfile="images/default.jpg";
        }
    }

    #
    # Now that we have the image url create a div (hmm.. might drop that
    # styling later on in a seperate csss) containg the video thumb, link
   # and the description. When you like it you can add all the other
    # parameters that Google returns like length etc...
    #
    $strBuffer .=  "<div style=\"float:left;width:125px;height:130px;font-size:8px;font-family:arial;\" class=\"thumb\"><div>";
    $strBuffer .=  "<a href=\"#\" class=\"del\" id=\"$thumbId\"> ADD</a><br />";                
    $strBuffer .=  "<a href=\"" .  $GsearchResultClass["playUrl"]  .    "\" target=\"_blank\">";
    $strBuffer .=  "<img src=\"" . $imgFile . "\" alt=\"" . $GsearchResultClass["title"] . "\" border=\"0\" width=\"120\">";
    $strBuffer .=  "</a><br />\n";
    #
    # Note that we also add a delete option, for now that only removes it from the page
    # but in the next version it should do an AJAX call to write the id somewhere so
    # that we never see it again.
    #
    $strBuffer .= $GsearchResultClass["titleNoFormatting"] . "<br />";
    $strBuffer .= "</div></div>\n";
}
return $strBuffer;
}

Функция для вызова вышеупомянутого:

function moviePage($tag, $cacheName, $cacheTime, $key) { 
$cache = $cacheName . "/" . $tag;
checkCache($cache);
cleanCacheHTML($cache);

$filename = $tag . ".html";
$spFile=$cache . "/" . $filename;

if (file_exists($spFile) && filemtime($spFile) > $cacheTime ) {
    $strBuffer = file_get_contents($spFile) . "<!-- " . $spFile . " from cache -->";
} else {                    
    $strBuffer = retrieveResults($key, $tag, $cache);
}
$strBuffer .=  "<br clear=\"all\">";
$fp = fopen($spFile, 'w');
fwrite($fp, $strBuffer);
fclose($fp);

return $strBuffer;  
}

($key - Вы ключ API Google) (http://code.google.com/intl/nl-NL/more/)

По моему скромному мнению, я думаю, что остальное - более справедливое "получение возвращенного материала и добавление его к содержанию сообщения + установка загруженного кэшируемого ползунка, как показано?

P.S. По моему скромному мнению, всегда лучше отправить миниатюру в видео при обращении к видео YouTube, так как часто более старые видео удалены YouTube, и они оставляют ужасные регистрации в результате. С Вашими собственными ползунками, по крайней мере, изображение остается там навсегда так, чтобы впоследствии у Вас действительно была подсказка, что Вы отправили там первоначально.

3
19.02.2020, 22:04
  • 1
    большой ответ! Что относительно того, если Вы создали пользовательское поле для пользователя для ввода исходного URL для видео, и наличие его выполняют загрузку изображения / локальная ссылка изображения после сохранения сообщения? Один заключительный шаг был бы то, что при обновлении сообщения с новым URL, что старое изображение удалено и новое добавляется/связывается. Если бы Вы могли бы расширить свой код с помощью этого, я думаю, что это было бы очень полезно для читателей. –  NetConstructor.com 29.11.2010, 19:53
  • 2
    да..., но я - слишком занятый lol, за 2 недели у меня есть отпуск... –  edelwater 29.11.2010, 22:43

Привет @Jonathan Sampson:

В то время как это не точно, что Вы попросили его, могло бы на самом деле быть эффективное решение, и это прибывает бесплатно из WordPress.com благодаря твиту @yoast этим утром, когда он сослался на это сообщение в блоге:

В основном можно использовать WordPress.com' URL генератора снимка экрана в этой форме (который согласно сообщению в блоге Matt, казалось, благословлял бесплатное использование):

  • https://s.wordpress.com/mshots/v1/{URL-encoded URL}?w={width}

Так беря Ваш URL сверху:

И затем URL, кодирующий, таким образом, Вы могли использовать с генератором снимка экрана, Вы получаете URL, который похож на это (для ширины 400 пкс):

https://s.wordpress.com/mshots/v1/http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D2Jnpi-uBiIg?w=400

И конечно то, что следует, - то, на что снимок экрана похож (я скопировал снимок экрана для потомства, таким образом, это не изменится, даже если сервис WordPress будет изменен, а не включайте прямую ссылку на сервис для отображения изображения.) Не уверенный, почему это привязало видео и не всю страницу, но видео еще лучше для того, что Вы хотите:

Screenshot of a Youtube Video as snapped by WordPress Screenshot Service
(источник: mikeschinkel.com)

Конечно, в первый раз Вы HTTP-запрос GET URL это не возвратит снимок экрана, потому что серверы WordPress.com должны сначала получить снимок экрана, который занимает слишком много времени, чтобы позволить Вашему HTTP-запросу GET ожидать. Таким образом по первому запросу Ваш HTTP ДОБИРАЕТСЯ, будет просто перенаправлен к этому URL:

  • https://s.wordpress.com/wp-content/plugins/mshots/default.gif

И тот URL отображает это изображение:

Generating Preview Image from WordPress.com

Но если Вы будете ожидать спустя минуту после Вашего первого HTTP-запроса GET и будете выпускать запрос снова, то Вы найдете свой снимок экрана. Мои мысли - то, что то, что Вы захотите сделать, должно назвать его, чтобы кэшировать его, ожидать, чтобы загрузить его и затем кэшировать его локально на Вашем собственном сервере для уменьшения объема нагрузки на серверы WordPress.com, таким образом, они не заново продумают предложение этого бесплатно (или heck, если будет достаточно трафика, который они могли бы даже предложить ему как заплаченный сервис и возможно добавить заплаченные опции API также!)

P.S. Между прочим, чтобы доказать, что это на самом деле работает в веб-странице вот, снимок экрана согласно просьбе непосредственно из WordPress.com. Обратите внимание, что это может отличаться от снимка экрана, который я сохранил и связал выше, или это это было некоторое время, так как кто-то просмотрел эту страницу, и таким образом их кэш имеет ясный, что это могло бы даже быть "Генерирующееся изображение" Предварительного просмотра. Если так, ожидайте минута и затем обновите эту страницу, и она должна возвратиться:

Screenshot of a Youtube Video directly from WordPress.com Screenshot service

6
19.02.2020, 22:04
  • 1
    Это выглядит полезным.. Достаточно ярмарка :) –  t31os 23.12.2010, 16:06

Я не знаю, понял ли я exactaly, что Вы имеете в виду, но я нашел это обходное решение:

http://wpworks.wordpress.com/2010/12/23/display-youtube-thumbnail-with-wordpress-custom-field/

С уважением

2
19.02.2020, 22:04
  • 1
    @Alvaro Neto - Это на самом деле довольно прохладно, и не что-то, что я знал. Слишком плохо у них только, кажется, есть крошечные миниатюры с тем методом. –  MikeSchinkel 23.12.2010, 14:53

Функция для отображения изображения на основе URL? Действительно ли это - вид вещи, которую Вы имели в виду?

function get_youtube_screen( $url = '', $type = 'default', $echo = true ) {
    if( empty( $url ) )
        return false;

    if( !isset( $type ) )
        $type = '';

    $url = esc_url( $url );

    preg_match("|[\\?&]v=([^&#]*)|",$url,$vid_id);

    if( !isset( $vid_id[1] ) )
        return false;

    $img_server_num =  'i'. rand(1,4);

    switch( $type ) {
        case 'large':
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/0.jpg\" />";
            break;
        case 'first':
            // Thumbnail of the first frame
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/1.jpg\" />";
            break;
        case 'small':
            // Thumbnail of a later frame(i'm not sure how they determine this)
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/2.jpg\" />";
            break;
        case 'default':
        case '':
        default:
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/default.jpg\" />";
            break;
    }
    if( $echo )
        echo $img;
    else
        return $img;

}
// Example calls

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'default' );

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'large' );

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'small' );

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'first' );

YouTube, кажется, подает изображения для нескольких серверов для миниатюр..

iN.ytimg.com

Откуда N обычно является числовым значением 1-4 (5 иногда, но не было последовательно в тестировании).

Они также используют img.youtube.com но мне понравилась идея выбрать с переменных серверов, таким образом, я кодировал функцию, чтобы случайным образом принять решение из 1 из 4 серверов отобразить изображение от.

Примечание: Существует не всегда изображение для каждого из размеров для каждого видео, некоторые просто подойдут пробел, однако изображение по умолчанию, кажется, последовательно работает в видео URL, которые я протестировал.

Сообщите мне, помогает ли это..

1
19.02.2020, 22:04
  • 1
    Хороший ответ, +1. Это было большим вопросом; 4 совершенно других ответа и все по-видимому очень допустимые решения. Я просто люблю WA! –  MikeSchinkel 24.12.2010, 15:19
  • 2
    я смотрел на встроить класс и доступные фильтры, но я не мог видеть простой способ нести изображение от встроить объекта (который действительно на самом деле содержит URL изображения) к функциям shortcode, которые производят HTML, встроить объект, в настоящее время не делает (насколько я видел), передают данные, необходимые доступным фильтрам/рычагам. Не уверенный, почему встроить класс не проводит информацию об изображении (что это имеет), имел бы смысл к действительно.. –  t31os 27.12.2010, 14:43

Теги

Похожие вопросы