Как изящно обрабатывать сломанные миниатюры YouTube при снятии видео? - PullRequest
3 голосов
/ 05 мая 2010

Наш сайт содержит несколько списков видео YouTube с их миниатюрами, связанными с самими фильмами. Мы извлекаем миниатюрные URL-адреса из API YouTube и размещаем на них прямые ссылки на серверах YouTube. Таким образом, наши теги изображений выглядят так:

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

Проблема в том, что иногда удаляют видео - как и миниатюру. Мы не знаем, когда это может произойти, и наши эскизы просто превращаются в разбитые изображения. Как мы можем справиться с этим?

Существует несколько решений:

  • Скачивайте миниатюры и сохраняйте их локально - конечно, фильм не будет работать, если он будет удален, но это нормально, он объяснит, что он был удален, и мы избежим испорченного изображения.

  • Периодически проверяйте с помощью API, чтобы увидеть, изменился ли эскиз изображения - если он больше не существует, замените наш собственный эскиз "фильм удален". Это довольно тяжело при вызове API!

  • Используйте JavaScript для замены поврежденных изображений (не очень нравится это)

Нашим идеальным решением было бы указать img src на YouTube, где будет отображаться удобное изображение «убрать с дороги», когда фильм выйдет из строя. Однако этого, похоже, не существует.

Кто-нибудь еще имел дело с этим? Спасибо!

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Запрос миниатюры с 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 все же. Это можно решить, сделав кэш более интеллектуальным, но вам придется начать хранить метаданные (age, max-age, ...) и работать с заголовками кэширования HTTP. Кэширующий псевдокод:

  • это объект в кеше?
    • если да, свежая ли кэшированная версия? (максимальный возраст и т. д.)
      • если имеется более новая удаленная версия (последняя модификация, etag и т. Д.), Загрузите и сохраните
  • еще скачать и сохранить удаленную версию
  • если «загрузить и сохранить» возвращает 404, изменить изображение на «удалено»
0 голосов
/ 05 мая 2010

Используйте PHP, чтобы запросить файл, и поместите миниатюру туда только, если код ответа HTTP равен 200. Если это 404 или какая-то другая ошибка, поместите что-нибудь еще (вы решаете).

...