Greasy Fork

Greasy Fork is available in English.

获取哔哩哔哩视频的封面图片 get bilibili cover image

在视频列表上以及视频播放页面,按 ctrl+鼠标右键 ,就会在新窗口打开这个视频的封面图

当前为 2017-06-22 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name		获取哔哩哔哩视频的封面图片 get bilibili cover image
// @namespace	http://saber.love/?p=3259
// @version		1.4.0
// @description	在视频列表上以及视频播放页面,按 ctrl+鼠标右键 ,就会在新窗口打开这个视频的封面图
// @author		雪见仙尊 xuejianxianzun
// @include		*://*bilibili.com/*
// @icon        http://saber.love/favicon.ico
// @license 	GNU General Public License version 3 https://www.gnu.org/licenses/gpl-3.0.en.html
// @icon 		https://www.bilibili.com/favicon.ico
// @run-at		document-end
// ==/UserScript==

// 获取触发右键菜单的元素
document.body.addEventListener("contextmenu", function(e) {
	var e = e || window.event;
	if (e.ctrlKey) {
		getCoverImage(e.target);
	}
});

// 判断是否含有当前class
var hasClass = (function() {
	var div = document.createElement("div");
	if ("classList" in div && typeof div.classList.contains === "function") {
		return function(elem, className) {
			return elem.classList.contains(className);
		};
	} else {
		return function(elem, className) {
			var classes = elem.className.split(/\s+/);
			for (var i = 0; i < classes.length; i++) {
				if (classes[i] === className) {
					return true;
				}
			}
			return false;
		};
	}
})();

var ownsName = ["scrollx", "groom-module", "card-live-module", "rank-item", "spread-module", "card-timing-module", "l-item", "v", "v-item", "anchor-card", "small-item"]; // 这里的class都是列表项本身
var parentsName = ["bm-v-list", "rlist"]; // 这里的class是列表项的父元素

function getCoverImage(element) {
	if (element.nodeName === "IMG") { // 当前元素是img的情况
		openCoverImage(element.src);
	} else if (element.nodeName === "BODY") { // 当前元素是body的情况
		// 尝试获取视频播放页的封面图
		var cover_image = document.body.querySelector("img.cover_image");
		if (!!cover_image) {
			openCoverImage(cover_image.src);
		}else{
			console.log("body,none");
		}
		return false;
	} else {
		var finded = false;
		// 测试当前元素是否符合要求
		for (var i = 0; i < ownsName.length; i++) {
			if (hasClass(element, ownsName[i])) {
				console.log(ownsName[i]);
				if (ownsName[i] === "anchor-card") { //anchor-card这个class是直播页面的
					if (!!element.style.backgroundImage) {
						openCoverImage(/\/\/.*(?=")/.exec(element.style.backgroundImage)[0]);
					} else {
						openCoverImage(/\/\/.*(?=")/.exec(element.querySelector(".room-cover").style.backgroundImage)[0]);
					}
				} else {
					openCoverImage(element.querySelector("img").src);
				}
				finded = true;
				break;
			}
		}
		// 测试父元素是否符合要求
		var parentNode = element.parentNode;
		for (var i = 0; i < parentsName.length; i++) {
			if (hasClass(parentNode, parentsName[i])) {
				// 获取父元素的子节点
				var childrens = parentNode.childNodes;
				for (var j = 0; j < childrens.length; j++) {
					if (childrens[j] === element) {
						openCoverImage(element.querySelector("img").src);
						finded = true;
						break;
					}
				}
			}
		}
		// 如果都没有找到,则返回父元素
		if (finded === false) {
			return getCoverImage(parentNode);
		}
	}
}

function openCoverImage(url) {
	var coverImageBigUrl = url;
	// 去除url中的裁剪标识
	if (url.indexOf("@") > -1) { //处理以@做裁剪标识的url
		coverImageBigUrl = url.split("@")[0];
	}
	if (url.indexOf("jpg_") > -1) { //处理以_做裁剪标识的url
		coverImageBigUrl = url.split("jpg_")[0] + "jpg"; //默认所有图片都是jpg格式的。如果不是jpg,则可能会出错
	}
	if (url.indexOf("png_") > -1) { //处理以_做裁剪标识的url
		coverImageBigUrl = url.split("png_")[0] + "png";
	}
	if (url.indexOf("/320_200/") > -1) { //有时裁剪标识是在后缀名之前的 目前主要发现的是“番剧”板块的列表里有,但尚不清楚其他地方的情况
		coverImageBigUrl = url.replace("/320_200", "");
	}
	window.open(coverImageBigUrl);
}