// ==UserScript==
// @name Youtube 封面
// @name:en Youtube Cover
// @name:zh-CN Youtube 封面
// @namespace http://tampermonkey.net/
// @version 1.2.6
// @description 獲取影片封面!
// @description:en Get the cover of youtube video!
// @description:zh-CN 获取视频封面!
// @author Anong0u0
// @include *//www.youtube.com/*
// @grant GM_setValue
// @grant GM_getValue
// @noframes
// @downloadURL none
// ==/UserScript==
console.log("youtube Cover is loading");
(async () => // onStart
{
let tryTimes = 0;
while(true)
{
console.log("try load");
if(document.querySelector("#start")!=null)
{
load();
return;
}
if(++tryTimes>10) return;
await delay(300);
}
})();
function delay(ms = 0){return new Promise((r)=>{setTimeout(r, ms)})}
function getXY(element)
{
let x = 0, y = 0;
while (element)
{
x += element.offsetLeft - element.scrollLeft + element.clientLeft;
y += element.offsetTop - element.scrollLeft + element.clientTop;
element = element.offsetParent;
}
return {X: x, Y: y}
}
function checkImg(imgUrl)
{
return new Promise(function(resolve)
{
let img = new Image();
img.src = imgUrl;
img.onload = () => {resolve(img);}
})
}
function load()
{
var div = document.createElement("div");
div.innerHTML =`
`
document.querySelector("#start").append(div);
var preview = document.createElement("img");
preview.id = "preview";
preview.hidden = true;
document.body.append(preview);
var ytC = document.querySelector("#ytCover");
var ytLH = document.querySelector("#ytListHead");
var Btns = document.querySelectorAll(".linkBtn");
var previewBtn = document.querySelector(".list > button");
var Lang = { cover: {en:"Cover", tc:"封面", sc:"封面"},
preview: {en:"Preview", tc:"圖片預覽", sc:"图片预览"},
on: {en:"On", tc:"開", sc:"开"},
off: {en:"Off", tc:"關", sc:"关"}};
var usedLang;
if (document.querySelector("html").lang.indexOf("zh")!=-1)
{usedLang = document.querySelector("html").lang.indexOf("CN")!=-1?"sc":"tc";}
else
{usedLang = "en";}
ytC.innerText = Lang.cover[usedLang];
previewBtn.innerHTML = Lang.preview[usedLang] + previewBtn.innerHTML;
ytLH.style.width = usedLang=="en"?"10em":"10.4em";
window.onresize = () => {ytLH.style.left = (getXY(ytC).X/10-1)+"em";}
document.querySelectorAll(".list > .slide").forEach((e)=>
{
let list = e.querySelector(".list");
e.onmouseenter = () =>
{
list.style.top = (getXY(e).Y/10-0.5)+"em";
list.style.left = parseFloat(ytLH.style.left) + parseFloat(ytLH.style.width) + "em";
list.hidden = false;
};
e.onmouseleave = () => {list.hidden = true;}
});
Btns.forEach((e)=>
{
e.onmouseenter = () =>
{
if(!GM_getValue("previewOn")) return;
preview.hidden = false;
preview.src = e.href;
};
e.onmouseleave = () => {preview.hidden = true;}
e.target="_blank";
});
var previewSpan = document.querySelector("#previewSpan");
var previewBtnChange = () =>
{
if (GM_getValue("previewOn"))
{
previewSpan.style.color = "green";
previewSpan.innerText = Lang.on[usedLang];
}
else
{
previewSpan.style.color = "red";
previewSpan.innerText = Lang.off[usedLang];
}
};
previewBtnChange();
previewBtn.onclick = () =>
{
GM_setValue("previewOn", !GM_getValue("previewOn"));
previewBtnChange();
};
var hide;
ytC.onmouseenter = () =>
{
hide = false;
ytLH.hidden = false;
};
ytC.onmouseleave = async () =>
{
hide = true;
await delay(500);
ytLH.hidden = hide;
};
ytLH.onmouseenter = () =>
{
hide = false;
};
ytLH.onmouseleave = async () =>
{
hide = true;
await delay(200);
ytLH.hidden = hide;
};
var oldHref = null;
new MutationObserver(() => // onUrlChange
{
if (oldHref != document.location.href)
{
oldHref = document.location.href
let video_id = null;
window.location.search.replace("?","").split('&').forEach((s)=>{if(s.startsWith("v=")){video_id=s.replace("v=","")};});
ytC.hidden = (video_id == null);
if (video_id == null) return;
document.querySelectorAll(".list > .slide").forEach((e)=>
{
let tempBtns = e.querySelectorAll(".linkBtn");
if (e.getAttribute("tag")!="skip")
{
checkImg("https://i.ytimg.com/vi/" + video_id + "/" + e.getAttribute("tag") + "default.jpg").then((img)=>
{
e.hidden=!(img.width>120 && img.height>90);
if (img.width>120 && img.height>90)
{
checkImg("https://i.ytimg.com/vi/" + video_id + "/" + e.getAttribute("tag") + "1.jpg").then((img2)=>
{
if(img2.width<=120 && img2.height<=90)
{tempBtns.forEach((e2)=>{e2.hidden=(e2.getAttribute("imgTag").indexOf("default")==-1);});}
else
{tempBtns.forEach((e2)=>{e2.hidden=false});}
});
}
});
}
else
{
checkImg("https://i.ytimg.com/vi/" + video_id + "/mq1.jpg").then((img)=>
{
tempBtns.forEach((e2)=>{if(e2.getAttribute("imgTag").indexOf("default")==-1) e2.hidden=(img.width<=120 && img.height<=90);});
});
}
});
Btns.forEach((e)=>{e.href = "https://i.ytimg.com/vi/" + video_id + "/" + e.getAttribute("imgTag") + ".jpg";});
}
}).observe(document.body, {childList: true, subtree: true});
console.log("done");
}