mutes and hides embedded/"hardcoded"/non skippable ad breaks on Pluto tv live channels
// ==UserScript==
// @name Pluto.tv auto mute'n'hide ads
// @namespace Violentmonkey Scripts
// @version 2.5
// @locale en
// @author mihau
// @supportURL https://greasyfork.org/en/scripts/535805-pluto-tv-auto-mute-n-hide-ads
// @license MIT
// @description mutes and hides embedded/"hardcoded"/non skippable ad breaks on Pluto tv live channels
// @match https://pluto.tv/gsa/live-tv*
// @grant none
// ==/UserScript==
// if you don't want to *hide* the ads while playing, change this from 1 to 0 :
let hidevid = 1;
// if you don't want to the audio to be unmuted and video to maximized (to full vieport width), change this from 1 to 0 :
let maximized = 1;
// best don't edit below this line
addEventListener("DOMContentLoaded", (event) => {
// via https://stackoverflow.com/questions/5525071/how-to-wait-until-an-element-exists
function waitforit(selector) {
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (document.querySelector(selector)) {
observer.disconnect();
resolve(document.querySelector(selector));
}
});
// If you get "parameter 1 is not of type 'Node'" error, see https://stackoverflow.com/a/77855838/492336
observer.observe(document.body, {
childList: true,
subtree: true
});
});
}
waitforit('.avia-container').then((elm) => {
go();
});
function go() {
const t = document.querySelector('meta[property="og:title"]').content.replace("Watch ","").replace(": Live TV Channel for Free | Pluto TV","")
const noads = document.createElement("div");
noads.style.display = "none";
noads.style.width = "100%";
noads.style.height = "100%";
noads.style.top = "0";
noads.style.left = "0";
noads.style.right = "0";
noads.style.bottom = "0";
noads.style.fontSize = "xx-large";
noads.style.position = "fixed";
noads.id = "noads";
noads.innerHTML = '<div style="position: relative; text-align: center; color: white;"><img src="' + document.querySelector('meta[property="og:image"]').content + '" style="width:100%;height: 100%"/>';
noads.innerHTML += '<div style="position: absolute; top: 15%; left: 15%; color: white; font: bold 150px arial,sans-serif;">AD<br />BREAK</div></div>';
document.body.appendChild(noads);
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
let v = document.getElementsByTagName("video")[0];
let x = document.getElementById("root");
let y = document.getElementById("modal-root");
if (document.querySelectorAll("[class^='adPodProgressIndicator']")[0].innerHTML != "") {
if (hidevid == 1) {
x.style.visibility="hidden";
y.style.visibility="hidden";
noads.style.display="block";
}
v.muted = true;
document.title = "AD BREAK: " + t;
} else {
if (hidevid == 1) {
x.style.visibility="visible";
y.style.visibility="visible";
noads.style.display="none";
}
v.muted = false;
document.title = t;
}
});
});
observer.observe(document.querySelector(".upper-right-stacked"), { childList: true, subtree: true });
setTimeout(function() {
if (maximized == 1) {
document.getElementsByClassName("fullbrowser-btn-atc")[0].click();
document.getElementsByClassName("unmute-btn-atc")[0].click();
}
document.title = t;
}, 1250);
}
})