SponsorBlock/popup.js

1124 lines
42 KiB
JavaScript
Raw Normal View History

2019-08-01 05:17:40 +02:00
//make this a function to allow this to run on the content page
async function runThePopup() {
localizeHtmlPage();
2019-08-20 01:21:19 +02:00
//is it in the popup or content script
var inPopup = true;
if (chrome.tabs == undefined) {
2020-01-09 18:12:49 +01:00
//this is on the content script, use direct communication
chrome.tabs = {};
chrome.tabs.sendMessage = function(id, request, callback) {
messageListener(request, null, callback);
}
//add a dummy query method
chrome.tabs.query = function(config, callback) {
callback([{
url: document.URL,
id: -1
}]);
}
inPopup = false;
2019-08-20 01:21:19 +02:00
}
2019-08-01 05:17:40 +02:00
2020-01-08 04:59:50 +01:00
await wait(() => SB.config !== undefined);
2019-08-20 01:21:19 +02:00
["sponsorStart",
// Top toggles
2019-08-20 01:21:19 +02:00
"whitelistChannel",
"unwhitelistChannel",
"disableSkipping",
"enableSkipping",
2019-12-30 23:37:02 +01:00
// Options
"showNoticeAgain",
"optionsButton",
// More controls
2019-08-20 01:21:19 +02:00
"clearTimes",
"submitTimes",
"reportAnIssue",
// sponsorTimesContributions
"sponsorTimesContributionsContainer",
"sponsorTimesContributionsDisplay",
"sponsorTimesContributionsDisplayEndWord",
// sponsorTimesViewsDisplay
"sponsorTimesViewsContainer",
"sponsorTimesViewsDisplay",
"sponsorTimesViewsDisplayEndWord",
// sponsorTimesOthersTimeSaved
"sponsorTimesOthersTimeSavedContainer",
"sponsorTimesOthersTimeSavedDisplay",
"sponsorTimesOthersTimeSavedEndWord",
// sponsorTimesSkipsDone
"sponsorTimesSkipsDoneContainer",
"sponsorTimesSkipsDoneDisplay",
"sponsorTimesSkipsDoneEndWord",
// sponsorTimeSaved
"sponsorTimeSavedContainer",
"sponsorTimeSavedDisplay",
"sponsorTimeSavedEndWord",
2019-08-20 01:21:19 +02:00
// discordButtons
"discordButtonContainer",
"hideDiscordButton",
// submitTimesInfoMessage
"submitTimesInfoMessageContainer",
"submitTimesInfoMessage",
// Username
"setUsernameContainer",
"setUsernameButton",
"setUsernameStatusContainer",
"setUsernameStatus",
"setUsername",
"usernameInput",
"submitUsername",
// More
"submissionSection",
"mainControls",
"loadingIndicator",
"videoFound",
"sponsorMessageTimes",
"downloadedSponsorMessageTimes",
].forEach(id => SB[id] = document.getElementById(id));
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//setup click listeners
SB.sponsorStart.addEventListener("click", sendSponsorStartMessage);
SB.whitelistChannel.addEventListener("click", whitelistChannel);
SB.unwhitelistChannel.addEventListener("click", unwhitelistChannel);
SB.disableSkipping.addEventListener("click", () => toggleSkipping(true));
SB.enableSkipping.addEventListener("click", () => toggleSkipping(false));
2019-08-20 01:21:19 +02:00
SB.clearTimes.addEventListener("click", clearTimes);
SB.submitTimes.addEventListener("click", submitTimes);
SB.showNoticeAgain.addEventListener("click", showNoticeAgain);
SB.setUsernameButton.addEventListener("click", setUsernameButton);
SB.submitUsername.addEventListener("click", submitUsername);
SB.optionsButton.addEventListener("click", openOptions);
SB.reportAnIssue.addEventListener("click", reportAnIssue);
SB.hideDiscordButton.addEventListener("click", hideDiscordButton);
2019-08-20 01:21:19 +02:00
//if true, the button now selects the end time
let startTimeChosen = false;
//the start and end time pairs (2d)
let sponsorTimes = [];
//current video ID of this tab
let currentVideoID = null;
//see if discord link can be shown
2020-01-08 04:59:50 +01:00
let hideDiscordLink = SB.config.hideDiscordLink;
if (hideDiscordLink == undefined || !hideDiscordLink) {
let hideDiscordLaunches = SB.config.hideDiscordLaunches;
//only if less than 10 launches
if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) {
SB.discordButtonContainer.style.display = null;
if (hideDiscordLaunches == undefined) {
hideDiscordLaunches = 1;
2019-08-01 05:17:40 +02:00
}
2020-01-08 04:59:50 +01:00
SB.config.hideDiscordLaunches = hideDiscordLaunches + 1;
}
}
//show proper disable skipping button
2020-01-08 04:59:50 +01:00
let disableSkipping = SB.config.disableSkipping;
if (disableSkipping != undefined && disableSkipping) {
SB.disableSkipping.style.display = "none";
SB.enableSkipping.style.display = "unset";
}
//if the don't show notice again variable is true, an option to
2019-08-20 01:21:19 +02:00
// disable should be available
2020-01-08 04:59:50 +01:00
let dontShowNotice = SB.config.dontShowNotice;
if (dontShowNotice != undefined && dontShowNotice) {
SB.showNoticeAgain.style.display = "unset";
}
2019-08-20 01:21:19 +02:00
//get the amount of times this user has contributed and display it to thank them
2020-01-08 04:59:50 +01:00
if (SB.config.sponsorTimesContributed != undefined) {
if (SB.config.sponsorTimesContributed > 1) {
SB.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Sponsors");
} else {
SB.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Sponsor");
}
SB.sponsorTimesContributionsDisplay.innerText = SB.config.sponsorTimesContributed;
SB.sponsorTimesContributionsContainer.style.display = "unset";
2019-08-20 01:21:19 +02:00
2020-01-08 04:59:50 +01:00
//get the userID
let userID = SB.config.userID;
if (userID != undefined) {
//there are probably some views on these submissions then
//get the amount of views from the sponsors submitted
sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
let viewCount = JSON.parse(xmlhttp.responseText).viewCount;
if (viewCount != 0) {
if (viewCount > 1) {
SB.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
} else {
SB.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segment");
2019-08-20 01:21:19 +02:00
}
2020-01-08 04:59:50 +01:00
SB.sponsorTimesViewsDisplay.innerText = viewCount;
SB.sponsorTimesViewsContainer.style.display = "unset";
}
}
});
2020-01-08 04:59:50 +01:00
//get this time in minutes
sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(xmlhttp) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
let minutesSaved = JSON.parse(xmlhttp.responseText).timeSaved;
if (minutesSaved != 0) {
if (minutesSaved != 1) {
SB.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
} else {
SB.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minLower");
}
2020-01-08 04:59:50 +01:00
SB.sponsorTimesOthersTimeSavedDisplay.innerText = getFormattedHours(minutesSaved);
SB.sponsorTimesOthersTimeSavedContainer.style.display = "unset";
}
}
});
}
2020-01-08 04:59:50 +01:00
}
2020-01-08 04:59:50 +01:00
//get the amount of times this user has skipped a sponsor
if (SB.config.skipCount != undefined) {
if (SB.config.skipCount != 1) {
SB.sponsorTimesSkipsDoneEndWord.innerText = chrome.i18n.getMessage("Sponsors");
} else {
SB.sponsorTimesSkipsDoneEndWord.innerText = chrome.i18n.getMessage("Sponsor");
}
2020-01-08 04:59:50 +01:00
SB.sponsorTimesSkipsDoneDisplay.innerText = SB.config.skipCount;
SB.sponsorTimesSkipsDoneContainer.style.display = "unset";
}
2020-01-08 04:59:50 +01:00
//get the amount of time this user has saved.
if (SB.config.minutesSaved != undefined) {
if (SB.config.minutesSaved != 1) {
SB.sponsorTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
} else {
SB.sponsorTimeSavedEndWord.innerText = chrome.i18n.getMessage("minLower");
}
2020-01-08 04:59:50 +01:00
SB.sponsorTimeSavedDisplay.innerText = getFormattedHours(SB.config.minutesSaved);
SB.sponsorTimeSavedContainer.style.display = "unset";
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
chrome.tabs.query({
active: true,
currentWindow: true
}, onTabs);
2019-08-20 01:21:19 +02:00
function onTabs(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
2019-08-20 01:21:19 +02:00
if (result != undefined && result.videoID) {
2019-08-12 23:28:07 +02:00
currentVideoID = result.videoID;
loadTabData(tabs);
2019-08-20 01:21:19 +02:00
} else if (result == undefined && chrome.runtime.lastError) {
2019-08-12 23:28:07 +02:00
//this isn't a YouTube video then, or at least the content script is not loaded
displayNoVideo();
2019-08-20 01:21:19 +02:00
}
});
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
function loadTabData(tabs) {
if (!currentVideoID) {
//this isn't a YouTube video then
displayNoVideo();
return;
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//load video times for this video
2020-01-08 04:59:50 +01:00
let sponsorTimesStorage = SB.config.sponsorTimes.get(currentVideoID);
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) {
startTimeChosen = true;
SB.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
2019-08-20 01:21:19 +02:00
}
2020-01-08 04:59:50 +01:00
sponsorTimes = sponsorTimesStorage;
displaySponsorTimes();
//show submission section
SB.submissionSection.style.display = "unset";
showSubmitTimesIfNecessary();
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//check if this video's sponsors are known
chrome.tabs.sendMessage(
tabs[0].id,
{message: 'isInfoFound'},
infoFound
);
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
function infoFound(request) {
if(chrome.runtime.lastError) {
//This page doesn't have the injected content script, or at least not yet
displayNoVideo();
return;
}
//if request is undefined, then the page currently being browsed is not YouTube
if (request != undefined) {
//this must be a YouTube video
//set letiable
isYouTubeTab = true;
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//remove loading text
SB.mainControls.style.display = "unset"
SB.loadingIndicator.style.display = "none";
2019-07-29 05:52:32 +02:00
2019-08-20 01:21:19 +02:00
if (request.found) {
SB.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
2019-08-20 01:21:19 +02:00
displayDownloadedSponsorTimes(request);
} else {
SB.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
}
}
2019-08-20 01:21:19 +02:00
//see if whitelist button should be swapped
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: 'isChannelWhitelisted'},
function(response) {
if (response.value) {
SB.whitelistChannel.style.display = "none";
SB.unwhitelistChannel.style.display = "unset";
2019-12-18 00:32:20 +01:00
SB.downloadedSponsorMessageTimes.innerText = chrome.i18n.getMessage("channelWhitelisted");
2019-08-20 01:21:19 +02:00
SB.downloadedSponsorMessageTimes.style.fontWeight = "bold";
}
});
}
2019-08-01 05:17:40 +02:00
);
2019-08-20 01:21:19 +02:00
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
function sendSponsorStartMessage() {
//the content script will get the message if a YouTube page is open
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{from: 'popup', message: 'sponsorStart'},
startSponsorCallback
);
});
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
function startSponsorCallback(response) {
let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
if (sponsorTimes[sponsorTimesIndex] == undefined) {
sponsorTimes[sponsorTimesIndex] = [];
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time;
2020-01-01 20:20:14 +01:00
2019-08-20 01:21:19 +02:00
let localStartTimeChosen = startTimeChosen;
2020-01-01 20:20:14 +01:00
SB.config.sponsorTimes.set(currentVideoID, sponsorTimes);
2019-08-20 01:21:19 +02:00
//send a message to the client script
if (localStartTimeChosen) {
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: "sponsorDataChanged"}
);
});
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
updateStartTimeChosen();
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//display video times on screen
displaySponsorTimes();
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//show submission section
SB.submissionSection.style.display = "unset";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
showSubmitTimesIfNecessary();
}
2019-08-20 01:21:19 +02:00
//display the video times from the array
function displaySponsorTimes() {
//remove all children
while (SB.sponsorMessageTimes.firstChild) {
SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild);
}
2019-08-20 01:21:19 +02:00
//add sponsor times
SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes));
}
//display the video times from the array at the top, in a different section
function displayDownloadedSponsorTimes(request) {
if (request.sponsorTimes != undefined) {
//set it to the message
if (SB.downloadedSponsorMessageTimes.innerText != chrome.i18n.getMessage("channelWhitelisted")) {
SB.downloadedSponsorMessageTimes.innerText = getSponsorTimesMessage(request.sponsorTimes);
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//add them as buttons to the issue reporting container
let container = document.getElementById("issueReporterTimeButtons");
for (let i = 0; i < request.sponsorTimes.length; i++) {
let sponsorTimeButton = document.createElement("button");
sponsorTimeButton.className = "warningButton popupElement";
2019-08-20 01:21:19 +02:00
let extraInfo = "";
if (request.hiddenSponsorTimes.includes(i)) {
//this one is hidden
extraInfo = " (hidden)";
}
2019-08-20 01:21:19 +02:00
sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]) + extraInfo;
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
let votingButtons = document.createElement("div");
let UUID = request.UUIDs[i];
//thumbs up and down buttons
let voteButtonsContainer = document.createElement("div");
voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID;
voteButtonsContainer.setAttribute("align", "center");
voteButtonsContainer.style.display = "none"
let upvoteButton = document.createElement("img");
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
upvoteButton.className = "voteButton popupElement";
upvoteButton.src = chrome.extension.getURL("icons/upvote.png");
upvoteButton.addEventListener("click", () => vote(1, UUID));
let downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
downvoteButton.className = "voteButton popupElement";
downvoteButton.src = chrome.extension.getURL("icons/downvote.png");
downvoteButton.addEventListener("click", () => vote(0, UUID));
//add thumbs up and down buttons to the container
voteButtonsContainer.appendChild(document.createElement("br"));
voteButtonsContainer.appendChild(document.createElement("br"));
voteButtonsContainer.appendChild(upvoteButton);
voteButtonsContainer.appendChild(downvoteButton);
//add click listener to open up vote panel
sponsorTimeButton.addEventListener("click", function() {
voteButtonsContainer.style.display = "unset";
});
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
container.appendChild(sponsorTimeButton);
container.appendChild(voteButtonsContainer);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//if it is not the last iteration
if (i != request.sponsorTimes.length - 1) {
container.appendChild(document.createElement("br"));
container.appendChild(document.createElement("br"));
}
}
2019-08-01 05:17:40 +02:00
}
}
2019-08-20 01:21:19 +02:00
//get the message that visually displays the video times
function getSponsorTimesMessage(sponsorTimes) {
let sponsorTimesMessage = "";
for (let i = 0; i < sponsorTimes.length; i++) {
for (let s = 0; s < sponsorTimes[i].length; s++) {
let timeMessage = getFormattedTime(sponsorTimes[i][s]);
//if this is an end time
if (s == 1) {
timeMessage = " to " + timeMessage;
} else if (i > 0) {
//add commas if necessary
timeMessage = ", " + timeMessage;
}
sponsorTimesMessage += timeMessage;
}
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
return sponsorTimesMessage;
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//get the message that visually displays the video times
//this version is a div that contains each with delete buttons
function getSponsorTimesMessageDiv(sponsorTimes) {
// let sponsorTimesMessage = "";
let sponsorTimesContainer = document.createElement("div");
sponsorTimesContainer.id = "sponsorTimesContainer";
for (let i = 0; i < sponsorTimes.length; i++) {
let currentSponsorTimeContainer = document.createElement("div");
currentSponsorTimeContainer.id = "sponsorTimeContainer" + i;
currentSponsorTimeContainer.className = "sponsorTime popupElement";
let currentSponsorTimeMessage = "";
let deleteButton = document.createElement("span");
deleteButton.id = "sponsorTimeDeleteButton" + i;
deleteButton.innerText = "Delete";
deleteButton.className = "mediumLink popupElement";
let index = i;
deleteButton.addEventListener("click", () => deleteSponsorTime(index));
let previewButton = document.createElement("span");
previewButton.id = "sponsorTimePreviewButton" + i;
previewButton.innerText = "Preview";
previewButton.className = "mediumLink popupElement";
previewButton.addEventListener("click", () => previewSponsorTime(index));
let editButton = document.createElement("span");
editButton.id = "sponsorTimeEditButton" + i;
editButton.innerText = "Edit";
editButton.className = "mediumLink popupElement";
editButton.addEventListener("click", () => editSponsorTime(index));
for (let s = 0; s < sponsorTimes[i].length; s++) {
let timeMessage = getFormattedTime(sponsorTimes[i][s]);
//if this is an end time
if (s == 1) {
timeMessage = " to " + timeMessage;
} else if (i > 0) {
//add commas if necessary
timeMessage = timeMessage;
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
currentSponsorTimeMessage += timeMessage;
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
currentSponsorTimeContainer.innerText = currentSponsorTimeMessage;
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
sponsorTimesContainer.appendChild(currentSponsorTimeContainer);
sponsorTimesContainer.appendChild(deleteButton);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//only if it is a complete sponsor time
if (sponsorTimes[i].length > 1) {
sponsorTimesContainer.appendChild(previewButton);
sponsorTimesContainer.appendChild(editButton);
2019-08-12 18:02:01 +02:00
2019-08-20 01:21:19 +02:00
currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index));
}
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
return sponsorTimesContainer;
}
2019-08-20 01:21:19 +02:00
function previewSponsorTime(index) {
let skipTime = sponsorTimes[index][0];
2019-08-20 01:21:19 +02:00
if (document.getElementById("startTimeMinutes" + index) != null) {
//edit is currently open, use that time
2019-08-12 18:26:52 +02:00
2019-08-20 01:21:19 +02:00
skipTime = getSponsorTimeEditTimes("startTime", index);
2019-08-20 01:21:19 +02:00
//save the edit
saveSponsorTimeEdit(index, false);
}
2019-08-20 01:21:19 +02:00
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id, {
message: "skipToTime",
time: skipTime - 2
}
);
});
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
function editSponsorTime(index) {
if (document.getElementById("startTimeMinutes" + index) != null) {
//already open
return;
}
2019-08-20 01:21:19 +02:00
//hide submit button
document.getElementById("submitTimesContainer").style.display = "none";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//the button to set the current time
let startTimeNowButton = document.createElement("span");
startTimeNowButton.id = "startTimeNowButton" + index;
startTimeNowButton.innerText = "(Now)";
startTimeNowButton.className = "tinyLink popupElement";
startTimeNowButton.addEventListener("click", () => setEditTimeToCurrentTime("startTime", index));
2019-08-20 01:21:19 +02:00
//get sponsor time minutes and seconds boxes
let startTimeMinutes = document.createElement("input");
startTimeMinutes.id = "startTimeMinutes" + index;
startTimeMinutes.className = "sponsorTime popupElement";
startTimeMinutes.type = "text";
startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]);
startTimeMinutes.style.width = "45px";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
let startTimeSeconds = document.createElement("input");
startTimeSeconds.id = "startTimeSeconds" + index;
startTimeSeconds.className = "sponsorTime popupElement";
startTimeSeconds.type = "text";
startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]);
startTimeSeconds.style.width = "60px";
2019-08-20 01:21:19 +02:00
let endTimeMinutes = document.createElement("input");
endTimeMinutes.id = "endTimeMinutes" + index;
endTimeMinutes.className = "sponsorTime popupElement";
endTimeMinutes.type = "text";
endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]);
endTimeMinutes.style.width = "45px";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
let endTimeSeconds = document.createElement("input");
endTimeSeconds.id = "endTimeSeconds" + index;
endTimeSeconds.className = "sponsorTime popupElement";
endTimeSeconds.type = "text";
endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]);
endTimeSeconds.style.width = "60px";
2019-08-20 01:21:19 +02:00
//the button to set the current time
let endTimeNowButton = document.createElement("span");
endTimeNowButton.id = "endTimeNowButton" + index;
endTimeNowButton.innerText = "(Now)";
endTimeNowButton.className = "tinyLink popupElement";
endTimeNowButton.addEventListener("click", () => setEditTimeToCurrentTime("endTime", index));
let colonText = document.createElement("span");
colonText.innerText = ":";
let toText = document.createElement("span");
toText.innerText = " to ";
//remove all children to replace
while (sponsorTimeContainer.firstChild) {
sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild);
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
sponsorTimeContainer.appendChild(startTimeNowButton);
sponsorTimeContainer.appendChild(startTimeMinutes);
sponsorTimeContainer.appendChild(colonText);
sponsorTimeContainer.appendChild(startTimeSeconds);
sponsorTimeContainer.appendChild(toText);
sponsorTimeContainer.appendChild(endTimeMinutes);
sponsorTimeContainer.appendChild(colonText);
sponsorTimeContainer.appendChild(endTimeSeconds);
sponsorTimeContainer.appendChild(endTimeNowButton);
//add save button and remove edit button
let saveButton = document.createElement("span");
saveButton.id = "sponsorTimeSaveButton" + index;
saveButton.innerText = "Save";
saveButton.className = "mediumLink popupElement";
saveButton.addEventListener("click", () => saveSponsorTimeEdit(index));
let editButton = document.getElementById("sponsorTimeEditButton" + index);
let sponsorTimesContainer = document.getElementById("sponsorTimesContainer");
sponsorTimesContainer.replaceChild(saveButton, editButton);
}
2019-08-20 01:21:19 +02:00
function setEditTimeToCurrentTime(idStartName, index) {
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: "getCurrentTime"},
function (response) {
let minutes = document.getElementById(idStartName + "Minutes" + index);
let seconds = document.getElementById(idStartName + "Seconds" + index);
2019-08-20 01:21:19 +02:00
minutes.value = getTimeInMinutes(response.currentTime);
seconds.value = getTimeInFormattedSeconds(response.currentTime);
});
});
2019-08-20 01:21:19 +02:00
}
2019-08-20 01:21:19 +02:00
//id start name is whether it is the startTime or endTime
//gives back the time in seconds
function getSponsorTimeEditTimes(idStartName, index) {
let minutes = document.getElementById(idStartName + "Minutes" + index);
let seconds = document.getElementById(idStartName + "Seconds" + index);
2019-08-20 01:21:19 +02:00
return parseInt(minutes.value) * 60 + parseFloat(seconds.value);
2019-08-12 18:26:52 +02:00
}
2019-08-20 01:21:19 +02:00
function saveSponsorTimeEdit(index, closeEditMode = true) {
sponsorTimes[index][0] = getSponsorTimeEditTimes("startTime", index);
sponsorTimes[index][1] = getSponsorTimeEditTimes("endTime", index);
//save this
2020-01-01 20:20:14 +01:00
SB.config.sponsorTimes.set(currentVideoID, sponsorTimes);
2019-08-20 01:21:19 +02:00
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: "sponsorDataChanged"}
);
});
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
if (closeEditMode) {
displaySponsorTimes();
showSubmitTimesIfNecessary();
}
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//deletes the sponsor time submitted at an index
function deleteSponsorTime(index) {
//if it is not a complete sponsor time
if (sponsorTimes[index].length < 2) {
chrome.tabs.query({
active: true,
currentWindow: true
}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
message: "changeStartSponsorButton",
showStartSponsor: true,
uploadButtonVisible: false
});
});
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
resetStartTimeChosen();
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
sponsorTimes.splice(index, 1);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//save this
2020-01-01 20:20:14 +01:00
SB.config.sponsorTimes.set(currentVideoID, sponsorTimes);
2019-08-20 01:21:19 +02:00
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: "sponsorDataChanged"}
);
});
//update display
displaySponsorTimes();
//if they are all removed
if (sponsorTimes.length == 0) {
//update chrome tab
chrome.tabs.query({
active: true,
currentWindow: true
}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
message: "changeStartSponsorButton",
showStartSponsor: true,
uploadButtonVisible: false
});
});
//hide submission section
document.getElementById("submissionSection").style.display = "none";
}
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
function clearTimes() {
//send new sponsor time state to tab
if (sponsorTimes.length > 0) {
chrome.tabs.query({
active: true,
currentWindow: true
}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
message: "changeStartSponsorButton",
showStartSponsor: true,
uploadButtonVisible: false
});
});
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//reset sponsorTimes
sponsorTimes = [];
2020-01-01 20:20:14 +01:00
SB.config.sponsorTimes.set(currentVideoID, sponsorTimes);
2019-08-20 01:21:19 +02:00
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: "sponsorDataChanged"}
);
});
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
displaySponsorTimes();
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//hide submission section
document.getElementById("submissionSection").style.display = "none";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
resetStartTimeChosen();
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
function submitTimes() {
//make info message say loading
SB.submitTimesInfoMessage.innerText = chrome.i18n.getMessage("Loading");
SB.submitTimesInfoMessageContainer.style.display = "unset";
if (sponsorTimes.length > 0) {
chrome.runtime.sendMessage({
message: "submitTimes",
videoID: currentVideoID
}, function(response) {
if (response != undefined) {
if (response.statusCode == 200) {
//hide loading message
SB.submitTimesInfoMessageContainer.style.display = "none";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
clearTimes();
} else {
document.getElementById("submitTimesInfoMessage").innerText = getErrorMessage(response.statusCode);
2019-08-20 01:21:19 +02:00
document.getElementById("submitTimesInfoMessageContainer").style.display = "unset";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
SB.submitTimesInfoMessageContainer.style.display = "unset";
}
}
});
2019-08-01 05:17:40 +02:00
}
}
2019-08-20 01:21:19 +02:00
function showNoticeAgain() {
SB.config.dontShowNotice = false;
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
SB.showNoticeAgain.style.display = "none";
}
2019-08-20 01:21:19 +02:00
function updateStartTimeChosen() {
//update startTimeChosen letiable
if (!startTimeChosen) {
startTimeChosen = true;
SB.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
} else {
resetStartTimeChosen();
}
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//set it to false
function resetStartTimeChosen() {
startTimeChosen = false;
2019-08-23 20:22:16 +02:00
SB.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorStart");
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//hides and shows the submit times button when needed
function showSubmitTimesIfNecessary() {
//check if an end time has been specified for the latest sponsor time
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) {
//show submit times button
document.getElementById("submitTimesContainer").style.display = "unset";
} else {
//hide submit times button
document.getElementById("submitTimesContainer").style.display = "none";
}
}
//make the options div visible
function openOptions() {
2020-01-13 21:08:06 +01:00
chrome.runtime.sendMessage({"message": "openConfig"});
2019-08-20 01:21:19 +02:00
}
2019-08-13 05:20:35 +02:00
2019-08-20 01:21:19 +02:00
//make the options username setting option visible
function setUsernameButton() {
//get username from the server
sendRequestToServer("GET", "/api/getUsername?userID=" + SB.config.userID, function (xmlhttp, error) {
2019-08-20 01:21:19 +02:00
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
SB.usernameInput.value = JSON.parse(xmlhttp.responseText).userName;
2019-08-20 01:21:19 +02:00
SB.submitUsername.style.display = "unset";
SB.usernameInput.style.display = "unset";
2019-08-20 01:21:19 +02:00
SB.setUsernameContainer.style.display = "none";
SB.setUsername.style.display = "unset";
SB.setUsernameStatusContainer.style.display = "none";
} else if (xmlhttp.readyState == 4) {
2019-08-20 01:21:19 +02:00
SB.setUsername.style.display = "unset";
SB.submitUsername.style.display = "none";
SB.usernameInput.style.display = "none";
SB.setUsernameStatusContainer.style.display = "unset";
SB.setUsernameStatus.innerText = getErrorMessage(xmlhttp.status);
2019-08-20 01:21:19 +02:00
}
});
}
2019-08-13 05:20:35 +02:00
2019-08-20 01:21:19 +02:00
//submit the new username
function submitUsername() {
//add loading indicator
SB.setUsernameStatusContainer.style.display = "unset";
SB.setUsernameStatus.innerText = "Loading...";
2019-08-13 05:20:35 +02:00
2019-08-20 01:21:19 +02:00
//get the userID
sendRequestToServer("POST", "/api/setUsername?userID=" + SB.config.userID + "&username=" + SB.usernameInput.value, function (xmlhttp, error) {
2019-08-20 01:21:19 +02:00
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
//submitted
SB.submitUsername.style.display = "none";
SB.usernameInput.style.display = "none";
2019-08-13 05:20:35 +02:00
SB.setUsernameStatus.innerText = chrome.i18n.getMessage("success");
} else if (xmlhttp.readyState == 4) {
SB.setUsernameStatus.innerText = getErrorMessageI(xmlhttp.status);
2019-08-20 01:21:19 +02:00
}
});
2019-08-13 05:20:35 +02:00
2019-08-20 01:21:19 +02:00
SB.setUsernameContainer.style.display = "none";
SB.setUsername.style.display = "unset";
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//this is not a YouTube video page
function displayNoVideo() {
document.getElementById("loadingIndicator").innerText = chrome.i18n.getMessage("noVideoID");
}
function reportAnIssue() {
document.getElementById("issueReporterContainer").style.display = "unset";
SB.reportAnIssue.style.display = "none";
}
function addVoteMessage(message, UUID) {
let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
//remove all children
while (container.firstChild) {
container.removeChild(container.firstChild);
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
let thanksForVotingText = document.createElement("h2");
thanksForVotingText.innerText = message;
//there are already breaks there
thanksForVotingText.style.marginBottom = "0px";
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
container.appendChild(thanksForVotingText);
}
function vote(type, UUID) {
//add loading info
addVoteMessage("Loading...", UUID)
//send the vote message to the tab
chrome.runtime.sendMessage({
message: "submitVote",
type: type,
UUID: UUID
}, function(response) {
if (response != undefined) {
//see if it was a success or failure
2019-09-24 23:55:07 +02:00
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
//success (treat rate limits as a success)
addVoteMessage(chrome.i18n.getMessage("voted"), UUID)
2019-08-20 01:21:19 +02:00
} else if (response.successType == 0) {
//failure: duplicate vote
addVoteMessage(chrome.i18n.getMessage("voteFail"), UUID)
} else if (response.successType == -1) {
addVoteMessage(getErrorMessage(response.statusCode), UUID)
2019-08-20 01:21:19 +02:00
}
}
});
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
function hideDiscordButton() {
SB.config.hideDiscordLink = true;
2019-08-20 01:21:19 +02:00
SB.discordButtonContainer.style.display = "none";
2019-08-01 05:17:40 +02:00
}
2019-08-20 01:21:19 +02:00
//converts time in seconds to minutes:seconds
function getFormattedTime(seconds) {
let minutes = Math.floor(seconds / 60);
let secondsDisplay = Math.round(seconds - minutes * 60);
if (secondsDisplay < 10) {
//add a zero
secondsDisplay = "0" + secondsDisplay;
}
let formatted = minutes+ ":" + secondsDisplay;
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
return formatted;
}
2019-08-20 01:21:19 +02:00
function whitelistChannel() {
//get the channel url
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: 'getChannelURL'},
function(response) {
//get whitelisted channels
let whitelistedChannels = SB.config.whitelistedChannels;
2019-08-20 01:21:19 +02:00
if (whitelistedChannels == undefined) {
whitelistedChannels = [];
}
2019-08-20 01:21:19 +02:00
//add on this channel
whitelistedChannels.push(response.channelURL);
2019-08-20 01:21:19 +02:00
//change button
SB.whitelistChannel.style.display = "none";
SB.unwhitelistChannel.style.display = "unset";
2019-12-18 00:32:20 +01:00
SB.downloadedSponsorMessageTimes.innerText = chrome.i18n.getMessage("channelWhitelisted");
2019-08-20 01:21:19 +02:00
SB.downloadedSponsorMessageTimes.style.fontWeight = "bold";
2019-08-20 01:21:19 +02:00
//save this
SB.config.whitelistedChannels = whitelistedChannels;
2019-08-20 01:21:19 +02:00
//send a message to the client
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id, {
message: 'whitelistChange',
value: true
});
}
);
}
);
2019-08-20 01:21:19 +02:00
});
}
2019-08-20 01:21:19 +02:00
function unwhitelistChannel() {
//get the channel url
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{message: 'getChannelURL'},
function(response) {
//get whitelisted channels
let whitelistedChannels = SB.config.whitelistedChannels;
2019-08-20 01:21:19 +02:00
if (whitelistedChannels == undefined) {
whitelistedChannels = [];
}
2019-08-20 01:21:19 +02:00
//remove this channel
let index = whitelistedChannels.indexOf(response.channelURL);
whitelistedChannels.splice(index, 1);
2019-08-20 01:21:19 +02:00
//change button
SB.whitelistChannel.style.display = "unset";
SB.unwhitelistChannel.style.display = "none";
2019-08-20 01:21:19 +02:00
SB.downloadedSponsorMessageTimes.innerText = "";
SB.downloadedSponsorMessageTimes.style.fontWeight = "unset";
2019-08-20 01:21:19 +02:00
//save this
SB.config.whitelistedChannels = whitelistedChannels;
2019-08-20 01:21:19 +02:00
//send a message to the client
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id, {
message: 'whitelistChange',
value: false
});
}
);
}
);
2019-08-20 01:21:19 +02:00
});
}
/**
* Should skipping be disabled (visuals stay)
*/
function toggleSkipping(disabled) {
SB.config.disableSkipping = disabled;
let hiddenButton = SB.disableSkipping;
let shownButton = SB.enableSkipping;
if (!disabled) {
hiddenButton = SB.enableSkipping;
shownButton = SB.disableSkipping;
}
shownButton.style.display = "unset";
hiddenButton.style.display = "none";
}
2019-08-20 01:21:19 +02:00
//converts time in seconds to minutes
function getTimeInMinutes(seconds) {
let minutes = Math.floor(seconds / 60);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
return minutes;
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//converts time in seconds to seconds past the last minute
function getTimeInFormattedSeconds(seconds) {
let secondsFormatted = (seconds % 60).toFixed(3);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
if (secondsFormatted < 10) {
secondsFormatted = "0" + secondsFormatted;
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
return secondsFormatted;
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
function sendRequestToServer(type, address, callback) {
let xmlhttp = new XMLHttpRequest();
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
xmlhttp.open(type, serverAddress + address, true);
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
if (callback != undefined) {
xmlhttp.onreadystatechange = function () {
callback(xmlhttp, false);
};
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
xmlhttp.onerror = function(ev) {
callback(xmlhttp, true);
};
}
2019-08-01 05:17:40 +02:00
2019-08-20 01:21:19 +02:00
//submit this request
xmlhttp.send();
}
/**
* Converts time in hours to 5h 25.1
* If less than 1 hour, just returns minutes
*
* @param {float} seconds
* @returns {string}
*/
function getFormattedHours(minues) {
let hours = Math.floor(minues / 60);
return (hours > 0 ? hours + "h " : "") + (minues % 60).toFixed(1);
}
2019-08-01 05:17:40 +02:00
//end of function
}
2019-08-01 05:17:40 +02:00
if (chrome.tabs != undefined) {
2019-08-20 01:21:19 +02:00
//add the width restriction (because Firefox)
2019-08-23 20:23:34 +02:00
document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 325 }', 0);
2019-08-20 01:21:19 +02:00
//this means it is actually opened in the popup
runThePopup();
2019-08-07 18:04:50 +02:00
}