当视频被拍摄下来时,如何优雅地处理YouTube缩略图损坏的图像?

当视频被拍摄下来时,如何优雅地处理YouTube缩略图损坏的图像?,youtube,youtube-api,Youtube,Youtube Api,我们的网站包含一些YouTube视频列表,它们的缩略图链接到电影本身。我们从YouTube API获取缩略图URL,并在YouTube服务器上原位热链接到它们。所以我们的图像标签看起来像: <img src="http://i.ytimg.com/vi/o6CHqSN7O-o/2.jpg" alt="" width="133" height="78" /> 问题是,有时视频会被删除,缩略图也会被删除。我们不知道什么时候会发生这种情况,我们的缩略图会变成破碎的图像。我们如何处理这

我们的网站包含一些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上的某个位置,当电影放映时,该位置将显示友好的“移动删除”图像。然而,这似乎并不存在


还有其他人处理过吗?谢谢

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

从服务器端的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缓存头。缓存伪代码:

  • 对象是否在缓存中?
    • 如果是,缓存的版本是否新鲜?(最大年龄等)
      • 如果有较新的远程版本(上次修改、etag等),请下载并存储
  • else下载并存储远程版本
  • 如果“下载并存储”返回404,则将图像更改为“已删除”

在某些情况下,这绝对是个好主意。对于我们来说,这可能有点重——如果一个页面上有100个视频,那么每次加载页面时,我们都会请求每个缩略图。或者我们可以对其进行批处理并定期检查,但这与定期使用API检查没有太大区别。谢谢你的主意,我的概念对了吗?有没有办法避免所有这些调用?我认为这与下载缩略图并将其存储在本地非常接近,正如我在第一个选项中所描述的那样。这对于避免损坏图像非常有效,但如果视频被删除,它不会更新,这会很好。@mrjf:是的,就是这样。不幸的是,保持缩略图的更新非常重要,因为它需要一个更复杂的缓存系统(如我在下面的编辑代码中所述:“如果我们最近没有这样做,只检查这个缩略图”)。即使如此,您仍然会不时收到过时的数据。