NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Picarto Thumbnail Refresh
// @namespace http://www.furaffinity.net/user/Maloo
// @description Want to keep up with other people in a multistream are doing, but don't want to use a bunch of bandwidth on it? This script refreshes the preview images on unplayed streams every 5 minutes, and paused streams every minute.
// @license MIT
// @include https://picarto.tv/*
// @exclude https://picarto.tv/communities*
// @exclude https://picarto.tv/
// @exclude https://picarto.tv/settings*
// @connect picarto.tv
// @version 0.4
// @grant GM.xmlHttpRequest
// @run-at document-end
// ==/UserScript==
var picUser = window.location.href.match(/\.tv\/([\w]*)/)[1];
var thumbnailUrl = "https://picarto.tv/process/channel_thumbnail?channel=";
//document.querySelector(".vjs-play-control").parentNode.parentNode.childNodes[1].style.backgroundImage.match(/"(.*)"/)[1];
var waitForPlayer = setInterval(function() {
if (document.querySelector(".vjs-play-control"))
{
thumbnailUrl = "https://picarto.tv/" + document.querySelector(".vjs-play-control").parentNode.parentNode.childNodes[1].style.backgroundImage.match(/"(.*=).*"/)[1];
GM.xmlHttpRequest({
method: "GET",
url: thumbnailUrl + picUser,
onload: function(response) {
//console.log("reqResp Follows");
//console.log(response.finalUrl);
thumbnailUrl = response.finalUrl.match(/^.*\//)[0];
}
});
clearInterval(waitForPlayer);
}
},50);
function addGlobalStyle(css) {
try {
var elmHead, elmStyle;
while (document.getElementsByTagName('head')[0] === null)
{
/*var ms;
ms = 10;
ms += new Date().getTime();
while (new Date() < ms){}*/
}
elmHead = document.getElementsByTagName('head')[0];
elmStyle = document.createElement('style');
elmStyle.type = 'text/css';
elmHead.appendChild(elmStyle);
elmStyle.innerHTML = css;
} catch (e) {
if (!document.styleSheets.length) {
document.createStyleSheet();
}
document.styleSheets[0].cssText += css;
}
}
function updateChanImage(buttonEl)
{
//console.log("UpdateChanImage Called");
var imgEl = buttonEl.parentNode.parentNode.childNodes[1];
var x = thumbnailUrl;
if (x.slice(-1) == "=")
{
x += imgEl.parentNode.parentNode.getAttribute("channel");
x += "#" + nocache;
}
else
{
x += imgEl.parentNode.parentNode.getAttribute("channel");
x += ".jpg?" + nocache;
}
if (imgEl.style.content === "none") updateFGImage(x, imgEl);
else updateBGImage(x, imgEl);
nocache = Math.round((new Date()).getTime() / 1000);
}
function updateBGImage(url, element)
{
//console.log("Updating bg image on " + url);
var img = new Image();
img.onload = function() {
element.style.backgroundImage = "url(\"" + url + "\")";
setTimeout(function() {element.style.content = "none"; }, 100);
}
img.src = url;
}
function updateFGImage(url, element)
{
//console.log("Updating fg image on " + url);
var img = new Image();
img.onload = function() {
setTimeout(function() { element.style.content = "url(\"" + url + "\")";}, 100);
}
img.src = url;
}
addGlobalStyle('.vjs-paused .vjs-poster.vjs-hidden {display: revert !important; background-color: transparent !important;}');
const now = new Date();
var nocache = Math.round(now.getTime() / 1000);
setTimeout(function() {
//document.querySelectorAll(".vjs-poster:not(.vjs-hidden)").forEach(element => {element.style.backgroundImage = element.style.backgroundImage.slice(0, -2) + "#0\")"});
setInterval(function(){
document.querySelectorAll(".vjs-play-control:not(.vjs-paused):not(.vjs-playing)").forEach(element => {updateChanImage(element);});
}, 300000);
setInterval(function(){
document.querySelectorAll(".vjs-paused.vjs-play-control").forEach(element => {updateChanImage(element);});
}, 60000);
}, 10000);