为缩略图自动检索YouTube图像?

时间:2010-11-27 作者:Sampson

我有一个自定义的帖子类型,它接受YouTube嵌入的HTML片段、标题和特色图片。目前,我正在为特色图片查找一幅图像,但理想情况下,在保存帖子的过程中,我可以根据视频URL自动下载视频的第一帧并调整其大小。如果做得好,我的帖子类型只需要链接,就可以从中获取图像和嵌入代码。

例如,如果视频链接http://www.youtube.com/watch?v=2Jnpi-uBiIg 将提取v的值,并用于下载http://img.youtube.com/vi/2Jnpi-uBiIg/0.jpg.

我对wordpress开发非常陌生,但有些事情告诉我,我将研究挂钩(如果我正确理解的话)。

3 个回复
SO网友:MikeSchinkel

你好@Jonathan Sampson:

虽然这并不完全是你想要的,但它实际上可能是一个可行的解决方案,而且它是从WordPress免费提供的。com感谢@yoast\'s今天早上在推特上引用了这篇博文:

  • An Automated Way to Take Screenshots of any Website – FreeMatt 似乎在祝福免费使用):

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

      然后是URL编码,这样您就可以使用屏幕截图生成器,您会得到一个如下URL(宽度为400px):

      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 GET将被重定向到此URL:

      • https://s.wordpress.com/wp-content/plugins/mshots/default.gif
      该URL显示此图像:

      Generating Preview Image from WordPress.com

      但是如果您在第一个HTTP GET请求后等待一分钟,然后再次发出请求,您将找到您的屏幕截图。我的想法是,您要做的是调用它来缓存它,等待下载它,然后在您自己的服务器上本地缓存它,以最小化WordPress上的负载量。com的服务器,这样他们就不会重新考虑免费提供这项服务了(或者见鬼,如果有足够的流量,他们甚至可以将其作为付费服务提供,还可以添加付费API功能!)

      P.S. 顺便说一下,为了证明它在网页中确实有效,这里有一个直接从WordPress请求的屏幕截图。com。请注意,它可能与我在上面保存和链接的屏幕截图不同,或者已经有一段时间没有人查看此页面了,因此他们的缓存很清楚,它甚至可能是“生成预览”图像。如果是,请等待一分钟,然后刷新此页面,它将返回:

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

SO网友:edelwater

我的视频博客帖子生成器(http://v.leau.co/)这样做,但不在wp上下文中。

您提供一个查询,例如“superman”(然后等待(不知道它正在做什么)(因为im是唯一的用户)),然后单击您想发布的视频,单击生成代码,您就有了拇指所在的代码,因为它同时下载了这些代码。此代码可以复制并粘贴到帖子中。

换句话说,如果您将代码放入函数调用中,它将返回一段代码,例如a href,其中包含添加到内容中的视频链接,或本地下载的特色图像链接。

这就是你要找的代码吗?我认为核心是:

用于检索更多结果的函数(因此,如果您只想在结果代码中显示多个视频,而不是一个特定的视频):

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;  
}
($键是您的Google API键)(http://code.google.com/intl/nl-NL/more/)

我怎么认为剩下的更多的只是“获取返回的内容并将其添加到帖子的内容中+将下载的缓存拇指设置为特色?”?

P、 在提到YouTube视频时,最好在视频中发布缩略图,因为老视频通常会被YouTube删除,结果会留下难看的帖子。用你自己的大拇指,至少图像会永远留在那里,这样之后你就可以知道你最初在那里发布了什么。

SO网友:t31os

函数根据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 但我喜欢从交替服务器获取图像的想法,因此我对该函数进行了编码,从4个服务器中随机选择一个来显示图像。

NOTE: 并不是每个视频的每个大小都有一个图像,有些只是空白,但是默认图像似乎在我测试的视频URL中始终有效。

如果有帮助,请告诉我。。

结束

相关推荐