3

我们的网站包含一些 YouTube 视频列表,其缩略图链接到电影本身。我们从 YouTube API 获取缩略图 URL,并在 YouTube 服务器上就地热链接到它们。所以我们的图像标签看起来像:

<img src="http://i.ytimg.com/vi/o6CHqSN7O-o/2.jpg" alt="" width="133" height="78" />

问题是有时视频会被删除 - 缩略图也是如此。我们不知道什么时候会发生这种情况,我们的缩略图只是变成了破碎的图像。我们该如何处理呢?

有多种解决方案:

  • 下载缩略图并将它们存储在本地——当然,如果电影被删除,它将无法工作,但没关系,它会解释它已被删除,并且我们避免了损坏的图像。

  • 定期检查 API 以查看图像缩略图是否已更改 - 如果不再存在,请替换我们自己的“电影已删除”缩略图。这对 API 调用来说非常沉重!

  • 使用 JavaScript 替换损坏的图像(不太喜欢这个)

我们理想的解决方案是将 img src 指向 YouTube 上的某个位置,该位置会在电影放映时显示友好的“移动已删除”图像。然而,这似乎并不存在。

其他人处理过这个吗?谢谢!

4

2 回答 2

1

在服务器端从 YouTube 请求缩略图,将其保存到服务器上的缓存中,显示缓存的图像。这样,即使删除了原始缩略图,您的服务器上仍会保留该缩略图。每个视频只会请求一次缩略图。类似 PHP 的伪代码:

<?php
$filename = $this->get_thumbnail_filename_from_url($url); // any way to map an image URL into a filename - e.g. strip everything except [a-zA-Z0-9] from URL
if (!file_exists($cachedir . '/' . $filename)) {
   $filename = $this->get_image_from_web_save_to_cache($url,$cachedir); // makes a HTTP request to the URL, saves the returned image (if any) into cache
}
$filename = basename($filename);
echo "<img src=\"/cache/$filename\">"; // display your cached thumbnail
?>

一个陷阱:如果缩略图发生变化,您的缓存版本保持不变;不过,这不是 YT 视频的常见问题。这可以通过使缓存更智能来解决 - 但是您必须开始存储元数据(年龄,最大年龄,...)并处理 HTTP 缓存标头。缓存伪代码:

  • 对象在缓存中吗?
    • 如果是,缓存版本是否新鲜?(最大年龄等)
      • 如果有较新的远程版本(last-modified、etag 等),请下载并存储
  • 否则下载并存储远程版本
  • 如果“下载并存储”返回 404,则将图像更改为“已删除”
于 2010-05-05T09:17:53.620 回答
0

使用 PHP 请求文件,并且仅在 HTTP 响应代码为 200 时将缩略图放在那里。如果是 404 或其他错误,则放其他内容(由您决定)。

于 2010-05-05T08:57:16.140 回答