问题描述

我有一个自定义帖子类型,可以接受 YouTube 嵌入 HTML 片段,标题和精选图片。目前,我正在寻找特色图像的图像,但理想情况下,我可以根据视频网址自动下载和调整视频本身的第一帧,在保存过程中的视频。如果做得正确,我的帖子类型可能不需要链接,可以从中获取图像和嵌入代码。

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

我对于 WordPress 的开发非常新鲜,但是有些东西告诉我,我会研究一下钩子 (如果我正确理解这些) 。

最佳解决方法

嗨 @Jonathan Sampson:

虽然这并不完全是你所要求的,但实际上可能是一个可行的解决方案,它可以免费从 WordPress.com 感谢 @yoast 的推文,他今天上午引用了这篇博文:

基本上你可以使用 WordPress.com 的截图生成器 URL 在这种形式 (根据博客文章 Matt 似乎保佑免费使用):

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

所以从上面拿你的 URL:

然后 URL 编码,所以你可以使用截图生成器,你会得到一个这样的 URL(宽度为 400px):

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

当然,接下来是屏幕截图如何 (我复制了后代的屏幕截图,所以即使修改了 WordPress 服务也不会改变,而不是直接链接到服务来显示图像。) 不知道为什么它拍摄视频而不是整个页面,但视频更好的为您想要的:

当然,第一次 HTTP GET 请求 URL 时,它不会返回屏幕截图,因为 WordPress.com 的服务器需要首先捕获屏幕截图,这需要太多时间让您的 HTTP GET 请求等待。所以首先请求你的 HTTP GET 将被重定向到这个 URL:

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

该网址显示此图片:

但是,如果您在第一个 HTTP GET 请求后等待一分钟,并再次发出请求,您会发现您的屏幕截图。我的想法是,你想要做的是调用它来缓存它,等待下载它,然后在本地缓存在自己的服务器上,以尽量减少 WordPress.com 的服务器上的负载,所以他们不会重新思考提供免费的 (或者如果有足够的流量,他们甚至可以提供它作为付费服务,也可能添加付费 API 功能!)

附:顺便说一下,为了证明它在网页中实际工作的是直接从 WordPress.com 请求的截图。请注意,它可能与上面保存和链接的屏幕截图不同,或者已经有一段时间,因为有人看过这个页面,因此他们的缓存清楚,甚至可能是”Generating Preview” 图像。如果是这样,请稍等片刻,然后刷新此页面,并返回:

次佳解决方法

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

您提供查询”superman”(然后等待 (没有注意到它正在做某事)(因为唯一的用户)),然后单击你想发布的视频,点击生成代码,你有代码,我的网站上托管的大拇指,因为它下载这些在同一时间。该代码可以复制并粘贴到一个帖子中。

换句话说,如果你将代码放在一个函数调用中,它会返回一段代码,例如具有指向被添加到内容的视频的链接的 href 。指向本地下载的特色图像的链接。

这是你正在寻找的代码片段?我认为核心是:

检索更多结果的功能 (如果您只想在最终的代码中显示超过 1 个视频,而不是 1 个特定)

function retrieveMoreResults($key, $q, $start, $cache) {
$url = "http://googleajax.admincdn.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://googleajax.admincdn.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 是您的 Google API 密钥)(http://code.google.com/intl/nl-NL/more/)

IMHO 我认为其余的只是 「获取返回的东西,并将其添加到帖子的内容+将下载的缓存缩略图设置为特色?

附:引用 YouTube 视频时,IMHO 总是会在视频中发布缩略图,因为 YouTube 会删除较旧的视频,因此 YouTube 会出现丑陋的贴子。用你自己的拇指,至少图像永远在那里,所以以后你确实有一个线索你最近发布的东西。

第三种解决方法

我不知道我是否明白了你的意思,但是我发现了这个解决方法:

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

最好的祝福

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。