SponsorBlock/content.js

365 lines
11 KiB
JavaScript
Raw Normal View History

2019-07-09 20:50:19 +02:00
if(id = getYouTubeVideoID(document.URL)){ // Direct Links
videoIDChange(id);
//tell background.js about this
chrome.runtime.sendMessage({
message: "ytvideoid",
videoID: id
});
2019-01-18 20:49:43 +01:00
}
2019-07-09 20:50:19 +02:00
//was sponsor data found when doing SponsorsLookup
var sponsorDataFound = false;
//the actual sponsorTimes if loaded and UUIDs associated with them
var sponsorTimes = undefined;
var UUIDs = undefined;
//the video
var v;
//the last time looked at (used to see if this time is in the interval)
var lastTime;
2019-01-18 20:49:43 +01:00
2019-07-10 03:44:41 +02:00
//the last time in the video a sponsor was skipped
//used for the go back button
var lastSponsorTimeSkipped = null;
//used for ratings
var lastSponsorTimeSkippedUUID = null;
2019-07-10 03:44:41 +02:00
//if showing the start sponsor button or the end sponsor button on the player
var showingStartSponsor = true;
//should the video controls buttons be added
var hideVideoPlayerControls = false;
//if the notice should not be shown
//happens when the user click's the "Don't show notice again" button
var dontShowNotice = false;
chrome.storage.local.get(["dontShowNoticeAgain"], function(result) {
let dontShowNoticeAgain = result.dontShowNoticeAgain;
if (dontShowNoticeAgain != undefined) {
dontShowNotice = dontShowNoticeAgain;
}
});
2019-01-18 20:59:34 +01:00
chrome.runtime.onMessage.addListener( // Detect URL Changes
2019-01-15 19:29:25 +01:00
function(request, sender, sendResponse) {
2019-07-09 23:03:44 +02:00
//message from background script
if (request.message == "ytvideoid") {
videoIDChange(request.id);
2019-01-15 19:29:25 +01:00
}
//messages from popup script
if (request.message == "sponsorStart") {
sponsorMessageStarted();
}
if (request.message == "isInfoFound") {
//send the sponsor times along with if it's found
sendResponse({
found: sponsorDataFound,
sponsorTimes: sponsorTimes
})
}
2019-07-09 21:55:33 +02:00
if (request.message == "getVideoID") {
2019-07-09 21:55:33 +02:00
sendResponse({
videoID: getYouTubeVideoID(document.URL)
})
}
if (request.message == "showNoticeAgain") {
dontShowNotice = false;
}
if (request.message == "toggleStartSponsorButton") {
toggleStartSponsorButton();
}
if (request.message == "changeVideoPlayerControlsVisibility") {
hideVideoPlayerControls = request.value;
updateVisibilityOfPlayerControlsButton();
}
2019-01-15 19:29:25 +01:00
});
function videoIDChange(id) {
//reset sponsor data found check
sponsorDataFound = false;
sponsorsLookup(id);
//see if the onvideo control image needs to be changed
chrome.runtime.sendMessage({
message: "getSponsorTimes",
videoID: id
}, function(response) {
if (response != undefined) {
let sponsorTimes = response.sponsorTimes;
if (sponsorTimes != undefined && sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
toggleStartSponsorButton();
}
}
});
//see if video control buttons should be added
chrome.storage.local.get(["hideVideoPlayerControls"], function(result) {
if (result.hideVideoPlayerControls != undefined) {
hideVideoPlayerControls = result.hideVideoPlayerControls;
}
updateVisibilityOfPlayerControlsButton();
});
}
2019-07-09 20:50:19 +02:00
function sponsorsLookup(id) {
2019-01-18 20:59:34 +01:00
v = document.querySelector('video') // Youtube video player
let xmlhttp = new XMLHttpRequest();
2019-07-09 20:50:19 +02:00
//check database for sponsor times
xmlhttp.open('GET', serverAddress + "/api/getVideoSponsorTimes?videoID=" + id, true);
2019-07-09 20:50:19 +02:00
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
2019-07-09 23:03:44 +02:00
sponsorDataFound = true;
2019-07-09 20:50:19 +02:00
2019-07-09 23:03:44 +02:00
sponsorTimes = JSON.parse(xmlhttp.responseText).sponsorTimes;
UUIDs = JSON.parse(xmlhttp.responseText).UUIDs;
2019-07-09 23:03:44 +02:00
// If the sponsor data exists, add the event to run on the videos "ontimeupdate"
v.ontimeupdate = function () {
sponsorCheck(sponsorTimes);
};
} else {
sponsorDataFound = false;
}
};
xmlhttp.send(null);
2018-06-23 16:06:18 +02:00
}
function sponsorCheck(sponsorTimes) { // Video skipping
//see if any sponsor start time was just passed
for (let i = 0; i < sponsorTimes.length; i++) {
//the sponsor time is in between these times, skip it
//if the time difference is more than 1 second, than the there was probably a skip in time,
// and it's not due to playback
if (Math.abs(v.currentTime - lastTime) < 1 && sponsorTimes[i][0] >= lastTime && sponsorTimes[i][0] <= v.currentTime) {
//skip it
v.currentTime = sponsorTimes[i][1];
lastSponsorTimeSkipped = sponsorTimes[i][0];
lastSponsorTimeSkippedUUID = UUIDs[i];
2019-07-10 03:44:41 +02:00
//send out the message saying that a sponsor message was skipped
openSkipNotice();
setTimeout(closeSkipNotice, 7000);
}
lastTime = v.currentTime;
}
}
2019-01-18 20:49:43 +01:00
2019-07-10 03:44:41 +02:00
function goBackToPreviousTime() {
if (lastSponsorTimeSkipped != null) {
//add a tiny bit of time to make sure it is not skipped again
v.currentTime = lastSponsorTimeSkipped + 0.001;
closeSkipNotice();
}
}
//Adds a sponsorship starts button to the player controls
2019-07-12 22:44:50 +02:00
function addPlayerControlsButton() {
if (document.getElementById("startSponsorButton") != null) {
//it's already added
return;
}
let startSponsorButton = document.createElement("button");
startSponsorButton.id = "startSponsorButton";
startSponsorButton.className = "ytp-button";
startSponsorButton.setAttribute("title", "Sponsor Starts Now");
2019-07-12 22:44:50 +02:00
startSponsorButton.addEventListener("click", startSponsorClicked);
let startSponsorImage = document.createElement("img");
startSponsorImage.id = "startSponsorImage";
startSponsorImage.style.height = "60%";
startSponsorImage.style.top = "0";
startSponsorImage.style.bottom = "0";
startSponsorImage.style.display = "block";
startSponsorImage.style.margin = "auto";
startSponsorImage.src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png");
//add the image to the button
startSponsorButton.appendChild(startSponsorImage);
let referenceNode = document.getElementsByClassName("ytp-right-controls")[0];
referenceNode.prepend(startSponsorButton);
}
function removePlayerControlsButton() {
document.getElementById("startSponsorButton").style.display = "none";
}
//adds or removes the player controls button to what it should be
function updateVisibilityOfPlayerControlsButton() {
if (hideVideoPlayerControls) {
removePlayerControlsButton();
} else {
addPlayerControlsButton();
}
}
2019-07-12 22:44:50 +02:00
function startSponsorClicked() {
toggleStartSponsorButton();
//send back current time with message
chrome.runtime.sendMessage({
message: "addSponsorTime",
time: v.currentTime
});
}
function toggleStartSponsorButton() {
if (showingStartSponsor) {
showingStartSponsor = false;
document.getElementById("startSponsorImage").src = chrome.extension.getURL("icons/PlayerStopIconSponsorBlocker256px.png");
} else {
showingStartSponsor = true;
document.getElementById("startSponsorImage").src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png");
}
2019-07-12 22:44:50 +02:00
}
//Opens the notice that tells the user that a sponsor was just skipped
function openSkipNotice(){
if (dontShowNotice) {
//don't show, return
return;
}
let noticeElement = document.createElement("div");
2019-07-10 20:43:14 +02:00
noticeElement.id = "sponsorSkipNotice";
noticeElement.className = "sponsorSkipObject";
2019-07-10 20:43:14 +02:00
let logoElement = document.createElement("img");
logoElement.id = "sponsorSkipLogo";
logoElement.src = chrome.extension.getURL("icons/LogoSponsorBlocker256px.png");
let noticeMessage = document.createElement("div");
2019-07-10 20:43:14 +02:00
noticeMessage.id = "sponsorSkipMessage";
noticeMessage.className = "sponsorSkipObject";
noticeMessage.innerText = "Hey, you just skipped a sponsor!";
let noticeInfo = document.createElement("p");
noticeInfo.id = "sponsorSkipInfo";
noticeInfo.className = "sponsorSkipObject";
2019-07-15 22:28:41 +02:00
noticeInfo.innerText = "This message will disapear in 7 seconds";
//thumbs up and down buttons
let voteButtonsContainer = document.createElement("div");
voteButtonsContainer.setAttribute("align", "center");
let upvoteButton = document.createElement("img");
upvoteButton.className = "sponsorSkipObject voteButton";
upvoteButton.src = chrome.extension.getURL("icons/upvote.png");
upvoteButton.addEventListener("click", upvote);
2019-07-15 22:28:41 +02:00
let downvoteButton = document.createElement("img");
downvoteButton.className = "sponsorSkipObject voteButton";
downvoteButton.src = chrome.extension.getURL("icons/downvote.png");
downvoteButton.addEventListener("click", downvote);
2019-07-15 22:28:41 +02:00
//add thumbs up and down buttons to the container
voteButtonsContainer.appendChild(upvoteButton);
voteButtonsContainer.appendChild(downvoteButton);
let buttonContainer = document.createElement("div");
2019-07-10 03:44:41 +02:00
buttonContainer.setAttribute("align", "center");
let goBackButton = document.createElement("button");
2019-07-10 20:43:14 +02:00
goBackButton.innerText = "Go back";
goBackButton.className = "sponsorSkipButton";
2019-07-10 03:44:41 +02:00
goBackButton.addEventListener("click", goBackToPreviousTime);
let hideButton = document.createElement("button");
hideButton.innerText = "Dismiss";
2019-07-10 20:43:14 +02:00
hideButton.className = "sponsorSkipButton";
2019-07-10 03:46:11 +02:00
hideButton.addEventListener("click", closeSkipNotice);
let dontShowAgainButton = document.createElement("button");
dontShowAgainButton.innerText = "Don't Show This Again";
2019-07-10 20:43:14 +02:00
dontShowAgainButton.className = "sponsorSkipDontShowButton";
dontShowAgainButton.addEventListener("click", dontShowNoticeAgain);
2019-07-10 03:44:41 +02:00
buttonContainer.appendChild(goBackButton);
2019-07-10 03:46:11 +02:00
buttonContainer.appendChild(hideButton);
buttonContainer.appendChild(document.createElement("br"));
2019-07-10 20:43:14 +02:00
buttonContainer.appendChild(document.createElement("br"));
buttonContainer.appendChild(dontShowAgainButton);
2019-07-10 03:44:41 +02:00
noticeElement.appendChild(logoElement);
2019-07-10 03:44:41 +02:00
noticeElement.appendChild(noticeMessage);
noticeElement.appendChild(noticeInfo);
2019-07-15 22:28:41 +02:00
noticeElement.appendChild(voteButtonsContainer);
2019-07-10 03:44:41 +02:00
noticeElement.appendChild(buttonContainer);
let referenceNode = document.getElementById("info");
if (referenceNode == null) {
//old YouTube
referenceNode = document.getElementById("watch-header");
}
referenceNode.prepend(noticeElement);
2019-01-18 20:49:43 +01:00
}
function upvote() {
vote(1);
}
function downvote() {
vote(0);
}
function vote(type) {
chrome.runtime.sendMessage({
message: "submitVote",
type: type,
UUID: lastSponsorTimeSkippedUUID
});
}
//Closes the notice that tells the user that a sponsor was just skipped
function closeSkipNotice(){
2019-07-10 03:44:41 +02:00
let notice = document.getElementById("sponsorSkipNotice");
if (notice != null) {
notice.remove();
}
}
function dontShowNoticeAgain() {
chrome.storage.local.set({"dontShowNoticeAgain": true});
dontShowNotice = true;
closeSkipNotice();
}
function sponsorMessageStarted() {
let v = document.querySelector('video');
//send back current time
chrome.runtime.sendMessage({
message: "time",
time: v.currentTime
});
//update button
toggleStartSponsorButton();
}
function getYouTubeVideoID(url) { // Returns with video id else returns false
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
var match = url.match(regExp);
return (match && match[7].length == 11) ? match[7] : false;
}