获取 YouTube 封面

刚刚打开论坛看到这个帖子: 获取 B 站封面

正好之前稍微研究了一下获取YouTube封面。以下:

一、

并非每个YouTube视频都包含全部九个缩略图。另外,缩略图的图像大小取决于视频。

保证有七个缩略图:

| Thumbnail Name      | Size (px) | URL                                              |
|---------------------|-----------|--------------------------------------------------|
| Player Background   | 480x360   | https://i1.ytimg.com/vi/<VIDEO ID>/0.jpg         |
| Start               | 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/1.jpg         |
| Middle              | 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/2.jpg         |
| End                 | 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/3.jpg         |
| High Quality        | 480x360   | https://i1.ytimg.com/vi/<VIDEO ID>/hqdefault.jpg |
| Medium Quality      | 320x180   | https://i1.ytimg.com/vi/<VIDEO ID>/mqdefault.jpg |
| Normal Quality      | 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/default.jpg   |

此外,其他两个缩略图可能存在也可能不存在。它们的存在可能取决于视频是否是高质量的。

| Thumbnail Name      | Size (px) | URL                                                  |
|---------------------|-----------|------------------------------------------------------|
| Standard Definition | 640x480   | https://i1.ytimg.com/vi/<VIDEO ID>/sddefault.jpg     |
| Maximum Resolution  | 1920x1080 | https://i1.ytimg.com/vi/<VIDEO ID>/maxresdefault.jpg |

以上所有 URL 都可以通过 HTTP 使用。此外,主机名http://img.youtube.com可以代替http://i3.ytimg.com上面的示例 URL。

二、网页

1、https://thumbnailsave.com/

三、小书签(复制到浏览器书签栏,即点即用)

javascript:(function(){document.location.href=document.location.href.replace('www.youtube.com/watch?v=','i1.ytimg.com/vi/')+'/maxresdefault.jpg'})();

参考:YouTube数据API(v3)

https://stackoverflow.com/quest

按照您的描述,如果最大尺寸的封面不一定存在,那这个只试图获取最大尺寸封面的小书签就不严谨。

然后小书签中对参数的替换,如果网址中存在其他参数也会产生错误。

我就把这两个细节给完善了一下,但简单测试下来发现,直接获取 maxresdefault 图片就会返回能够返回的最大尺寸封面,所以我自以为的严谨很可能是毫无必要的。(测试不充分,约等于猜测。

代码如下,欢迎探讨。

javascript:(function(){
  const suffix = ['maxresdefault', 'sddefault', 'hqdefault'];
  const getCover = (index=0)=>{
    const img = new Image();
    const coverUrl = window.location.search.replace(/(?:\?|&)v=(\w+)/,'https://i1.ytimg.com/vi/$1/')+suffix[index]+'.jpg';
    img.onload = ()=> window.location.href = coverUrl;
    img.onerror = ()=> getCover(++index);
    img.src = coverUrl;
  };
  getCover();
})()