问题描述
我有一个自定义帖子类型,可以接受 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。